Создание наших собственных систем рекомендаций с использованием набора данных фильмов 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, проскочили .
Ограничения
Основываясь на наших результатах выше, мы видим, что наша система фильтрации по содержанию имеет некоторые ограничения:
- Наш рекомендатель выбрал несколько фильмов, которые, вероятно, будут сочтены неприемлемыми для пользователей, ищущих названия, связанные с Spy Kids. Чтобы улучшить нашу систему, мы могли бы подумать о замене TF-IDF подсчетом слов, а также изучить другие показатели сходства.
- Наша система учитывает только краткое содержание сюжета каждого фильма в его нынешнем виде. Если мы, как и Ибтесам, рассмотрим другие особенности, такие как актеры, режиссер и жанр, мы, вероятно, сможем лучше находить похожие фильмы.
- Наша текущая система рекомендует фильмы только на основе схожести характеристик. Таким образом, в нашем рекомендателе отсутствуют фильмы в других жанрах, которые могут понравиться пользователю. Чтобы решить эту проблему, нам нужно было бы попробовать совместную фильтрацию, но наш набор данных не включал информацию о пользователях.
Резюме
Подводя итог, мы рассмотрели следующее:
- Что такое рекомендательные системы, как они работают и какие типы
- Как реализовать самые простые рекомендательные системы, основанные на средневзвешенных рейтингах, популярности и их сочетании
- Как создать систему фильтрации на основе содержимого и как распознать ограничения только на основе рекомендаций на основе содержимого
Приложение / Дополнительная литература
- Набор данных фильмов TMDB 5000
- Благодарим ядро Ибтесама Ахмеда за это руководство
- Суть моей записной книжки Colab (она содержит весь код, упомянутый в статье)
- Введение в рекомендательные системы в 2019 году
- Глава 9: Системы рекомендаций
- Научно-учебная документация TF-IDF
- Scikit-learn руководство пользователя сигмоидного ядра и многое другое