8.8 C
Москва
Среда, 28 сентября, 2022

MovieLens-1M Deep Dive — Часть I

Популярное

[ad_1]

MovieLens-1M Deep Dive — Часть I

Практический тур по рекомендательным системам с использованием популярного эталонного набора данных

MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*iDGcwsySEgnvyrm8PtQT3g
Фото из пиксели

Рекомендации. Мы все потребляем их. Будь то через наши любимые приложения для потоковой передачи фильмов, онлайн-покупки или даже пассивно в качестве цели рекламных кампаний. Как создаются эти рекомендации? Как система рекомендаций использует огромные наборы данных об интернет-транзакциях для создания высококачественных и персонализированных рекомендаций? Я нахожу эти вопросы интересными, поэтому я решил отправиться в познавательное путешествие, и этот пост предназначен для того, чтобы поделиться своими выводами с вами, дорогие читатели 🙂

Я обнаружил, что существует достаточно теоретических сообщений в блогах об основах рекомендательных систем, и решил, что это будет практический обзор одного из самых популярных доступных наборов данных, ориентированных на рекомендации — КиноОбъектив-1М [1] (используется с разрешения). В этом наборе данных нам дается ~ 1 миллион исторических оценок 2894 фильмов от 6040 уникальных пользователей.

Структура этого поста следующая:

  • Часть I. Исследовательский анализ данных (EDA)
  • Часть II. Предварительная обработка данных (извлечение информации о содержании фильма)
  • Часть III. Постановка задачи рекомендации и получение базовой оценки
  • Часть IV. Рекомендация фильмов с совместной фильтрацией
  • Часть V. Рекомендация фильмов с фильтрацией на основе контента
  • Часть VI. Выводы и мысли на будущее

Записная книжка, содержащая весь код этого проекта и многое другое, доступна здесь: https://colab.research.google.com/drive/132N2lGQTT1NnzAU6cg1IfwpaeFKK9QQe?usp=sharing

Это первая часть подробного обзора MovieLens-1M, состоящего из двух частей. Следующая часть, которая выйдет в ближайшем будущем, будет посвящена более продвинутым алгоритмам и продолжит нескончаемый процесс EDA. Приятного чтения!

Часть I — ЭДА

Сначала загрузите набор данных MovieLens-1M сздесь. Затем давайте сделаем некоторые необходимые импорты и избавимся от этого для этого проекта:

https://medium.com/media/5457a2a7f9545da680f2f38e51cb53a7/href

Набор данных MovieLens-1M состоит из 3 файлов — users.dat, ratings.dat иmovies.dat. Давайте изучим каждый из этих файлов и поймем, с чем мы имеем дело. Начнем с данных фильма.

https://medium.com/media/034ecd15ab58464f82b1340676d78404/hrefhttps://medium.com/media/d706c36c2998588808611929068fb8b9/href

Построим распределение фильмов по жанрам. Для этого нам придется превратить столбец жанров в список и «взорвать» его. Обратите внимание, что каждый фильм может быть нескольких жанров, и в этом случае он будет засчитан несколько раз. Мы также построим распределение фильмов по годам выпуска фильмов.

https://medium.com/media/92b251d5ea431508279a9690ca26d8d5/hrefhttps://medium.com/media/edc01c5445a19c2eaf79fd9c94ad3364/hrefhttps://medium.com/media/f69c7659ed86bab810dc5f0ccdfc8b8e/hrefhttps://medium.com/media/bca43dcd567845564eff025272b7b527/href

Давайте перейдем к данным пользователей и проверим их. Столбец «занятие» кодируется числом, представляющим каждое занятие, но для EDA нас интересуют фактические данные. Мы получим его, извлекая соответствующие строки из файла README набора данных и соответствующим образом меняя значения в наборе данных.

https://medium.com/media/da88426646db26797097a3f7054e4341/hrefhttps://medium.com/media/5412807928a4ba0e95315d913ea063e5/href

