Собесов

khangich: cold-start в рекомендательных системах

ML / Data ScienceRecommender SystemsСложнаяSenior

Условие

В рекомендательной системе появился новый пользователь — ни кликов, ни просмотров. Как делать ему рекомендации? Тот же вопрос для нового товара.

Решение

Подход

Cold-start — частный случай отсутствующих данных. Чисто коллаборативные модели (matrix factorization, ALS) не работают: нет векторов взаимодействий. Помогают content-based признаки и hybrid модели.

Cold-start пользователя.

  1. Дефолтные рекомендации: топы по бизнес-метрике (популярность, trending, новизна). Простой бейзлайн, закрывает первую сессию.
  2. Onboarding: спросить 3-5 предпочтений (genre, brand, language) при регистрации → starting vector в embedding-пространстве.
  3. Контекстные признаки: гео, устройство, время суток, источник (UTM). Модель условной популярности P(item | context).
  4. Контент-демография: если есть возраст/пол/локация — рекомендуем на основе профиля похожих пользователей.

Cold-start товара.

  1. Контентные эмбеддинги. Эмбеддинг товара из его текстового описания (BERT/sentence-transformers) или картинки (CLIP). Близкие в эмбеддинг-пространстве — кандидаты.
  2. Hybrid retrieval. Two-tower: одна башня — user (по истории), другая — item (по контенту). Новый товар сразу имеет вектор и попадает в кандидаты.
  3. Exploration. ε-greedy / Thompson sampling: 5% выдачи отдаём новым товарам, чтобы быстро набрать сигнал.

Hybrid модели.

  • LightFM: учится user_embedding = sum(user_feature_embeddings), аналогично для items — поэтому новые юзеры/айтемы сразу имеют вектор.
  • Wide & Deep / DCN: контентные фичи через DNN + memorization через wide-часть.
from lightfm import LightFM
from lightfm.data import Dataset
 
dataset = Dataset()
dataset.fit(users, items,
            user_features=user_feats, item_features=item_feats)
 
interactions, _ = dataset.build_interactions(events)
uf = dataset.build_user_features(user_feature_rows)
itf = dataset.build_item_features(item_feature_rows)
 
model = LightFM(loss="warp")
model.fit(interactions, user_features=uf, item_features=itf, epochs=20)

Подводные камни

  1. Только popularity даёт скучные рекомендации и не персонализирует — конверсия будет плоской. Используйте как floor, а не как полное решение.
  2. Эмбеддинги новых товаров не похожи на старые. Если CLIP/BERT обучен на «общем мире», новые товары (например, NFT, новые бренды) могут лечь странно. Проверяйте на коллекции «новинок».
  3. Exploration vs exploitation: слишком много exploration портит UX (юзеры видят «случайные» товары); слишком мало — новые товары умирают без сигнала. Балансируется через bandit-стратегии.
  4. Onboarding-флоу должен быть коротким. 20 вопросов отпугнут.

Эталонный ответ

Для новых пользователей — попсы + onboarding-предпочтения + контекстные фичи. Для новых товаров — контентные эмбеддинги (текст/картинка) + two-tower hybrid retrieval + exploration через bandit. LightFM/Wide&Deep — практические инструменты для hybrid сценария.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти