← к модулям

Popularity baseline

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

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

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

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

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

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

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

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

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

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

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

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

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

    Пример. «Побег из Шоушенка» отметили 315 человек, «Терминатор 2» — 221. Значит, в списке Шоушенк будет выше. И так для всех — список один на всех.
    Псевдокод
    для каждого айтема 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+mrˉi+mvi+mC\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 bias в самой оценке: популярные фильмы чаще получают высокие оценки, поэтому при пороге «понравилось» popularity выглядит сильнее, чем кажется (см. «Как устроен эксперимент»).
    • Петля обратной связи: показываем популярное → его смотрят больше → оно ещё популярнее, а нишевое не получает шанса.
    • Не реагирует на свежесть: вчерашние хиты могли уже надоесть; часто нужна оконная популярность с затуханием.

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

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

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