Как реализовать item-based подход в рекомендательных системах
Что проверяют
Можете ли вы довести идею «похожие товары» до работающего кода на реальных объёмах, где матрица разреженная, а товаров сотни тысяч. Следом обычно просят сравнить подход с user-based и объяснить, как оценивать качество.
Как отвечать
Item-based коллаборативная фильтрация считает похожесть товаров по тому, какие пользователи с ними взаимодействовали. Свойства товаров не участвуют, это не контентный подход.
Каркас реализации:
- матрица взаимодействий: пользователи по строкам, товары по столбцам,
scipy.sparse.csr_matrix. Неявные сигналы (клики, покупки) часто бинаризуют или взвешивают через BM25 либо TF-IDF; - похожесть: косинус между столбцами. Нормируете столбцы по L2 и считаете
X.T @ Xв разреженном виде. Для явных оценок берут adjusted cosine: из оценок вычитается среднее пользователя; - усечение: для каждого товара храните только top-k соседей, обычно десятки. Полная матрица товар на товар при миллионе позиций в память не поместится;
- штраф за малую поддержку: сходство по двум общим пользователям шумное, его умножают на
n / (n + λ), гдеnчисло общих пользователей; - скоринг: для пользователя суммируете сходства кандидата с товарами из его истории, взвешенные силой взаимодействия, и исключаете уже просмотренное.
Сходство считается офлайн, онлайн остаётся выборка соседей, а рекомендацию легко объяснить: «потому что вы смотрели X». Готовые реализации есть в библиотеке implicit (CosineRecommender, BM25Recommender), для поиска соседей на больших каталогах подойдут Faiss или hnswlib.
Оценка: разбиение по времени, а не случайное, метрики ранжирования Recall@k, NDCG@k, покрытие каталога. Обязателен бейзлайн по популярности, его часто трудно обогнать.
Где спотыкаются
Оценивают через RMSE. Для рекомендаций важно, попал ли нужный товар в первые k позиций, а точность предсказания оценки с этим связана слабо.
Строят плотную матрицу через cosine_similarity на всём каталоге. На реальных данных кончается память.
Не думают о холодном старте. У нового товара нет взаимодействий, и без запасного варианта на основе контента или популярности он не попадёт в рекомендации никогда.