Введение

Когда я впервые услышал о рекомендательных системах, они казались мне чем-то сложным и недоступным. Но оказалось, что базовый алгоритм можно создать буквально за несколько шагов! В этой статье я покажу, как сделать свою рекомендательную систему для фильмов, даже если вы только начинаете разбираться в машинном обучении и Python. Готовы к DIY-приключению?

Оглавление

1. Подготовка данных: собираем информацию о фильмах и предпочтениях

Откуда брать данные для рекомендательной системы?

Когда я только начинал, этот вопрос казался самым сложным. Но на практике всё оказалось проще! Вот три основных способа собрать данные для вашей DIY-системы:

  1. Готовые датасеты — самый простой вариант для новичков. Например, можно использовать:
  2. MovieLens (от 1 000 до 27 000 000 оценок)
  3. IMDb Datasets (информация о фильмах и актёрах)
  4. Kaggle (много разных вариантов)

  5. Собственные данные — если хотите персонализированную систему. Можно:

  6. Экспортировать историю просмотров из Netflix или КиноПоиска
  7. Вручную составить список любимых фильмов с оценками (хотя бы 20-30 штук)

  8. Парсинг сайтов — для продвинутых. Но будьте осторожны с правилами сайтов!

Какой формат данных нам нужен?

Минимальный набор для простой рекомендательной системы:

  • Фильмы (ID, название, жанры, год)
  • Оценки пользователей (ID пользователя, ID фильма, оценка от 1 до 5)

```python

Пример структуры данных в CSV

movies = [

{"movie_id": 1, "title": "Крёстный отец", "genres": "криминал,драма"},

{"movie_id": 2, "title": "Тёмный рыцарь", "genres": "боевик,криминал,драма"}

]

ratings = [

{"user_id": 101, "movie_id": 1, "rating": 5},

{"user_id": 101, "movie_id": 2, "rating": 4}

]

```

Практический совет: начинайте с малого!

Когда я делал свою первую систему, попытался взять огромный датасет на 10 000 фильмов. Результат? Компьютер завис, а я запутался. Лучше начать с небольшого набора:

  • 50-100 популярных фильмов
  • 3-5 жанров
  • 5-10 «виртуальных пользователей» с разными вкусами

Это даст вам достаточно данных для работы, но не перегрузит систему. Позже всегда можно масштабировать!

Частая ошибка новичков

Не забывайте нормализовать данные! Например:

- Привести все жанры к одному регистру ("драма" vs "Драма")

- Проверить, что оценки в одинаковом диапазоне (например, все от 1 до 5)

- Удалить дубликаты фильмов

Потратьте 10 минут на очистку данных — сэкономите часы на отладке алгоритма!

2. Выбираем алгоритм: простые методы для новичков

Какой алгоритм выбрать для первой рекомендательной системы?

Когда я впервые открыл список алгоритмов рекомендаций, у меня разбежались глаза — коллаборативная фильтрация, контент-базированные методы, матричные разложения... Но для старта подойдут всего 2-3 понятных подхода:

  1. Контент-базированные рекомендации (самые простые!)
  2. Рекомендуем похожие фильмы по жанрам, актёрам или описанию
  3. Плюсы: не нужны данные о других пользователях
  4. Минусы: не учитывает вкусы конкретного человека

  5. Коллаборативная фильтрация (на основе оценок)

  6. «Люди, которым нравились те же фильмы что и вам, также смотрели...»
  7. Плюсы: персонализированные рекомендации
  8. Минусы: нужно много данных о пользователях

  9. Гибридный подход (золотая середина)

  10. Комбинирует оба метода
  11. Даёт более сбалансированные результаты

Как это работает на практике?

Пример контент-базированного подхода:

```python

Простейшая реализация через сравнение жанров

def recommend_similar_movies(target_movie, movies_list):

target_genres = set(target_movie['genres'].split(','))

recommendations = []

for movie in movies_list:  
movie_genres = set(movie['genres'].split(','))
similarity = len(target_genres & movie_genres) / len(target_genres | movie_genres)
if similarity > 0.5 and movie['id'] != target_movie['id']:
recommendations.append((movie['title'], similarity))

return sorted(recommendations, key=lambda x: x[1], reverse=True)

```

Вопрос-ответ: что выбрать новичку?

Q: У меня мало данных о пользователях — что делать?

A: Начните с контент-базированного подхода. Достаточно информации только о фильмах!

Q: Хочу персонализированные рекомендации — но боюсь сложного кода?

A: Попробуйте item-based коллаборативную фильтрацию. Она проще user-based вариантов.

Мой личный опыт

Когда я делал свою первую систему, выбрал гибридный подход:

1. Сначала искал фильмы с похожими жанрами (контент-метод)

2. Затем сортировал их по оценкам похожих пользователей (коллаборативный метод)

