Что такое релевантная рекомендация
Что проверяют
Умеете ли вы превратить расплывчатое «пользователю понравилось» в измеримую величину. За вопросом стоит проверка метрик ранжирования и понимания, что релевантность это свойство списка на конкретной позиции, а не отдельного предмета.
Как отвечать
Релевантной называют рекомендацию, которая попадает в интерес пользователя здесь и сейчас: согласована с историей взаимодействий, с контекстом (устройство, время, текущая сессия) и доступна к потреблению. Сигнал релевантности бывает явный (оценка) и неявный (клик, дочитывание, покупка, возврат к товару).
Меряют на срезе из верхних k элементов: precision@k и recall@k для бинарной релевантности, MAP и MRR когда важна позиция первого попадания, NDCG когда у релевантности есть градация и позиция взвешивается логарифмом.
import numpy as np
def ndcg_at_k(rel, k):
rel = np.asarray(rel, dtype=float)[:k]
disc = 1 / np.log2(np.arange(2, rel.size + 2))
ideal = (np.sort(rel)[::-1] * disc).sum()
return float((rel * disc).sum() / ideal) if ideal else 0.0Офлайн-метрика отбирает гипотезы, решение принимает онлайн-эксперимент по продуктовой цели. Рядом держат метрики за пределами точности: покрытие каталога, новизну, разнообразие выдачи, иначе система схлопывается в вечный показ хитов.
Где спотыкаются
Меряют ошибку предсказанного рейтинга и называют это релевантностью. Пользователь видит список, а не число: важен порядок верхних строк, и модель с меньшей ошибкой регулярно проигрывает по NDCG.
Делят выборку случайно вместо разделения по времени. Модель учится на взаимодействиях из будущего, офлайн выглядит блестяще, в проде результат разваливается.
Забывают про базовое решение и про смещения. Без сравнения с показом популярного не видно, что модель вообще что-то добавила, а без поправки на позиционное смещение клик по первой строке засчитывается как релевантность, хотя это просто верхняя позиция.