Как производятся рекомендации при холодном старте

Ответ

В рекомендательной системе, над которой я работал, проблема холодного старта решалась комбинацией нескольких не-Personalized подходов, пока не накапливалось достаточно данных для коллаборативной фильтрации.

Основные стратегии для нового пользователя:

  1. Рекомендация самых популярных товаров (Most Popular): Самый надежный и простой метод. Мы ранжировали товары по глобальному количеству покупок или просмотров за последние N дней и показывали топ.

    # Пример: расчет популярных товаров за последнюю неделю
    import pandas as pd
    # df_interactions содержит колонки: 'item_id', 'user_id', 'event_type', 'timestamp'
    df_recent = df_interactions[df_interactions['timestamp'] > (now - pd.Timedelta(days=7))]
    popular_items = (df_recent[df_recent['event_type'] == 'purchase']
                     .groupby('item_id').size()
                     .sort_values(ascending=False)
                     .head(20))
    # popular_items - это Series с item_id и количеством покупок
  2. Контентно-демографические рекомендации: Если при регистрации пользователь указал демографические данные (например, пол, город), мы рекомендовали популярные товары в его сегменте. Например: «Самые покупаемые кроссовки среди мужчин 25-35 лет в Москве».

  3. Рекомендации по контексту сессии (Session-based): Для пользователя, который уже что-то смотрит, но еще не идентифицирован, использовались простые правила:

    • „Похожие товары“: На основе заранее рассчитанных эмбеддингов товаров (например, через Item2Vec на исторических сессиях) или по общим тегам/категориям.
    • „Часто покупают вместе“: Правила ассоциаций (Apriori), рассчитанные на исторических данных по корзинам.
  4. Диверсификация (Exploration): Чтобы быстрее собрать данные о предпочтениях, небольшую долю рекомендаций (например, 1-2 слота из 10) отдавали под случайные товары из перспективных новых или низкорейтинговых категорий.

Переход к персонализации: Как только у пользователя фиксировалось более 3-5 явных взаимодействий (покупка, добавление в избранное, детальный просмотр), система постепенно увеличивала вес предсказаний коллаборативной фильтрации (Implicit ALS) и гибридной модели, снижая вес глобального топа. Полный переход на персонализированные рекомендации происходил после 10+ взаимодействий.

Ответ 18+ 🔞

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

Вот смотри, как мы эту проблему решали, пока данных о человеке — ноль ебать.

Чем кормили свежего юзера, пока он не обжился:

  1. Топ самых ушатанных товаров (Most Popular). Самый беспроигрышный вариант, ебать мои старые костыли. Берёшь всё, что народ скупал как горячие пирожки за последнюю неделю, и суёшь этому новичку. Логика проще пареной репы: раз все брали — значит, норм штука, и нашему челу, скорее всего, зайдёт. Не промахнёшься.

    # Считаем, что за неделю народ хавал больше всего
    import pandas as pd
    # df_interactions — тут всё: 'item_id', 'user_id', 'event_type', 'timestamp'
    df_recent = df_interactions[df_interactions['timestamp'] > (now - pd.Timedelta(days=7))]
    popular_items = (df_recent[df_recent['event_type'] == 'purchase']
                     .groupby('item_id').size()
                     .sort_values(ascending=False)
                     .head(20))
    # В popular_items теперь item_id и сколько раз их хапнули
  2. Подгон под статичные данные. Если чел при регистрации не поленился и указал пол, город или возраст — уже полегче. Тогда не просто «самое популярное», а «самое популярное среди таких же пидоров, как ты». Ну, типа: «Мужики 30 лет из Питера чаще всего берут вот этот набор для выживания в офисе». Уже теплее, ёпта.

  3. Цепляешься за то, что он уже тыкает в сессии. Ага, он ещё не залогинился, но уже что-то смотрит. Вот тут включается хитрая жопа. Смотришь на товар, который он пялит, и быстренько подсовываешь:

    • Похожие штуки: По заранее посчитанным эмбеддингам или просто по общим категориям — «смотри, вот такая же мартышлюшка, но с перламутровыми пуговицами».
    • Частые спутники: Правила типа «кто купил этот чайник, тот часто берёт и эту сраную прихватку». Старо как мир, но работает.
  4. Разведка боем (Exploration). А вот это, чувак, ключевой момент, чтобы не застрять в болоте. Если всегда показывать только топ, то как узнать, что наш новый пользователь — фанат редких японских удобрений для бонсая? Поэтому специально 1-2 слота из десяти отдавались под какую-нибудь рандомную дичь из новых или непопулярных категорий. Рискованно, но без этого нихуя не узнаешь.

А потом магия случается. Как только пользователь делает больше 3-5 осмысленных действий (купил, лайкнул, в корзину кинул), система потихоньку начинает понимать, что он за зверь. Вес у этого общего топа падает, а на сцену выходят тяжёлые артиллеристы: коллаборативная фильтрация (Implicit ALS) и гибридные модели. И вот когда у человека уже 10+ взаимодействий, он получает свои персональные рекомендации — отточенные, острые, блядь, как бритва. В этот момент он уже не «новый пользователь», а полноценный член стаи, и система ему подбирает штуки так, будто она у него в голове побывала.