Популярность и эвристики как baseline

Урок показывает, почему простые рекомендации по популярности — обязательная точка отсчёта, и какие эвристики делают их умнее.

Baseline — это самая простая модель, относительно которой измеряют пользу всех сложных алгоритмов. В рекомендациях базовым обычно служит топ по популярности.

Зачем нужен baseline

Прежде чем строить матричное разложение или нейросеть, надо ответить на вопрос: а насколько вообще трудна задача? Может, простой топ популярного уже даёт 90% качества, и сложная модель добавит лишь пару процентов ценой огромных усилий. Baseline даёт честную точку отсчёта: если ваша «умная» модель не бьёт популярность, что-то не так.

Чистая популярность

Берём счётчик взаимодействий по каждому товару и сортируем. Это работает мгновенно, не требует данных о пользователе и всегда есть что показать новичку.

from collections import Counter

events = ["A","B","A","C","A","B","D","A","B","C","A","E"]
pop = Counter(events)
print("Топ-3 популярных:")
for item, c in pop.most_common(3):
    print(f"  {item}: {c}")

Вывод:

Топ-3 популярных:
  A: 5
  B: 3
  C: 2

Эвристики поверх популярности

Чистый топ имеет недостатки: он «застывает» (старые хиты вечно наверху) и не учитывает свежесть. Поэтому популярность часто комбинируют с эвристиками:

  • Свежесть. Учитывать только взаимодействия за последние N дней — так в топ попадают новые тренды.
  • Сглаживание малых чисел. Товар с одной покупкой и 100% «конверсией» не должен обгонять товар с тысячей покупок. Помогает байесовское сглаживание (добавить «виртуальные» средние голоса).
  • Контекст. Топ можно считать не глобально, а по сегменту: город, устройство, категория.
# байесовское сглаживание рейтинга
def smoothed(sum_ratings, n, global_mean=3.5, m=10):
    # m — сила «приора», тянет малые выборки к среднему
    return (sum_ratings + m * global_mean) / (n + m)

# товар с 1 отличной оценкой против товара с 50 хорошими
print("1 оценка 5.0 ->", round(smoothed(5, 1), 2))
print("50 оценок (ср. 4.2) ->", round(smoothed(4.2 * 50, 50), 2))

Вывод:

1 оценка 5.0 -> 3.64
50 оценок (ср. 4.2) -> 4.08

Видно, как сглаживание справедливо «прижимает» товар с единственной оценкой к среднему, а товар с большой выборкой почти не трогает.

Как работает под капотом

Популярностный baseline почти бесплатен: один проход по логам и сортировка. В продакшене его часто оставляют как фолбэк — когда персональная модель не успевает или у пользователя нет истории, показывают сглаженный топ нужного сегмента.

Частые ошибки

  • Пропустить baseline. Без него вы не знаете, окупается ли сложная модель.
  • Сравнивать сырые средние без сглаживания. Малые выборки дают обманчиво высокие средние.
  • Считать популярность вечной. Без окна свежести топ застывает и перестаёт ловить тренды.

Итоги

  • Топ по популярности — обязательный baseline и надёжный фолбэк.
  • Сложная модель обязана измеримо превосходить популярность.
  • Свежесть, сглаживание и сегментация делают популярность заметно умнее.
  • Байесовское сглаживание защищает от обманчивых средних по малым выборкам.
Проверьте себя
1. Зачем в рекомендациях обязателен baseline по популярности?
AОн всегда точнее любых моделей
BЧтобы измерять, окупается ли сложная модель относительно простой
CОн не требует кода
DЧтобы заменить персонализацию навсегда
2. Зачем нужно байесовское сглаживание рейтинга?
AЧтобы ускорить сортировку
BЧтобы товар с одной случайной оценкой не обгонял товар с большой статистикой
CЧтобы удалить все нули
DЧтобы перевести оценки в проценты