Какие типы рекомендательных моделей вы знаете?

Ответ

В моей практике построения рекомендательных систем я применял следующие основные подходы:

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 или матричную факторизацию как надёжный, проверенный временем фундамент. А потом уже, когда базовый сценарий отлажен, начинаем экспериментировать с гибридами и нейросетями, чтобы выжать из метрик ещё немного. Иначе можно, понимаешь, овердохуища ресурсов потратить, а прирост будет — хуй в пальто.