Теперь посмотрим на рейтинги.

https://medium.com/media/55e0770900b0f70de46ac6ea91c715f4/hrefhttps://medium.com/media/e4b729dcd2ff8ace4773adcbf01b1c51/href

Проранжируем жанры фильмов по их среднему рейтингу. Мы также построим график, сколько раз каждый жанр был оценен.

https://medium.com/media/1d557661e0921e862ce8abfdbff4f409/hrefhttps://medium.com/media/0e6fa4828d29ed920755b98b700b8a73/href

Теперь давайте объединим все три таблицы (фильмы, пользователи и рейтинги) и посмотрим, есть ли разница между мужскими и женскими рейтингами по жанрам фильмов. Обратите внимание, что и здесь мы нормализуем общее количество мужчин/женщин, чтобы получить лучший ответ на наш вопрос.

https://medium.com/media/8ccf0f5ad4ed01c8528a23e6f5ec60e3/hrefhttps://medium.com/media/4e62b19af3561df82bde93e564f4bf67/href

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

Часть II. Предварительная обработка данных (извлечение информации о содержании фильма)

В этой части мы получим важный источник данных, который поможет нам рекомендовать фильмы позже, и это резюме сюжета фильма. Мы получим их из Википедии, используя Пакет Python для Википедии.

https://medium.com/media/a92dc02cd7d40472cf0ed844f7b20b13/href

Есть 615 сюжетов фильмов NaN

https://medium.com/media/f7c1376e79484c49a3559ff35e2d7eeb/href

Мы видим, что нам не удалось получить сюжеты для 615 фильмов. Это может быть связано с тем, что на их странице в Википедии нет категории «Сюжет» или по какой-то другой причине. Поскольку веб-сканирование здесь не главное, мы просто отбросим эти фильмы и все связанные с ними рейтинги.

https://medium.com/media/ccf0172f91a763d0f6cd34e1f53b47b5/href

Часть III. Постановка задачи рекомендации и получение базовой оценки

Мы выберем пользователя, который будет предметом исследования, для которого мы будем делать реальные прогнозы и посмотрим, имеют ли они для нас смысл. Удобнее всего будет выбрать пользователя с ID #1. Ниже показаны у пользователя и фильмы, которые она оценила. Мы видим, что она ученица K-12 (возраст 1 — ошибка в данных, но я не думаю, что это очень важно). В топ-20 фильмов, которые ей нравятся, входят в основном классические детские хиты с кое-где аномалиями («Список Шиндлера», «Пролетая над гнездом кукушки»).

MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*EtuZbHe2 d2yY56u0YA9mQ

https://medium.com/media/6084a01144a6898623ec6b4ac68f2b4d/href

Мы также сосредоточим наше внимание на фильме «История игрушек» (1995) и для каждого метода прогнозирования проверим, какие фильмы ближе всего к этому фильму в пространстве встраивания.

Наконец, давайте начнем рекомендовать вещи! Мы создадим два разделения набора данных:

1. Стандартный сплит поезд/тест. Это будет использоваться для задачи регрессии прогнозирования рейтинга.

2. Разделение перекрестной проверки с исключением одного. Это будет использоваться для прогнозирования частоты попаданий (что обычно считается более подходящим показателем в области рекомендательных систем). Разделение выполняется путем извлечения одного фильма на пользователя из набора данных и использования его в качестве набора поездов. Все фильмы других пользователей будут в поезде. Затем процент попаданий — это процент случаев, когда снятый нами фильм попадал в топ-K рейтинга этого пользователя.

https://medium.com/media/42a4ce204ab4396b247f048ceda63abc/href

Для каждого метода рассчитаем:

  • RMSE на тестовом наборе
  • частота попаданий в наборе перекрестной проверки с исключением одного
  • Лучшие прогнозы для пользователя №1 (кейс)
  • Топ-10 фильмов, наиболее похожих на «История игрушек» (1995)

