Как решать задачу ранжирования товаров
Что проверяют
Знаете ли вы, что ранжирование это отдельный класс задач со своими функциями потерь и метриками, а не обычная классификация. Следом спрашивают, как бороться со смещением по позиции и как понять, что новая модель лучше старой.
Как отвечать
Начните с постановки: что ранжируем (выдачу по запросу, каталог категории, рекомендации) и что считаем успехом: клик, добавление в корзину, покупку, выручку. Цель обычно составная, с весами для разных событий.
Дальше каркас:
- две стадии: отбор кандидатов дешёвыми методами (двухбашенная модель эмбеддингов с ANN-поиском, популярное, совместные покупки), затем точное ранжирование сотен кандидатов тяжёлой моделью;
- модель: learning to rank. Подходы бывают поточечные, попарные и списочные, на практике чаще всего берут градиентный бустинг:
lambdarankв LightGBM,YetiRankилиPairLogitв CatBoost,rank:ndcgв XGBoost; - признаки: товар (цена, рейтинг, наличие, свежесть), пользователь (история, сегмент), пара «пользователь и товар» (сходство с просмотренным), контекст (устройство, время);
- смещение по позиции: верхние позиции собирают клики просто потому, что они сверху. Помогают поправка на вероятность просмотра позиции и небольшая доля рандомизированной выдачи для оценки этой вероятности;
- оценка: офлайн NDCG@k и MRR на отложенной по времени выборке, для кандидатов Recall@k. Решение о запуске принимает A/B-тест по конверсии и выручке на сессию.
Отдельно назовите холодный старт: новые товары без истории получают признаки из описания и категории, иначе модель их никогда не покажет.
Где спотыкаются
Предлагают кластеризацию или классификацию вместо ранжирования. Порядок внутри выдачи такие модели напрямую не оптимизируют.
Делят выборку случайно, а не по времени. Признаки вроде «популярность за неделю» подсматривают в будущее, и офлайн-метрика растёт без пользы на проде.
Оптимизируют только CTR. Модель быстро учится показывать дешёвое и кликабельное, а выручка и доля возвратов при этом ухудшаются.