Создание наших собственных систем рекомендаций с использованием набора данных фильмов TMDB 5000

Цели этого учебного пособия

Вот несколько целей для вас:

  • Узнайте, что такое рекомендательные системы, как они работают и некоторые из их разновидностей.
  • Внедрить несколько систем рекомендаций с использованием Python и набора данных фильмов TMDB 5000.

Что такое системы рекомендаций?

Система рекомендаций (также обычно называемая механизмом / платформой рекомендаций / рекомендаций) стремится предсказать интерес пользователя к доступным элементам (например, песням на Spotify) и дать соответствующие рекомендации. Существует два основных типа рекомендательных систем:

  • Системы фильтрации на основе содержания дают рекомендации на основе характеристик самих элементов. Так что, если пользователь Netflix просматривал научно-фантастические фильмы, Netflix скорее порекомендует другой научно-фантастический фильм, чем романтическую комедию. Мы реализуем эту систему рекомендаций на Python.
  • Системы совместной фильтрации дают рекомендации на основе взаимодействия с пользователем. Допустим, мы оба купили электрогитару на Amazon, а я также купил усилитель. Тогда Amazon предскажет, что вы тоже заинтересуетесь этим усилителем, и порекомендует его вам.

Благодарим Ибтесама Ахмеда за ее ядро Kaggle в этом наборе данных. Эта статья разработана в соответствии с ее руководством в формате, стилизованном под средний размер.

Создание базовой системы рекомендаций

Настраивать

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

Эти два оператора печати дают нам следующий результат:

  • кредиты: (4803, 4)
  • movies_incomplete: (4803, 20)

Итак, мы работаем с 4803 фильмами. Обратите внимание, что сейчас наши данные разделены на два фрейма данных. Обратитесь к этой сути, чтобы увидеть, как объединить и очистить фреймы данных. Возможно, будет проще сохранить эту суть открытой, пока вы следуете руководству.

Мы начнем с двух основных систем рекомендаций: мы порекомендуем пользователю список фильмов с самым высоким рейтингом и еще один список самых популярных фильмов. Но сначала нам нужно найти средневзвешенное значение для среднего рейтинга каждого фильма (значения vote_average). Следуя примеру Ibtesam, мы будем использовать формулу IMDB (ранее), которая использовалась для расчета взвешенных рейтингов фильмов.

Вот один пример того, как получить средневзвешенные значения:

Я выбрал 0,70 в качестве аргумента для quantile (), чтобы указать, что меня интересуют только фильмы, получившие не менее 70% голосов из нашего набора данных. Выбор нашего значения для m немного произвольный, поэтому попробуйте здесь поэкспериментировать.

Рекомендатор Mk1:

Теперь мы готовы к нашей первой системе рекомендаций. Давайте порекомендуем десять фильмов с наивысшими средневзвешенными оценками:

И мы получаем этот прекрасный график с самыми высокими рейтингами:

Мы видим, что наша инаугурационная система порекомендовала классику. Но что, если мы хотим порекомендовать фильмы, которые популярны среди пользователей TMDB?

Рекомендатор Mk2:

Мы можем использовать функцию популярности наших данных, чтобы рекомендовать фильмы на основе популярности:

И теперь мы можем видеть наши рекомендации, основанные на рейтинге популярности:

Ах, как мы и ожидали: отличная производительность от Minions. А что, если мы хотим рекомендовать фильмы на основе их средневзвешенных оценок и их популярности?

Рекомендатор Mk3:

Чтобы колоссальная оценка популярности Миньонов не искажала нашу новую систему оценок, я нормализовал значения в столбцах взвешенное_среднее и популярность. Я решил разделить 50/50 между взвешенным средневзвешенным рейтингом и оценкой популярности, но опять же не бойтесь экспериментировать с этим разделением:

Теперь, когда у нас есть новый столбец оценка, в котором учитывается средневзвешенный рейтинг фильма и его рейтинг популярности, мы можем увидеть, какие фильмы предлагает нам наша рекомендательная система:

И вот наши рекомендации, основанные на моем разделении 50/50:

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

Контентная фильтрация

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

Векторизация слов и TF-IDF

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

И получаем такой вывод:

  • (4803, 10417)

Таким образом, в кратком изложении сюжета для описания 5000 фильмов было использовано около 10 000 уникальных слов (обратите внимание, что это число меньше, чем у Ibtesam, потому что я увеличил минимальную частоту слов до 3 с помощью min_df = 3). Если вас интересует больше, я тоже говорю о TF-IDF в этой статье.

Расчет баллов сходства

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

Итак, теперь, когда мы создали нашу систему фильтрации на основе содержания, давайте протестируем ее с помощью вневременной фаворита, Spy Kids:

И вот наши рекомендации по системе контентной фильтрации:

Таким образом, наша система рекомендаций дала нам несколько вариантов, связанных с Spy Kids, но несколько ошибок, таких как In Too Deep и Escobar: Paradise Lost, проскочили .

Ограничения

Основываясь на наших результатах выше, мы видим, что наша система фильтрации по содержанию имеет некоторые ограничения:

  1. Наш рекомендатель выбрал несколько фильмов, которые, вероятно, будут сочтены неприемлемыми для пользователей, ищущих названия, связанные с Spy Kids. Чтобы улучшить нашу систему, мы могли бы подумать о замене TF-IDF подсчетом слов, а также изучить другие показатели сходства.
  2. Наша система учитывает только краткое содержание сюжета каждого фильма в его нынешнем виде. Если мы, как и Ибтесам, рассмотрим другие особенности, такие как актеры, режиссер и жанр, мы, вероятно, сможем лучше находить похожие фильмы.
  3. Наша текущая система рекомендует фильмы только на основе схожести характеристик. Таким образом, в нашем рекомендателе отсутствуют фильмы в других жанрах, которые могут понравиться пользователю. Чтобы решить эту проблему, нам нужно было бы попробовать совместную фильтрацию, но наш набор данных не включал информацию о пользователях.

Резюме

Подводя итог, мы рассмотрели следующее:

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

Приложение / Дополнительная литература