Добро пожаловать на первый урок курса по созданию рекомендательных систем! Рекомендательная система (RecSys) — это специализированный алгоритм или набор алгоритмов, предназначенный для предсказания предпочтений пользователя в отношении определенного элемента (товара, фильма, статьи). В современном цифровом мире, где объем информации растет экспоненциально, RecSys становятся главным инструментом борьбы с «информационным перегрузом», помогая пользователю найти именно то, что ему нужно, среди миллионов вариантов.
С точки зрения бизнеса, рекомендательные системы решают критические задачи: увеличение среднего чека (AOV), повышение показателя удержания клиентов (Retention Rate) и рост времени взаимодействия с платформой (LTV). Когда Netflix рекомендует вам сериал, основываясь на ваших прошлых просмотрах, или Amazon предлагает сопутствующий товар к покупке, они не просто «угадывают» — они используют математические модели для максимизации прибыли и удовлетворенности клиента.
Существует три основных архитектурных подхода к построению рекомендаций. Первый — это контентная фильтрация (Content-Based Filtering), где рекомендации основаны на характеристиках самого объекта. Если вы смотрели боевики с Томом Крузом, система предложит вам другие боевики или фильмы с этим же актером. Второй — коллаборативная фильтрация (Collaborative Filtering), которая ищет сходство между пользователями: «Люди, похожие на вас, также купили этот товар». Третий — гибридные системы, сочетающие оба подхода для устранения их индивидуальных недостатков.
Прежде чем переходить к сложным моделям, важно понять, как представить данные. В основе большинства RecSys лежит понятие «матрицы взаимодействий» (User-Item Interaction Matrix). В этой матрице строки представляют пользователей, столбцы — товары, а значения в ячейках — это либо явный фидбек (оценки от 1 до 5), либо неявный (клики, просмотры, покупки). Основная задача системы — заполнить пустые ячейки этой матрицы, предсказав наиболее вероятную оценку пользователя для товара, с которым он еще не взаимодействовал.
Для начала работы с данными в Python чаще всего используются библиотеки Pandas и NumPy. Давайте рассмотрим простой пример того, как создать базовую матрицу взаимодействий и рассчитать сходство между товарами с помощью косинусного расстояния, что является фундаментом контентных рекомендаций.
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
# Создаем данные о взаимодействиях (Пользователь, Товар, Оценка)
data = {
'user': ['A', 'A', 'B', 'B', 'C', 'C'],
'item': ['Movie1', 'Movie2', 'Movie1', 'Movie3', 'Movie2', 'Movie3'],
'rating': [5, 3, 4, 2, 5, 4]
}
df = pd.DataFrame(data)
# Преобразуем в матрицу (Pivot Table)
user_item_matrix = df.pivot(index='user', columns='item', values='rating').fillna(0)
# Вычисляем сходство между товарами (по столбцам)
item_similarity = cosine_similarity(user_item_matrix.T)
item_sim_df = pd.DataFrame(item_similarity, index=user_item_matrix.columns, columns=user_item_matrix.columns)
print(item_sim_df)
В данном коде мы сначала создаем простой DataFrame с оценками трех пользователей для трех фильмов. Затем с помощью метода pivot мы трансформируем «длинный» список взаимодействий в широкую матрицу, где строки — это пользователи, а столбцы — фильмы. Функция cosine_similarity из библиотеки scikit-learn вычисляет косинус угла между векторами товаров. Чем ближе значение к 1, тем более похожи профили пользователей, оценивших эти товары.
Этот подход был выбран потому, что косинусное сходство является стандартом индустрии для работы с разреженными данными. В отличие от Евклидова расстояния, которое чувствительно к величине вектора (например, если один пользователь ставит оценки в среднем выше другого), косинусное сходство оценивает именно направление векторов, то есть относительную структуру предпочтений, что делает его более устойчивым к разным стилям оценивания.
Одной из главных проблем при создании RecSys является «Проблема холодного старта» (Cold Start). Она возникает в двух случаях: когда в систему приходит новый пользователь, о котором мы ничего не знаем, или когда добавляется новый товар, который еще никто не оценил. В таких ситуациях коллаборативная фильтрация бессильна, и разработчикам приходится полагаться на контентный анализ или предлагать самые популярные товары (Popularity-based recommendations), пока не будет накоплено достаточно данных.
Для более продвинутого анализа часто используются методы матричного разложения, такие как Singular Value Decomposition (SVD). SVD позволяет сжать огромную и разреженную матрицу взаимодействий в две маленькие матрицы с «скрытыми факторами» (latent factors). Например, скрытый фактор может неочевидно представлять «степень драматизма фильма» или «предпочтение пользователя к определенному бренду», даже если эти теги не были заданы вручную.
from surprise import SVD, Dataset, Reader
from surprise.model_selection import train_test_split
# Загрузка данных в формате Surprise
reader = Reader(rating_scale=(1, 5))
dataset = Dataset.load_from_df(df[['user', 'item', 'rating']], reader)
# Разделение на обучающую и тестовую выборки
trainset, testset = train_test_split(dataset, test_size=0.25)
# Обучение модели SVD
model = SVD()
model.fit(trainset)
# Предсказание оценки для пользователя A и Movie3
prediction = model.predict('A', 'Movie3')
print(f"Predicted rating: {prediction.est}")
В этом примере используется специализированная библиотека surprise, созданная именно для рекомендательных систем. Мы определяем диапазон оценок с помощью Reader, загружаем наш DataFrame и разделяем данные на тренировочную и тестовую части. Модель SVD обучается на известных взаимодействиях, выявляя скрытые закономерности, и в конце делает предсказание конкретной оценки для пары «пользователь-товар», которая могла отсутствовать в обучающей выборке.
Выбор библиотеки surprise и алгоритма SVD обусловлен тем, что ручная реализация матричного разложения через NumPy трудозатратна и менее оптимизирована. SVD эффективно справляется с проблемой разреженности данных, позволяя делать точные предсказания даже тогда, когда большинство ячеек матрицы пусты. Это гораздо мощнее простого расчета сходства, так как модель учитывает глобальные паттерны поведения всей аудитории.
Частая ошибка новичков — использование только одного метода рекомендаций без учета контекста. Многие пытаются внедрить сложный SVD, забывая, что для новых пользователей он не работает. Чтобы избежать этого, профессионалы создают «каскадные» системы: сначала проверяется, есть ли данные о пользователе; если нет — выдаются популярные товары; если есть немного данных — используется контентная фильтрация; и только при наличии богатой истории применяется коллаборативная фильтрация.
В реальном мире такие системы используются повсеместно. Например, в Spotify алгоритм "Discover Weekly" сочетает в себе коллаборативную фильтрацию (анализ плейлистов миллионов людей) и NLP-анализ текстов блогов и рецензий о музыке, чтобы понять «настроение» трека. Таким образом, RecSys превращаются из простых фильтров в сложные интеллектуальные агенты, которые формируют потребительский опыт пользователя.
Попробуйте реализовать следующее задание: создайте небольшой датасет из 5 пользователей и 5 товаров (с любыми оценками от 1 до 5). Напишите функцию, которая принимает ID пользователя и возвращает список из двух товаров с наивысшим предсказанным рейтингом, используя любой из изученных методов (например, через библиотеку Surprise или расчет косинусного сходства).
Register to answer these questions interactively and have your exam graded.