Ответ
В моих проектах по рекомендательным системам мы использовали несколько подходов, комбинируя их для лучшего качества.
1. Коллаборативная фильтрация (Collaborative Filtering - CF)
Система рекомендует товары, которые понравились похожим пользователям. Мы реализовывали модель матричной факторизации (например, через библиотеку implicit или LightFM), которая хорошо работает с implicit feedback (просмотры, клики).
import implicit
from scipy.sparse import csr_matrix
# Создание sparse-матрицы взаимодействий пользователь-товар
user_item_matrix = csr_matrix((data['weight'], (data['user_id'], data['item_id'])))
# Обучение ALS модели
model = implicit.als.AlternatingLeastSquares(factors=64, iterations=20)
model.fit(user_item_matrix)
# Получение рекомендаций для пользователя
recommendations = model.recommend(user_id, user_item_matrix[user_id], N=10)
2. Контентная фильтрация (Content-Based Filtering) Рекомендации основаны на сходстве атрибутов товаров и профиля пользователя (например, история просмотров категорий). Мы использовали TF-IDF или эмбеддинги для описания товаров и косинусное сходство.
3. Гибридные системы Чаще всего мы комбинировали подходы для компенсации их слабостей (например, "холодный старт" у CF). Одна из архитектур:
- Ранжирование (Ranking): Модель
LightGBMилиCatBoostпринимала сотни признаков: выходы CF-модели, контентные признаки, исторические метрики пользователя, контекст (время, устройство). - Обучение проводилось на логах кликов/покупок.
Ключевые метрики для оценки A/B теста рекомендаций:
- CTR (Click-Through Rate)
- Conversion Rate
- Precision@K / Recall@K (офлайн-метрики на hold-out выборке)
- NDCG@K (учитывает порядок рекомендаций)
Важные аспекты:
- Диверсификация: Добавление случайного шума или механизмов для показа новых товаров.
- Актуальность: Учёт временных трендов и сезонности.
- Интерпретируемость: Возможность объяснить рекомендацию ("потому что вы смотрели X") повышает доверие пользователя.
Ответ 18+ 🔞
Ну слушай, история с рекомендашками — это вообще отдельный вид искусства, а не инженерия. Тут как в хорошем борще: если переборщишь с чем-то одним, получится пиздопроебина, а не еда. Мы обычно такими тремя китами всё держали, иначе нихуя не работает.
1. Коллаборативная фильтрация (Collaborative Filtering - CF)
Это когда система смотрит, какие товары облюбовали другие чуваки, похожие на тебя. Типа, «ваши единомышленники тоже скупали этот говняный соус, может, и вам залетит?». Мы юзали матричную факторизацию — штука мощная, особенно когда у тебя только implicit feedback, то есть не оценки, а клики и просмотры. Библиотеки implicit или LightFM — просто спасение, ёпта.
import implicit
from scipy.sparse import csr_matrix
# Создание sparse-матрицы взаимодействий пользователь-товар
user_item_matrix = csr_matrix((data['weight'], (data['user_id'], data['item_id'])))
# Обучение ALS модели
model = implicit.als.AlternatingLeastSquares(factors=64, iterations=20)
model.fit(user_item_matrix)
# Получение рекомендаций для пользователя
recommendations = model.recommend(user_id, user_item_matrix[user_id], N=10)
Но у этой модели есть одна хитрая жопа: если товар новый или пользователь только зарегился — она нихуя не посоветует, потому что данных ноль. Это называется «холодный старт», и он реально выносит мозг.
2. Контентная фильтрация (Content-Based Filtering) Тут уже умнее: система смотрит на сами товары. Ты, допустим, пять раз покупал чёрные носки с единорогами. Ну так вот, держи ещё двадцать пар чёрных носков с единорогами, пока не обносишься! Используем TF-IDF или эмбеддинги, чтобы описать товары, и потом ищем похожее через косинусное сходство. Проблема в том, что система превращается в заезженную пластинку и диверсификации — ноль ебать.
3. Гибридные системы Вот тут начинается магия, потому что по отдельности эти методы — как одноглазый слесарь: вроде и видит, но нихуя не делает. Мы их скрещивали, чтобы слабые места друг друга прикрывали. Классика жанра:
- Ранжирование (Ranking): Запускаем, например,
LightGBMилиCatBoost. Кидаем в него овердохуища признаков: что нам наваяла CF-модель, что наконтрила контентная фильтрация, всю историю пользователя (кто, когда, что тыкал), плюс контекст — время суток, устройство. Модель учится на логах, кто что в итоге купил или проигнорировал.
На что смотрим, когда тестируем эту красоту в A/B:
- CTR (Click-Through Rate) — сколько кликов на показы. Базовый показатель, но если только на него ориентироваться, можно скатиться в кликбейт.
- Conversion Rate — а вот это уже серьёзнее, сколько реальных покупок.
- Precision@K / Recall@K — офлайн-метрики, чтобы не ждать месяц A/B-теста, а прикинуть, не говно ли модель.
- NDCG@K — король метрик, если важен порядок. Потому что хуйня на первом месте и геморрой на десятом — это две большие разницы.
А ещё куча подводных камней, без которых нихуя:
- Диверсификация: Если показывать одно и то же, пользователь заскучает и уйдёт. Иногда надо подкинуть случайный товар или новинку, даже если модель не уверена. Иначе получится эхо-камера.
- Актуальность: Тренды меняются быстрее, чем ты успеваешь сказать «ёперный театр». Летом — велосипеды, зимой — лыжи. Модель должна это чувствовать, а не рекомендовать санки в июле.
- Интерпретируемость: Это вообще святое. Пользователь должен понимать, почему ему это предложили. Фраза «потому что вы смотрели вот это» вызывает в разы больше доверия, чем молчаливая выдача какого-то хуя с горы. Доверия ебать ноль — и пользователь просто забивает.