Теперь давайте определим некоторые вспомогательные функции, которые помогут нам оценить наши алгоритмы (главным образом — показатель попаданий). Мы проверим два показателя для каждого алгоритма — RMSE и частоту попаданий. Часть кода здесь взята из великолепного курса по рекомендательным системам от Подражать образованию. Я также внедрим простую настройку исходных алгоритмов KNN и SVD, потому что вычисление частоты попаданий занимает много времени, и я хочу, по крайней мере, иметь возможность измерять прогресс в режиме реального времени.

https://medium.com/media/a14edc9471d0f4e4578a73367f831113/href

Давайте получим результаты для полностью случайной рекомендательной системы, чтобы мы могли оценить, лучше или хуже наши алгоритмы, чем случайные (в конце концов, мы хотим, чтобы все было лучше, а не хуже…)

  • Примечание. Для вычисления коэффициента попадания требуется много времени.

https://medium.com/media/a7c0974a38b4f0be9003907647337756/href

RMSE: 1.4960
HitRate: 0.02185430463576159

Часть IV. Рекомендация фильмов с совместной фильтрацией

Мы будем использовать классические ванильные алгоритмы из пакета Surprise (с небольшими изменениями, чтобы показать прогресс в KNN). Я не буду вдаваться здесь в подробности алгоритмов, потому что я думаю, что есть много отличных руководств для изучения этих вещей (просто погуглите рекомендательные системы SVD/KNN, и все готово). Я проверю эти алгоритмы:

  1. СВД
  2. Пользовательский KNN
  3. KNN на основе элементов

Начнем с СВД:

RMSE: 0.8809
HitRate: 0.03923841059602649
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*QA8122cc7PwbcuDZe8GYpw
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*sK5FCZe54WvUuLryVdEP5g

Хороший! Это значительное улучшение по сравнению со случайным счетом. Но когда мы смотрим на прогнозы для пользователя №1, они все еще кажутся немного «неправильными». Единственный детский фильм — «Малышка» (1995), и я лично ожидаю, что больше таких фильмов появится в хороших рекомендациях для этого пользователя.

Теперь на КНН. Мы начнем с пользовательского KNN. Это означает, что прогнозы для фильма м и пользователь ты будет основываться на вкусах пользователей, похожих на ты.

https://medium.com/media/8e42c76833f5faa9d4b4994d0e7250d2/href

RMSE: 0.9595
HitRate: 0.002152317880794702
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*WLGhvvYSlI0JJzp EmDopg

RMSE лучше, чем случайное, но частота попаданий хуже. Мы также можем видеть, что лучшие прогнозы для пользователя user_1 кажутся еще более далекими, чем те, которые дает алгоритм SVD. В пользовательском KNN нет понятия сходства между элементами, поэтому мы не будем вычислять фильмы, наиболее похожие на «Историю игрушек» (1995) для этого алгоритма.

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

https://medium.com/media/632f7953b5ab1b624276cd03beec790b/href

MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*tU1iUEHRFmQPwoF6t rv6w
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU
RMSE: 0.9851
HitRate: 0.002152317880794702

Среднеквадратичное отклонение немного хуже, чем у пользовательского KNN, а частота совпадений достигает почти нуля. Большинство фильмов, похожих на «Историю игрушек» (1995), кажутся разумными, но прогнозы для user_1 снова неудовлетворительны. Пока что алгоритмы KNN не смогли превзойти SVD, который на самом деле считается гораздо лучшим алгоритмом для совместной фильтрации.

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

Часть V. Рекомендация фильмов с фильтрацией на основе контента

Для фильтрации на основе контента мы будем использовать алгоритмы на основе KNN в трех подходах (два из них на основе элементов и один на основе пользователей):

1. Сюжеты фильмов (по предметам): Создайте векторное представление всех фильмов на основе описания сюжета. Мы сделаем это, сначала выделив все слова в описании графика, а затем применив TF-IDF для векторизации каждого документа. Матрицы сходства, которые мы создадим, будут основаны на:

