Метрики ранжирования
NDCG, MAP, MRR, Precision@K, Recall@K, Hit Rate — как оценивать качество рекомендаций.
Метрики ранжирования — как измерить качество рекомендаций
Загрузка интерактивного виджета...
В рекомендациях важен не просто ответ «релевантно/нет», а порядок: лучшие айтемы должны быть наверху. Пользователь смотрит первые 5-10 позиций — если там мусор, качество модели не имеет значения.
Precision@K и Recall@K
Precision@K — какая доля из K рекомендованных айтемов релевантна. Recall@K — какую долю всех релевантных айтемов мы нашли в топ-K. Просто, но не учитывает позицию: релевантный айтем на 1-м и на 10-м месте вносят одинаковый вклад.
Из K рекомендаций — сколько угадали
NDCG — учитывает позицию

NDCG (Normalized Discounted Cumulative Gain) — золотой стандарт метрик ранжирования. Идея: релевантный айтем на 1-й позиции ценнее, чем на 10-й. «Скидка» (discount) растёт с позицией — далёкие результаты вносят меньший вклад.
IDCG — идеальный DCG (если бы ранжирование было идеальным). NDCG от 0 до 1
На собесе: NDCG vs MAP
MAP и MRR
MAP (Mean Average Precision) — среднее AP по всем пользователям. AP — площадь под Precision-Recall кривой для одного запроса. MRR (Mean Reciprocal Rank) — среднее 1/позиция_первого_релевантного. Полезна, когда нужен ровно один правильный ответ (поиск).
Первый релевантный на 1-м месте → 1.0, на 3-м → 0.33
Hit Rate и Coverage
- Hit Rate@K — доля пользователей, получивших хотя бы один релевантный айтем в топ-K
- Coverage — какую долю каталога модель вообще рекомендует (10% = «пузырь»)
- Novelty — насколько рекомендации неожиданные (не только популярное)
- Diversity — насколько рекомендации в одном списке различаются между собой
import numpy as np
def ndcg_at_k(relevance, k):
rel = np.array(relevance[:k])
dcg = np.sum(rel / np.log2(np.arange(2, k + 2)))
ideal = np.sum(sorted(rel, reverse=True) / np.log2(np.arange(2, k + 2)))
return dcg / ideal if ideal > 0 else 0.0Офлайн vs онлайн метрики
🎯 Суть для собеса