Как решить проблему частого рекомендования популярных товаров в ритейле
Что проверяют
Понимаете ли вы, откуда в рекомендациях берётся смещение в сторону популярного и как его измерить, прежде чем лечить. Следом обычно спрашивают, как доказать бизнесу, что новая модель лучше, если по офлайн-метрикам она проигрывает простому бейзлайну.
Как отвечать
Сначала причины. Популярные товары доминируют в логах, модели учатся на этих логах, а показанное в рекомендациях снова покупают. Получается петля обратной связи. Добавьте специфику ритейла: хлеб и молоко есть почти в каждом чеке, и сырые счётчики совместных покупок рекомендуют их ко всему.
Инструменты:
- нормализация совместной встречаемости: вместо счётчиков брать lift, PMI или косинусную близость, которые учитывают популярность товара;
- сэмплирование негативов с учётом популярности: популярный товар чаще попадает в негативы, и модель перестаёт получать награду за очевидное;
- переранжирование: MMR или калиброванные рекомендации, когда доля категорий в выдаче соответствует истории пользователя, плюс квота на длинный хвост;
- разделение сценариев: блок «купить снова» для регулярных покупок отдельно, блок открытий отдельно;
- исследование: небольшая доля показов через бандиты (epsilon-greedy, Thompson sampling), чтобы новые товары набрали данные.
Метрики: помимо NDCG@K и Recall@K смотреть покрытие каталога, новизну, разнообразие внутри выдачи и индекс Джини по показам. Валидацию разбивать только по времени. Итог решает A/B-тест по выручке, среднему чеку и доле продаж из хвоста, с защитными метриками по конверсии.
Где спотыкаются
Убирают популярные товары из выдачи совсем. Конверсия падает, потому что популярное часто действительно нужно: задача в балансе, а не в запрете.
Оценивают рекомендации через accuracy или F1 на случайном разбиении. Утечка будущего завышает качество, а сами метрики не видят порядка в выдаче.
Не сравнивают с бейзлайном «топ популярного». Его трудно обыграть по точности, и без этого сравнения непонятно, дала ли сложная модель хоть что-то.