← Назад к вопросам
Как оценить эффективность рекомендательной системы?
1.8 Middle🔥 191 комментариев
#Аналитика и метрики
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Оценка эффективности рекомендательной системы
Основные типы метрик
Для рекомендательной системы нужны метрики на разных уровнях: качество рекомендаций, бизнес-результаты и пользовательское поведение.
1. Метрики качества рекомендаций (Offline)
Precision at K
Полнота найденных релевантных элементов из топ-K рекомендаций
Precision@5 = (кол-во релевантных в топ-5) / 5
Пример:
Рекомендации: [Book1, Book2, Book3, Book4, Book5]
Релевантные: [Book1, Book5]
Precision@5 = 2/5 = 0.4 (40%)
Recall at K
Доля найденных релевантных элементов из всех релевантных
Recall@5 = (кол-во релевантных в топ-5) / (всего релевантных)
Пример:
Дано всего релевантных книг: [Book1, Book5, Book10, Book12]
Рекомендации топ-5: [Book1, Book5]
Recall@5 = 2/4 = 0.5 (50%)
Mean Average Precision (MAP)
Учитывает позицию релевантных элементов в ранжировании
AP = (1/min(m, k)) * sum(Precision at i * rel(i))
Пример:
Топ-5 рекомендаций: [Book1(рел), Book2, Book3(рел), Book4, Book5]
Precision at 1 = 1/1 = 1.0
Precision at 3 = 2/3 = 0.67
AP = (1/2) * (1.0 + 0.67) = 0.835
NDCG (Normalized Discounted Cumulative Gain)
Учитывает релевантность и позицию результатов
DCG at k = rel(1) + rel(2)/log2(2) + rel(3)/log2(3) + ...
Пример:
Топ-5: [1, 0, 1, 0, 1]
DCG@5 = 1 + 0/1 + 1/1.58 + 0/2 + 1/2.32 = 2.06
IDCG@5 = 1 + 1/1 + 1/1.58 = 2.63
NDCG@5 = 2.06 / 2.63 = 0.78
Hit Rate
Доля пользователей, которым система рекомендовала релевантный элемент
Hit Rate = (пользователи с хотя бы одним хитом) / (всего пользователей)
Пример:
1000 пользователей, система рекомендовала топ-10 каждому
750 пользователей кликнули на хотя бы один элемент
Hit Rate = 750 / 1000 = 0.75 (75%)
2. Метрики разнообразия
Diversity
# Насколько различны рекомендации для одного пользователя?
def calculate_diversity(recommendations):
n = len(recommendations)
similarity_sum = 0
for i in range(n):
for j in range(i + 1, n):
similarity_sum += cosine_similarity(recommendations[i],
recommendations[j])
avg_similarity = similarity_sum / (n * (n - 1) / 2)
diversity = 1 - avg_similarity
return diversity
# diversity = 0.9 (разные рекомендации - хорошо)
# diversity = 0.1 (похожие рекомендации - плохо)
Coverage
Доля каталога, который система может рекомендовать
Coverage = (уникальные рекомендуемые товары) / (всего товаров в каталоге)
Пример:
Всего фильмов: 10000
Фильмы, которые рекомендовались: 7500
Coverage = 7500 / 10000 = 0.75 (75%)
3. Бизнес-метрики (Online)
Click-through Rate (CTR)
CTR = (кол-во кликов на рекомендации) / (кол-во показов)
Пример:
Показали 10000 рекомендаций
На них кликнули 500 раз
CTR = 500 / 10000 = 0.05 (5%)
Conversion Rate
Какой % пользователей совершили покупку после клика
Conversion = (кол-во покупок) / (кол-во кликов)
Пример:
Кликов на рекомендации: 500
Покупок совершено: 45
Conversion = 45 / 500 = 0.09 (9%)
Revenue per Recommendation
Средний доход от одной рекомендации
Revenue per Rec = (всего доход) / (кол-во показов)
Пример:
Показов: 10000
Доход: 5000 долларов
Revenue per Rec = 5000 / 10000 = 0.50 долларов
Return on Investment (ROI)
Сравнение затрат на систему с доходом
ROI = (доход - стоимость системы) / стоимость системы
Пример:
Доход в месяц: 100000 долларов
Стоимость системы: 20000 долларов
ROI = (100000 - 20000) / 20000 = 4.0 (400%)
4. A/B тестирование
import numpy as np
from scipy import stats
# Группа A: старая система
old_ctr = [0.04, 0.045, 0.042, 0.043, 0.041]
old_mean = np.mean(old_ctr)
# Группа B: новая система
new_ctr = [0.051, 0.055, 0.053, 0.052, 0.054]
new_mean = np.mean(new_ctr)
# Статистический тест
t_stat, p_value = stats.ttest_ind(new_ctr, old_ctr)
print(f"Старая система: {old_mean:.3f}")
print(f"Новая система: {new_mean:.3f}")
print(f"Улучшение: {((new_mean - old_mean) / old_mean * 100):.1f}%")
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
print("Результат статистически значим!")
5. Пример интегрированной системы мониторинга
CREATE TABLE recommendation_events (
event_id UUID PRIMARY KEY,
user_id INTEGER,
recommended_items ARRAY,
clicked_item_id INTEGER,
purchased BOOLEAN,
purchase_amount DECIMAL,
timestamp TIMESTAMPTZ
);
SELECT
DATE(timestamp) AS date,
COUNT(*) AS total_recommendations,
COUNT(CASE WHEN clicked_item_id IS NOT NULL THEN 1 END)::FLOAT / COUNT(*) AS ctr,
COUNT(CASE WHEN purchased THEN 1 END)::FLOAT / COUNT(CASE WHEN clicked_item_id IS NOT NULL THEN 1 END) AS conversion_rate,
SUM(CASE WHEN purchased THEN purchase_amount ELSE 0 END) AS total_revenue
FROM recommendation_events
GROUP BY DATE(timestamp)
ORDER BY date DESC;
6. Матрица выбора метрик
Фаза разработки | Какие метрики смотреть
Proto/MVP | Precision, Recall, NDCG
Альфа (A/B test) | CTR, Conversion, Revenue
Бета (small audience) | Hit Rate, Diversity, Coverage
Продакшен | ROI, Revenue per User, CTR
7. Антипаттерны
Ошибка 1: Смотрите только offline метрики
-> Может быть низкий реальный CTR
Ошибка 2: Оптимизируете только Precision
-> Coverage упадет, люди увидят одни рекомендации
Ошибка 3: Игнорируете diversity
-> Система рекомендует только популярные товары
Ошибка 4: Не делаете A/B тесты
-> Не знаете, принесет ли обновление реальный прирост
Вывод
Хорошая оценка требует комбинации:
- Offline метрик: Precision, Recall, NDCG (быстрая итерация)
- Online метрик: CTR, Conversion, Revenue (реальная ценность)
- A/B тестов: убедиться в значимости
- Баланса: качество vs разнообразие vs популярность
Это позволит создать систему, которая работает как на бумаге, так и в реальности.