Результат? Скромная, но рабочая система за выходные! Главное — не стремитесь к идеалу сразу. Лучше простая работающая версия, чем сложный незаконченный проект.

Чего стоит избегать новичкам?

  • Сложных алгоритмов вроде SVD или нейросетей — оставьте их на потом
  • Слишком больших датасетов — начинайте с малого
  • Попыток учесть все параметры сразу — жанров и оценок достаточно для старта

Помните: даже Netflix начинал с простых рекомендаций! Ваша первая система — это ценный опыт, а не шедевр машинного обучения.

3. Пишем код: реализация на Python за 30 минут

С чего начать писать код?

Когда я впервые сел за реализацию, то потратил кучу времени на подготовку. Сейчас я расскажу, как сделать всё быстро и эффективно. Вам понадобится:

  1. Базовое окружение:
  2. Python 3.8+
  3. Библиотеки: pandas, numpy, scikit-learn
  4. Редактор кода (VS Code, PyCharm или даже Jupyter Notebook)

  5. Шаблон кода для быстрого старта:

    ```python

    import pandas as pd

    from sklearn.metrics.pairwise import cosine_similarity

Загрузка данных

df_movies = pd.read_csv('movies.csv')

df_ratings = pd.read_csv('ratings.csv')

Ваш код будет здесь!

```

Пошаговая реализация

Шаг 1. Создаём матрицу оценок

```python

Преобразуем данные в удобный формат

ratings_matrix = df_ratings.pivot_table(

index='user_id',

columns='movie_id',

values='rating',

fill_value=0

)

```

Шаг 2. Вычисляем схожесть фильмов

```python

Используем косинусное сходство

movie_similarity = cosine_similarity(ratings_matrix.T)

movie_sim_df = pd.DataFrame(

movie_similarity,

index=ratings_matrix.columns,

columns=ratings_matrix.columns

)

```

Шаг 3. Функция рекомендаций

python
def get_recommendations(movie_id, n=5):
# Получаем похожие фильмы
similar_movies = movie_sim_df[movie_id].sort_values(ascending=False)
# Исключаем сам фильм и берём топ-N
return similar_movies.iloc[1:n+1].index.tolist()

Как это проверить?

  1. Найдите ID любого фильма в вашем датасете
  2. Вызовите функцию:
    ```python

Пример для фильма с ID 42

print("Рекомендации:", get_recommendations(42))

```

Частые проблемы и решения

  • Ошибка памяти? Уменьшите размер датасета или используйте разреженные матрицы (scipy.sparse)
  • Слишком общие рекомендации? Добавьте фильтрацию по жанрам
  • Медленная работа? Кэшируйте результаты вычислений

Мой совет из личного опыта

Не пытайтесь сделать идеально с первого раза! Мой первый вариант выдавал странные рекомендации (например, детские мультфильмы после ужастиков), но это нормально. Главное — чтобы система:

1. Работала без ошибок

2. Давала хоть какие-то осмысленные результаты

3. Была понятна вам самим

Дальше можно бесконечно улучшать, но рабочая база — уже огромный успех. Кстати, сохраните этот простой вариант — через год будет интересно сравнить с более продвинутыми реализациями!

4. Тестируем систему: как проверить качество рекомендаций

Как понять, что ваши рекомендации действительно хороши?

Когда я впервые получил результаты работы своей системы, то растерялся — как оценить, насколько они точны? Оказывается, есть несколько практических способов проверить качество без сложных метрик:

Метод 1: «Тест друга»

1. Возьмите фильмы, которые любит ваш знакомый

2. Посмотрите, что рекомендует система

3. Спросите, стал бы он смотреть предложенные варианты

Метод 2: Перекрёстная проверка

```python

from sklearn.model_selection import train_test_split

Разделяем данные на обучающую и тестовую выборку (80/20)

train, test = train_test_split(ratings, test_size=0.2)

Обучаем модель на train и проверяем на test

```

Какие метрики можно использовать?

Для базовой проверки достаточно трёх показателей:

  1. Точность (Precision@K) — сколько из топ-K рекомендаций действительно релевантны
  2. Полнота (Recall@K) — какой процент любимых пользователем фильмов попал в рекомендации
  3. Coverage — какой процент фильмов из каталога вообще может быть рекомендован

Практический пример оценки

Допустим, пользователь любит 10 фильмов, а система:

- Рекомендует 5 фильмов

- 3 из них действительно нравятся пользователю

- В каталоге 100 фильмов, система может рекомендовать 70

Расчёт:

- Precision@5 = 3/5 = 0.6 (60%)

- Recall@5 = 3/10 = 0.3 (30%)

- Coverage = 70/100 = 0.7 (70%)

Частые проблемы и решения

Проблема: Система рекомендует только популярные фильмы

Решение: Добавьте параметр разнообразия в алгоритм

Проблема: Рекомендации кажутся случайными

