Рекомендательная система в Python - часть 2 (контент-ориентированная система)

Добро пожаловать во вторую часть из 2-х частей. Этот пост будет посвящен разработке простой, основанной на содержании системы рекомендаций на основе ранее изученного набора данных фильмов. Все исследования и анализ данных были выполнены в первой части, поэтому вот ссылка, если вы ее пропустили:



Должен сказать, сегодняшний пост будет намного короче предыдущего. Основная причина этого в том, что в системе рекомендаций не так много (по крайней мере на этом базовом уровне). С учетом вышесказанного, сегодняшний пост объяснит вам интуицию и логику простой системы рекомендаций на основе контента (см. Часть 1, если вы не знаете, что такое системы на основе контента), и вы Вы увидите, что здесь не происходит никакого реального машинного обучения, только расширенная (своего рода) фильтрация.

Зачем вам читать этот пост?

Как и в случае с предыдущим постом, есть два основных преимущества:

  1. Вы окунетесь в мир рекомендательных систем и создадите свой первый (возможно)
  2. Вы обнаружите, что они проще, чем кажется

Как структурирован пост?

Как я уже говорил, эта часть будет намного короче предыдущей, которая охватывала процесс сбора, подготовки и исследования данных. Чтение этого сообщения является предварительным условием, потому что, если вы его не прочитаете (или хотя бы скопируете из него код), ваши данные не будут в том же формате, что и мой, и поэтому вы не сможете продолжить.

Содержание сообщения следующее:

  1. Создание матрицы
  2. Создание функции для получения рекомендаций
  3. Получение и проверка результатов

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

У вас такая форма? Можно продолжить.

Создание матрицы

Под матрицей я подразумеваю, что вы должны каким-то образом создать таблицу, в которой есть следующее:

  • Каждый идентификатор пользователя в виде строки
  • Каждое название фильма в виде столбца
  • Оценка, которую каждый пользователь дал каждому фильму, как пересечение строки и столбца

Это легко получить с помощью функции pivot_table () Pandas:

Эта матрица по сути является объектом DataFrame Pandas, и, зная, что вы знаете, что вы можете вызвать для него .head ():

Да, я знаю, что много NaN. Найдите минутку, чтобы подумать, почему так много значений отсутствует, а затем продолжайте чтение.

Поняли?

Причина в том, что не каждый человек смотрел и оценивал каждый фильм. В этой таблице более 9700 фильмов, так что подумайте о себе. Сколько фильмов вы посмотрели? Сколько из тех, что вы смотрели, вы поставили публично? Не так много, верно?

Теперь у вас есть матрица, и вы можете переходить к следующему шагу.

Создание функции для получения рекомендаций

Это мясо и картошка поста. Если это ваша первая система рекомендаций, вы удивитесь, насколько легко ее создать, по крайней мере, на этом начальном уровне.

Вот логика, которую вам нужно реализовать:

  • Рассчитайте корреляцию желаемого фильма с любым другим фильмом (используя метод .corrwith ()).
  • Храните названия фильмов с корреляциями в отдельном DataFrame.
  • Объедините этот DataFrame с исходным, удалите дубликаты и сохраните заголовок, корреляция и столбцы numRatings
  • Сортировать по корреляции в порядке убывания (от наибольшей корреляции к наименьшей)
  • Отфильтровать фильмы с низким числом оценок (эти фильмы не имеют значения, потому что их посмотрела лишь небольшая группа людей)
  • Вернуться к началу n коррелированных фильмов

Звучит как большая работа, но на самом деле это всего лишь 10 строк кода.

Как видите, я установил количество фильтров и количество рекомендаций по фильму, которые будут возвращаться в качестве аргументов функции по умолчанию, чтобы вам было легче их настраивать.

И это вкратце вся логика, которую вам нужно реализовать.

Легко, правда?

Получение и проверка результатов

Процесс получения рекомендаций теперь так же прост, как вызов функции. Единственный параметр, который вам нужно передать, - это название фильма, и он должен быть таким же, как тот, который присутствует в наборе данных, каждая небольшая орфографическая ошибка сломает все. Не стесняйтесь поэкспериментировать с функцией, чтобы обойти это.

Если я сейчас получу рекомендацию по фильму Криминальное чтиво:

Первый очевиден: Криминальное чтиво идеально коррелирует с Криминальным чтивом, но взгляните на следующие за ним.

Посмотрите, какие рекомендации IMDB дал этому фильму. Круто, правда?

Теперь я могу сделать то же самое с фильмом История игрушек:

Уже понятно, что рекомендации в силе, но на всякий случай подтвердим:

Корпорация монстров и В поисках Немо входят в число первых 6 рекомендаций на IMDB, а Суперсемейка находится на следующей странице.

Заключение

Создавать рекомендательные системы очень весело, и их так легко проверить (по крайней мере в этом случае). Я надеюсь, что после прочтения этой статьи вы не будете смотреть на них как на черные ящики, поскольку они в основном сводятся к некоторым манипуляциям с данными с помощью Python (или вашего языка по выбору).

Для каких фильмов вы тестировали? Вы довольны результатом? Пожалуйста, дайте мне знать.