а. Использование полной матрицы TF-IDF

б. Использование матрицы TF-IDF после выбора признаков

в. Использование матрицы TF-IDF после выбора признаков и удаления имен людей

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

3. Возраст пользователя + пол (на основе пользователя): мы будем использовать пользовательские данные в качестве функций для нашего предиктора KNN.

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

https://medium.com/media/fccd73cfeca3f7d5b3449d4395fd670c/href

Часть VI. Контентная фильтрация с использованием киносюжетов

Теперь давайте создадим матрицу сходства TF-IDF.

https://medium.com/media/ebba7c4991de58e2f1899cc4f61131f4/href

Теперь получите результаты для подхода № 1 (используя полную матрицу TF-IDF). Обратите внимание, что нам нужна другая матрица сходства косинусов для обычного набора поездов и набора поездов с исключением одного, который используется для расчета коэффициента попадания, потому что они содержат разные внутренние идентификаторы для каждого фильма.

https://medium.com/media/7dd1796b0061a858225f1ab960193852/href

RMSE: 1.0268
HitRate: 0.003973509933774834
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*jpIh
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU

Хуже, чем совместная фильтрация, без сомнения. Мы также видим, что матрица сходства на самом деле не создает значимых отношений между фильмами (единственный детский фильм, похожий на «Историю игрушек», — это «История игрушек 2»). Посмотрим, поможет ли уменьшение количества функций.

https://medium.com/media/f39f2e89ce2acaf7f0173a22fd2e804d/href

