Ответ
В моей практике построения рекомендательных систем я применял следующие основные подходы:
1. Коллаборативная фильтрация (Collaborative Filtering, CF): Рекомендации строятся на основе исторических взаимодействий пользователей с объектами (просмотры, покупки, оценки).
- User-Based CF: «Найди пользователей, похожих на тебя, и порекомендуй то, что понравилось им». Уязвима к проблеме масштабируемости.
- Item-Based CF: «Людям, которым понравился этот товар, также нравились вот эти». Более стабильна и широко применяется (например, в Amazon).
# Упрощенный пример расчета схожести товаров (косинусная мера) from sklearn.metrics.pairwise import cosine_similarity item_similarity_matrix = cosine_similarity(user_item_matrix.T) # Транспонируем для item-item
2. Контентная фильтрация (Content-Based Filtering): Рекомендации основаны на характеристиках (фичах) самих объектов и профиле предпочтений пользователя.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
# Создаем профиль товаров на основе текстовых описаний
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(df['description'])
# Находим похожие товары для товара с индексом 0
cosine_sim = linear_kernel(tfidf_matrix[0:1], tfidf_matrix).flatten()
3. Матричная факторизация (Matrix Factorization):
Сводит задачу к разложению матрицы взаимодействий R в произведение матриц пользовательских (P) и товарных (Q) латентных факторов: R ≈ P * Q.T.
- SVD (Singular Value Decomposition), ALS (Alternating Least Squares): Классические методы.
- Пример с библиотекой
surprise:from surprise import SVD, Dataset, Reader reader = Reader(rating_scale=(1, 5)) data = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader) algo = SVD(n_factors=100, n_epochs=20, lr_all=0.005, reg_all=0.02) algo.fit(data.build_full_trainset())
4. Гибридные модели: Комбинируют несколько подходов для компенсации их слабых сторон (например, CF + контентная фильтрация для решения проблемы холодного старта).
5. Нейросетевые архитектуры:
- Two-Tower (Dual-Encoder): Отдельные нейросети для пользователей и товаров, обучаемые на задаче поиска похожих пар.
- Wide & Deep (Google): Широкая часть для запоминания правил (например, co-visitation), глубокая — для обобщения.
- Sequence-Based (BERT4Rec, SASRec): Используют трансформеры для учета последовательности действий пользователя.
В продакшене мы часто начинаем с item-based CF или матричной факторизации как с надежного бейзлайна, а затем экспериментируем с гибридными и нейросетевыми подходами для увеличения точности.