Решение: Проверьте, правильно ли считаются меры схожести

Проблема: Некоторые фильмы никогда не рекомендуются

Решение: Увеличьте coverage, изменив параметры алгоритма

Вопрос-ответ

Q: Нужно ли добиваться 100% точности?

A: Нет! Даже у Netflix точность около 30-40%. Главное — баланс между точностью и разнообразием.

Q: Как часто нужно перепроверять систему?

A: Раз в месяц делайте контрольную проверку на новых данных.

Личный лайфхак

Заведите таблицу в Google Docs с тремя колонками:

1. Какой фильм ввёл

2. Что рекомендовала система

3. Моя оценка рекомендаций (1-5 звёзд)

Через 20-30 таких проверок вы ясно увидите слабые места системы. Помните: тестирование — это не разовая акция, а постоянный процесс улучшения!

5. Улучшаем алгоритм: базовые методы оптимизации

С чего начать улучшение рекомендательной системы?

Когда моя первая система начала работать, я обнаружил три главные проблемы:

1. Рекомендации были слишком очевидными

2. Некоторые хорошие фильмы никогда не попадали в подборку

3. Алгоритм работал медленно с большими датасетами

Вот как можно это исправить:

1. Добавляем разнообразие в рекомендации

Проблема: Алгоритм зациклен на топ-10 самых популярных фильмах

Решение:

python
def diverse_recommendations(movie_id, n=5, diversity=0.5):
similar = movie_sim_df[movie_id].sort_values(ascending=False)
# Добавляем элемент случайности
recommendations = similar.sample(frac=1).iloc[:int(n*2)]
return recommendations.head(n)

2. Учитываем несколько факторов

Вместо только жанров или оценок, комбинируем:

- Рейтинг фильма на IMDb/Kinopoisk

- Год выпуска (новинки vs классика)

- Награды (Оскар, Канны и др.)

```python

Весовая формула

movie_score = (genre_similarity * 0.6) + (rating * 0.3) + (awards * 0.1)

```

3. Оптимизируем производительность

Для больших датасетов:

- Используйте scipy.sparse для матриц

- Применяйте numba для ускорения вычислений

- Кэшируйте результаты с joblib

```python

from scipy.sparse import csr_matrix

from joblib import Memory

memory = Memory("./cache")

@memory.cache

def compute_similarity(matrix):

return cosine_similarity(matrix)

```

Вопрос-ответ

Q: Как понять, какие улучшения действительно работают?

A: Замеряйте метрики до и после изменений (Precision@K, Recall@K, Coverage)

Q: Стоит ли сразу внедрять все улучшения?

A: Нет! Вводите по одному и проверяйте эффект.

Чек-лист улучшений

  • [ ] Добавлен параметр разнообразия
  • [ ] Учтены дополнительные факторы
  • [ ] Оптимизирована скорость работы
  • [ ] Реализовано кэширование
  • [ ] Настроено логирование результатов

Личный опыт

Мой первый успешный апгрейд — добавление «штрафа» для слишком старых фильмов. Вместо сплошной классики 70-х система начала рекомендовать и современное кино. Но самое главное — я начал замерять результаты каждого изменения. Оказалось, что:

- +15% к удовлетворённости рекомендациями дало добавление рейтингов

- +20% к скорости — переход на разреженные матрицы

- +30% к разнообразию — параметр случайности

Помните: даже небольшие улучшения со временем дают кумулятивный эффект!

Заключение

Вот мы и прошли этот путь вместе — от нуля до работающей рекомендательной системы!

Когда я начинал, мне казалось, что создать что-то подобное — удел избранных. Но теперь-то мы с вами знаем правду: достаточно пяти шагов, базового Python и здорового любопытства.

Что у нас получилось:

- Разобрались с данными (и пережили первые ошибки очистки)

- Выбрали алгоритм (без сложных математических дебрей)

- Написали работающий код (который можно показать друзьям)

- Научились тестировать (и понимать, где система врёт)

- Улучшили результаты (как настоящие data scientists!)

Главный секрет, который я вынес из этого опыта: лучшая рекомендательная система — не та, что использует самые сложные алгоритмы, а та, которую вы действительно понимаете и можете развивать.

Мой вам совет — не останавливайтесь на достигнутом:

1. Добавьте рекомендации для книг или музыки по тому же принципу

2. Попробуйте подключить Telegram-бота для вашей системы

3. Сравните разные алгоритмы и найдите «свой»

И помните: каждый большой Netflix начинался с маленького скрипта на коленке. Ваш код — это первый шаг к чему-то большему. Когда в следующий раз получите идеальную рекомендацию — улыбнитесь, ведь теперь вы знаете, как это работает изнутри!

P.S. Если ваш алгоритм вдруг порекомендует «Крёстного отца» после просмотра «Малыша на драйве» — не вините меня, это всё магия machine learning! 😉