Popularity baseline

Самая простая модель: рекомендуем всем одни и те же глобально самые популярные фильмы, исключая уже просмотренные.

Загружаем данные

Теория простым языком

Popularity — это «витрина с хитами»: балл айтема один на всех и не зависит от того, кому мы рекомендуем. Персонализации в модели нет — но итоговые списки у разных людей всё-таки различаются, потому что из общей витрины вычитается личная история. С этого baseline начинают, чтобы было с чем сравнивать.

Что нам вообще дано

Прежде чем что-то рекомендовать, договоримся о словах. Их всего три, и они будут встречаться во всех алгоритмах.

Пользователь — тот, кому мы советуем (в нашем датасете — зритель фильмов).
Айтем — то, что мы советуем (у нас — фильм). Слово «айтем» удобно, потому что это может быть товар, песня, статья — что угодно.
Взаимодействие — факт, что пользователь как-то соприкоснулся с айтемом: посмотрел, оценил, купил. У нас взаимодействие — это оценка фильма.

Все взаимодействия удобно представить большой таблицей: строки — пользователи, столбцы — фильмы, в клетке стоит оценка (или пусто, если человек фильм не видел). Такую таблицу называют так:

Матрица взаимодействий — таблица «пользователи × айтемы», где в клетках — оценки или отметки о взаимодействии. Почти вся она пустая: каждый видел лишь крошечную часть каталога.

Идея алгоритма

Popularity не смотрит, кто именно перед ним. Он смотрит только на столбцы матрицы и считает, у скольких людей вообще было взаимодействие с каждым фильмом. Чем больше людей — тем «популярнее» фильм. Дальше берём самые популярные и показываем всем подряд.

▸Зачем нужен popularity baseline
БылоСразу хочется строить персональную модель.
ПроблемаНепонятно, даёт ли она пользу сверх простой популярности — не с чем сравнить.
ИдеяРекомендовать самые популярные айтемы, убрав уже виденные.
Стало лучшеПоявился честный sanity-check baseline: если сложная модель не бьёт popularity, её польза не доказана.
Осталось слабымНоль персонализации; длинный хвост почти не получает шанса.
ДальшеПерсонализация: content-based и collaborative filtering.

Как считается, по шагам

1. Для каждого фильма складываем, сколько пользователей с ним взаимодействовали — получаем «балл популярности».
2. Сортируем фильмы по этому баллу от большего к меньшему.
3. Конкретному человеку показываем верхние K фильмов, выкидывая те, что он уже видел. Последний шаг — единственное место, где появляется хоть что-то про конкретного человека, и политика этого эксперимента, а не свойство модели: в музыке или в продуктовой корзине повтор — норма, и там этот фильтр выбрасывал бы правильный ответ.

Пример. «Побег из Шоушенка» отметили 315 человек, «Терминатор 2» — 221, значит Шоушенк стоит выше — и так для всех пользователей: порядок общий. А вот видимый топ-10 у двух людей совпадёт только если они посмотрели одно и то же: у пользователя, который Шоушенк уже видел, первым окажется следующий по популярности фильм. Покрути user_id в песочнице выше — выдача меняется именно поэтому, а не потому, что модель кого-то узнала.
Псевдокод
для каждого айтема i:
    score[i] = сколько пользователей взаимодействовали с i
ranking = айтемы, отсортированные по score (убыв.)

recommend(пользователь u, K):
    вернуть первые K из ranking, которые u ещё не видел
▸Формула / строгое определение

Балл популярности айтема ii — число пользователей, у которых было с ним взаимодействие:

score(i)=∑u1 [ rui>0 ]\text{score}(i) = \sum_{u} \mathbf{1}\,[\,r_{ui} > 0\,]

где 1[⋅]\mathbf{1}[\cdot] равно 1, если условие верно, иначе 0. Это «по числу взаимодействий». Более аккуратный вариант — взвешенный рейтинг с байесовским сглаживанием (как у IMDb), чтобы фильм с двумя оценками по 5 не обгонял фильм с тысячей оценок по 4.3:

s^(i)=vivi+m rˉi+mvi+m C\hat{s}(i) = \frac{v_i}{v_i + m}\,\bar{r}_i + \frac{m}{v_i + m}\,C

здесь viv_i — число оценок фильма, rˉi\bar{r}_i — его средняя оценка, CC — средняя оценка по всему каталогу, mm — «доверительный порог» (сколько оценок нужно, чтобы верить средней).

Зачем он нужен, если такой простой

Это точка отсчёта. Персональная модель по точности обычно должна обыгрывать popularity — иначе её сложность по этой метрике не оправдана. Но это не абсолют: если цель — новизна, разнообразие или охват длинного хвоста, сложная модель может проиграть popularity по одной accuracy-метрике и всё равно быть полезной. Такую отправную модель называют так:

Baseline (база, точка отсчёта) — нарочно простая модель, с которой сравнивают все остальные. Если сложная модель не лучше базы по целевой метрике — она не оправдана.

Важно: «популярно» ≠ «понравилось»

Наш popularity считает число взаимодействий. Но фильм могли часто смотреть и часто ругать. Популярность бывает разной, и выбор меняет рекомендации: по числу взаимодействий; по числу положительных оценок; по средней оценке с байесовским сглаживанием; по недавней популярности (тренд за неделю). Мы берём самый простой вариант — это честный baseline, а не «лучший» способ.

Сильные стороны

  • Очень просто и быстро, не требует почти ничего.
  • Работает для нового пользователя, о котором мы ничего не знаем (показать хиты — разумно).
  • Честная планка качества для всех остальных моделей.

Слабые стороны

  • Ноль персонализации: фанату ужасов и любителю мультиков — одно и то же.
  • Усиливает «эффект богатые богатеют»: популярное показывается → становится ещё популярнее.
  • Бесполезно для нишевых вкусов и для новых фильмов, которые ещё никто не смотрел.

⚠️ Что может пойти не так

  • Считаем число оценок, а не «понравилось»: нужен ли порог, средняя оценка или сглаживание — зависит от задачи.
  • Порог релевантности меняет задачу, а не только строгость: на всех таргетах popularity проигрывает MF, а при пороге «понравилось» — обходит его. Замер по порогам и связь популярности с оценкой — на странице «Как устроен эксперимент».
  • Петля обратной связи: показываем популярное → его смотрят больше → оно ещё популярнее, а нишевое не получает шанса.
  • Не реагирует на свежесть: вчерашние хиты могли уже надоесть; часто нужна оконная популярность с затуханием.

🧠 Проверь себя: Почему при пороге «релевантно = понравилось» popularity неожиданно силён?

Где встречается в жизни

«В тренде», «Топ недели», «Сейчас смотрят» — это всё popularity. Часто им заполняют ленту новому пользователю, пока о нём ещё нечего знать (это называют проблемой холодного старта — к ней вернёмся в других алгоритмах).

Что дальше

До финальной сборки не хватает ещё 12 модулей по этому пути.

Порядок здесь — рекомендация из карты курса, ничего не блокируется. Отметка «прочитано» хранится только в этом браузере.

Источники