Ответ
В моей практике построения рекомендательных систем я применял следующие основные подходы:
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 или матричной факторизации как с надежного бейзлайна, а затем экспериментируем с гибридными и нейросетевыми подходами для увеличения точности.
Ответ 18+ 🔞
Да ты послушай, какая тема интересная! Я тут, значит, в своей практике с рекомендательными системами намучился, овердохуища подходов перепробовал. Сейчас тебе разложу по полочкам, как это всё работает, без академического бреда.
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): Вот это уже магия покруче. Представь огромную таблицу, где строки — пользователи, столбцы — товары, а значения — оценки. Так вот, мы берём и разбиваем эту громадину на две маленькие и удобные матрички: одну про скрытые интересы пользователей, другую — про скрытые признаки товаров. Получается элегантно и мощно.
- 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. Гибридные модели: Ну а тут, ясное дело, берём всё лучшее и смешиваем. Коллаборативная фильтрация тупит на новых товарах? Подмешиваем контентную фильтрацию. Получается этакий франкенштейн, но зато эффективный, ёбааать.
5. Нейросетевые архитектуры: Вот где сейчас все и бесятся, как мартышлюшки. Тут уже не просто математика, а целое искусство.
- Two-Tower (Dual-Encoder): Две отдельные нейросети: одна кодирует пользователя, другая — товар. Учим их понимать, кто к кому подходит. Красиво.
- Wide & Deep (Google): Гениальная идея. «Широкая» часть тупо запоминает очевидные связи (типа «кто купил пасту, тот и сыр возьмёт»), а «глубокая» — выявляет хитрые, неочевидные закономерности. Работает — ни хуя себе.
- Sequence-Based (BERT4Rec, SASRec): Это вообще песня. Берут последовательность действий пользователя (посмотрел это, потом это, потом вот это) и через трансформеры пытаются угадать, что он захочет следующим. Сложно, дорого, но когда работает — волнение ебать.
Так вот, чувак, в реальном продакшене мы обычно не гонимся сразу за нейросетями. Берём item-based CF или матричную факторизацию как надёжный, проверенный временем фундамент. А потом уже, когда базовый сценарий отлажен, начинаем экспериментировать с гибридами и нейросетями, чтобы выжать из метрик ещё немного. Иначе можно, понимаешь, овердохуища ресурсов потратить, а прирост будет — хуй в пальто.