← Назад к вопросам

Как оценить эффективность рекомендательной системы?

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 популярность

Это позволит создать систему, которая работает как на бумаге, так и в реальности.