Кейс : построение рекомендательной системы шаг за шагом

Представим, что у нас есть классический сет данных: MovieLens 100K — оценки пользователей фильмов («userId», «movieId», «rating», «timestamp») — и мы хотим построить top-N рекомендательную систему, используя библиотеку sota-recommender.

Краткое содержание

Мы пройдём этапы: загрузка данных → предобработка → обучение модели → рекомендации → оценка качества.

Шаг 1: загрузка и преобразование данных

from recommender import load_movielens, InteractionDataset

df = load_movielens(size='100k')
# df — DataFrame с колонками userId, movieId, rating, timestamp

dataset = InteractionDataset(df, implicit=False)
# explicit задачи: рейтинги. Если бы мы работали с кликами/просмотрами, implicit=True

Здесь важно: библиотека автоматически обрабатывает DataFrame, позволяет указать explicit/implicit режим.
Также делим на train и test:

train, test = dataset.split(test_size=0.2, random_state=42)

Шаг 2: обучение модели

Предположим, мы выбираем один из алгоритмов: например, EASERecommender или SLIMRecommender из библиотеки:

from recommender import EASERecommender

model = EASERecommender(l2_reg=500.0)
model.fit(train.data)
«train.data» — это разреженная матрица взаимодействий. Выбор модели, параметров (например регуляризация l2_reg), влияет на результаты.

Шаг 3: получение рекомендаций

user_ids = [10, 20, 30]
k = 5
recs = model.recommend(user_ids, k=k)
print(recs)

Вывод: для каждого пользователя из списка возвращается список рекомендованных item-ID. Можно затем сопоставить с реальными названиями фильмов, если есть маппинг.

Шаг 4: оценка качества

from recommender import Evaluator

evaluator = Evaluator(metrics=['precision','recall','ndcg'])
results = evaluator.evaluate(model, test, task='ranking', train_data=train)
evaluator.print_results(results)

Здесь важно:

  • Мы используем метрики Precision@K, Recall@K, NDCG@K.
  • Задача – «ranking», то есть топ-N рекомендаций, а не предсказание рейтинга.
  • Перед оценкой не стоит рекомендовать пользователям те фильмы, которые уже были в train_data: это учтено.
  • Этот подход соответствует описанию лучших практик в рекомендательных системах.

Шаг 5: анализ результатов и интерпретация

После получения результатов можно сделать:

  • Сравнение моделей: например, заменить EASE на SLIM, SVD, или другой алгоритм из библиотеки и посмотреть, как меняются метрики.
  • Проверка покрытия: сколько пользователей/товаров было охвачено, сколько рекомендаций реально уникальных.
  • Выяснение узких мест: например, холодный старт пользователей или товаров, «длинный хвост» малопопулярных товаров.
  • Возможно, визуализация: распределение Precision@K по группам пользователей (активных vs. менее активных), влияние параметров регуляризации и латентных факторов.

Шаг 6: выводы и дальнейшие шаги

  • Вы увидите, что даже простая модель (например EASE) с правильным интерфейсом и оценкой может дать неплохие рекомендации.
  • Но если данные сложнее (последовательности, графы, множество контекстов) — можно попробовать более сложные модели.
  • Дальнейшие шаги:
    • попробовать implicit-режим (когда нет рейтингов, только клики)
    • добавить негативный sampling, если данных много и задача чисто топ-N
    • сравнить продакшн-аспекты: скорость обучения, время рекомендации, ресурсы.
    • интегрировать в веб-сервис/приложение: REST API, real-time рекомендации.

Ноутбук с полным примером, можно посмотреть тут https://github.com/hichnicksemen/svd-recommender/blob/master/examples/synthetic_data_example.ipynb

AI на дровах 🪵
Привет! Меня зовут Семён, я работаю в сфере ML и аналитики данных и пишу в блог nerdit.ru статьи о своем опыте и том, что может пригодиться начинающим в начале их пути изучения больших данных.

Подписаться на новости Nerd IT

Не пропустите последние выпуски. Зарегистрируйтесь сейчас, чтобы получить полный доступ к статьям.
jamie@example.com
Подписаться