Number of selected features:  784
Список выбранных функций:   ['abbi', 'abel', 'ace', 'adam', 'adel', 'adrian', 'adrien', 'affair', 'agent', 'agn', 'al', 'aladdin', 'alan', 'albert', 'alex', 'alfr', 'ali', 'alic', 'alicia', 'alien', 'allen', 'alli', 'alvin', 'alyssa', 'amanda', 'amelia', 'american', 'ami', 'amo', 'andi', 'andrea', 'andrew', 'angel', 'angela', 'angelo', 'angus', 'ann', 'anna', 'anni', 'antoin', 'anton', 'antonio', 'ape', 'archer', 'archi', 'ariel', 'arjun', 'armstrong', 'arni', 'arroway', 'art', 'arthur', 'arturo', 'ash', 'audrey', 'aurora', 'austin', 'axel', 'babe', 'babi', 'balto', 'bambi', 'band', 'bank', 'barbara', 'barn', 'barney', 'bastian', 'bate', 'bateman', 'batman', 'beach', 'beal', 'bean', 'beatric', 'beckett', 'becki', 'beldar', 'bella', 'ben', 'bendrix'...
RMSE: 1.0314
HitRate: 0.003642384105960265
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*BWj1x b5fQQFrlqJcHrO5g
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*oBGvA1nu2OzbNWc5sKArhw

Didn’t really help…We see that a large portion of the informative features are names. We don’t want that because names don’t really say anything about the movie content. Let’s remove the names.

https://medium.com/media/cc12754ada45305fa33f5857124b14bb/href

RMSE: 1.0284
HitRate: 0.0041390728476821195
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*NGYrdRAUAZwgIARswe4d g
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*VZy1UZht1cB3pXtI4G1r w

OK, this is somewhat more reasonable than the previous two approaches. First of all the hit-rate is higher (though still way less than the collaborative filtering methods), and second the similar movies to Toy Story(1995) are actually similar. Third, the top predictions for user_1 even seem passable. Let us now try the movie-poster approach and see how that goes.

Part V.II— Content-based filtering using movie genres

In this part I will tune down the algorithmic complexity and create a KNN recommender based only on the movie genres. This means that if a person rated children’s movies very high, we should expect the algorithm to recommend children’s movies. We will create all possible combinations of genres using pythons itertools package and then apply our old friend TF-IDF to generate a feature matrix from this data.

https://medium.com/media/ba305925548dfc4bb3c303e6e623a1a2/href

RMSE: 1.0138
HitRate: 0.0031456953642384107
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU 1*sksGjMCf2SagW71XPB6Jig

Unsurprisingly the most similar movies to Toy Story (1995) are those that have identical or almost identical genres. Other than that the results are quite confusing, why did user_1 get recommendations only for war movies? Let’s remind ourselves of the table in part III of this article (which shows all of the ratings of user_1), we see that there are two movies with genre “war” in user_1’s rating list and both of them got a score of 5. The other genres that user_1 has rated appear more frequently and thus if we average user_1’s scores by genre — the “war” genre will receive a perfect score while the other genres won’t.

Because the item content-based KNN recommender predicts new items for user_1 by their similarity to other items that have been scored by user_1 it will give a perfect score for each war movie it will see in the context of user_1! The KNN recommender ignores scores belonging to 0 similarity items, it will only take into account the war movie scores when generating the recommendations for war movies and thus always predict perfect scores.

Part V.III — Content-based filtering using user User age+gender

Let us start by creating a feature vector from the users’ age and gender. We will assign 0 to ‘Male’ and 1 to ‘Female’ and we will take the age column as-is. Finally we will normalize the columns so as not to be affected by the difference in column magnitudes. Using these values we will create a cosine-similarity matrix as we did for the movies, but this time we will calculate a similarity score between each user. This similarity score will be an input to our user-based KNN recommender.

https://medium.com/media/eb013182b1375287f9da881a55abac39/href

RMSE: 0.9784
HitRate: 0.00347682119205298
MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU

We see that the RMSE is a better than for the item-based methods, similarly to the results we got in part IV (collaborative filtering), where the user-based recommendations outperformed item-based ones. but the hit rate is a bit worse than some of the item-based methods we tried. It seems that each method has its strengths and weaknesses and a good approach will probably be to somehow combine them all, and this will be the focus of the next part.

Part VI — Conclusions and thoughts ahead

In this post, a lot was covered.

First, we inspected the MovieLens-1M dataset and got some pretty interesting insights from the graphs we saw, such as which movie genres tend to score higher than others in average. We then used some vanilla recommender systems algorithms from the Surprise python package, and got some pretty good results with the SVD algorithm.

After that, we tried our luck with content-based filtering, but unfortunately, this turned out to be a futile attempt. Despite that, in the research process we unveiled an inherent weakness in KNN recommender systems (or content-based filtering in general), which is that the recommendations for a specific user are based solely on the items that he/she has interacted with in the past, and if there was bias in this user’s interactions it will show up in the KNN recommendations. This is why our spotlight user (user_1) got top scores for war movies when we used genres as the basis of our recommendations, even though we as humans wouldn’t necessarily agree. A more probable recommendation for this user would be children’s/musicals and the like.

Additionally, we saw that when dealing with natural text, such as movie plots, it is worthwhile to understand which features are most affecting the recommendations. When we removed person names which were ranked very high in the TF-IDF algorithm, we suddenly got better results and this was clearly visible when the movies that were most similar to Toy Story (1995) suddenly made sense.

In the next part, I will combine content-based filtering and collaborative filtering and thus have the best of both worlds. I already have my eyes on the TensorFlow-recommenders package and I cant’ wait to give it a go.

Until next time!

Elad

References:

[1] Максвелл Харпер и Джозеф А. Констан. 2015. Наборы данных MovieLens: история и контекст. Транзакции ACM в интерактивных интеллектуальных системах (TiiS) 5, 4: 19: 1–19: 19. https://doi.org/10.1145/2827872

MovieLens-1M Deep Dive — Часть I ⋆ VOLDEMARU stat?event=post


MovieLens-1M Deep Dive — Часть I изначально была опубликована в журнале Towards Data Science на Medium, где люди продолжают обсуждение, выделяя и отвечая на эту историю.

Оригинал

[ad_2]

- Advertisement -

Выбор редакции

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь

- Advertisement -

Последние статьи