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

Основная цель рекомендательных систем - рекомендовать пользователю релевантные товары на основе исторических данных.

СИСТЕМА РЕКОМЕНДАЦИЙ NETFLIX, ИСПОЛЬЗУЮЩАЯ МЕТОДЫ МАШИННОГО ОБУЧЕНИЯ

Как мы все знаем о Netflix: это ведущий в мире развлекательный интернет-сервис с 130 миллионами платных абонементов в более чем 190 странах, где можно смотреть сериалы, документальные и художественные фильмы в самых разных жанрах и на разных языках.

Теперь, перейдя к этому блогу, мы увидим, как решить проблему с системой рекомендаций Netflix с нуля.

1. Деловая проблема

1.1 Описание проблемы:

Netflix - это подключение людей к любимым фильмам. Чтобы помочь клиентам найти эти фильмы, они разработали систему рекомендаций фильмов мирового класса: CinematchSM. Его задача - предсказать, понравится ли кому-то фильм, основываясь на том, насколько им нравятся или не нравятся другие фильмы. Netflix использует эти прогнозы, чтобы составить персональные рекомендации по фильмам с учетом уникальных вкусов каждого клиента. И хотя у Cinematch все хорошо, его всегда можно улучшить.

Сейчас есть много интересных альтернативных подходов к работе Cinematch, которые Netflix еще не пробовал. Некоторые описаны в литературе, некоторые нет. Нам любопытно, сможет ли какой-либо из них превзойти Cinematch, делая более точные прогнозы. Потому что, честно говоря, если есть гораздо лучший подход, он может иметь большое значение для наших клиентов и нашего бизнеса.

Источник: https://www.netflixprize.com/rules.html

1.2 Постановка проблемы:

Netflix предоставил много анонимных рейтинговых данных и планку точности прогнозов, которая на 10% лучше, чем то, что Cinematch может сделать с тем же набором обучающих данных. (Точность - это мера того, насколько точно прогнозируемые рейтинги фильмов соответствуют последующим фактическим рейтингам.)

На скриншоте видно, что, когда я смотрел Джона Уикса, он рекомендовал мне другие фильмы того же типа.

1.3 Цели и ограничения реального мира / бизнеса:

Цели:

  1. Предскажите рейтинг, который пользователь поставит фильму, который он еще не оценил.
  2. Минимизируйте разницу между прогнозируемым и фактическим рейтингом (RMSE и MAPE).

Ограничения:

  1. Некоторая форма интерпретируемости.

2. Проблема машинного обучения

2.1 Обзор данных:

Мы можем скачать данные по данной ссылке



Дата файлы :

  • Combined_data_1.txt
  • Combined_data_2.txt
  • Combined_data_3.txt
  • Combined_data_4.txt
  • movie_titles.csv
The first line of each file [combined_data_1.txt, combined_data_2.txt, combined_data_3.txt, combined_data_4.txt] contains the movie id followed by a colon. Each subsequent line in the file corresponds to a rating from a customer and its date in the following format:
CustomerID,Rating,Date
MovieIDs range from 1 to 17770 sequentially.
CustomerIDs range from 1 to 2649429, with gaps.
There are 480189 users.
Ratings are on a five star (integral) scale from 1 to 5.
Dates have the format YYYY-MM-DD.

2.2 Пример точки данных:

1:1488844,3,2005-09-06

1 - представляет MovieID.

1488844 - представляет User / CustomerID.

3 - представляет рейтинг, данный пользователем.

2005–09–06 представляет формат даты (ГГГГ-ММ-ДД).

2.3 Сопоставление реальной проблемы с проблемой машинного обучения:

Тип задачи машинного обучения:

Для данного фильма и пользователя нам нужно предсказать, какую оценку он / она поставит фильму.
Данная проблема является проблемой рекомендации.
Ее также можно рассматривать как проблему регрессии.

Показатель производительности:

Мы используем в основном MAPE и RMSE в качестве показателей производительности для этой проблемы.

Мы можем найти больше о них по следующим ссылкам, приведенным ниже.

Цель и ограничения машинного обучения:

  1. Чтобы минимизировать RMSE.
  2. Постарайтесь обеспечить некоторую интерпретируемость.

Приступим к кодированию!

Импорт библиотек

Давайте приступим к исследовательскому анализу данных.

3. Исследовательский анализ данных:

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

3.1 Предварительная обработка данных:

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

У нас есть данные в четырех форматах, и мы объединяем их, чтобы получить требуемый формат.

Преобразование / объединение всех данных в требуемый формат: u_i, m_j, r_ij

Давайте посмотрим на столбец «рейтинг» с помощью команды describe ().

Проверка значений NAN

Удаление дубликатов

Основная статистика (# Рейтинги, # Пользователи и # Фильмы)

Мы видим, что всего 100480507 оценок, 480189 пользователей, 17770 фильмов.

3.2 Разделение данных на тренировку и тест (80:20):

Поскольку мы отсортировали дату в порядке возрастания, мы собираемся разделить первые 80% данных в Train и нижние 20% данных в Test.

Давайте посмотрим на статистику по данным обучения и тестирования.

Базовая статистика в данных поезда

Всего в наборе данных Train имеется 80384405 оценок, 405041 пользователей, 17424 фильмов.

Базовая статистика в тестовых данных

Всего в наборе тестовых данных есть 20096102 оценок, 349312 пользователей, 17757 фильмов.

3.3 Исследовательский анализ данных по поездам:

Распределение рейтингов

Из приведенного выше распределения мы видим, что большинство людей дают оценку 4, а немногие дают оценку 1.

Давайте добавим новый столбец (день недели) в набор данных для анализа.

Количество оценок в месяц

Мы видим, что в период 2003–2006 годов наблюдается значительный рост Netflix. В 2005 году пользователи выставили около 4,5 миллионов оценок.

Анализ рейтингов, присвоенных пользователем

Пользователь с ID 305344 оценил около 17112 фильмов (кажется довольно большим).

Построим графики PDF (функция плотности вероятности) и CDF (функция совокупного распределения).

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

50% пользователей оценили более 89 фильмов.

Пойдем с Quantiles.

95-е значение - 749, что означает, что 5% пользователей оценили более 749 фильмов.

Сколько оценок в последних 5% всех оценок?

Анализ оценок фильма, выставленных пользователем

  • Оно очень искажено ... как и количество оценок, выставленных на пользователя.
- There are some movies (which are very popular) which are rated by huge number of users.
- But most of the movies(like 90%) got some hundreds of ratings.

Количество оценок в каждый день недели

Во вторник люди поставили оценку больше, чем в субботу и воскресенье.

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

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

Средняя оценка

Так что день недели - не лучший способ предсказания.

Создание разреженной матрицы из фрейма данных

Редкость обучающей разреженной матрицы

Создание разреженной матрицы из фрейма тестовых данных

Редкость матрицы тестовых данных

Поиск глобального среднего для всех рейтингов фильмов, среднего рейтинга для пользователя и среднего рейтинга для фильма

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

Определение средней оценки для пользователя

Определение средней оценки фильма

Файлы PDF и CDF средних рейтингов пользователей и фильмов (в поездах)

3.4 Проблема с холодным запуском:

Так в чем же проблема холодного запуска? Термин происходит от автомобилей. Когда очень холодно, у двигателя возникают проблемы с запуском, но как только он достигнет оптимальной рабочей температуры, он будет работать без сбоев. Для рекомендуемых двигателей «холодный запуск» просто означает, что обстоятельства еще не оптимальны для двигателя, чтобы обеспечить наилучшие возможные результаты.

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

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

Проблема с холодным запуском фильмов

Возможно, нам придется обработать 346 фильмов (сравнительно небольших размеров) в тестовых данных.

3.5 Вычисление матриц подобия:

Вычисление матрицы сходства пользователя и пользователя

Вычислить User User Similarity_Matrix не очень просто (если у вас огромная вычислительная мощность и много времени) из-за количества. пользователи большие.

  • Вы можете попробовать, если хотите. Ваша система может дать сбой или программа остановится из-за ошибки памяти.

Пробуем со всеми размерами (17 КБ на пользователя)

Попытка уменьшить размер (использование TruncatedSVD для уменьшения размерности пользовательского вектора)

  • У нас есть 405 041 пользователь в нашей обучающей выборке, и вычисление сходства между ними .. (17K размерный вектор ..) занимает много времени ..
  • Как видно из графика выше, вычисление количества похожих пользователей для одного пользователя заняло примерно 8,88 секунды.
  • У нас есть 405 041 пользователь в обучающей выборке.
  • 405041 × 8,88 = 3596764,08с = 59946,068мин = 999,101133333 часов = 41,629213889 дней… (что довольно сложно с вычислительной точки зрения).
  • Даже если мы будем работать на 4 ядрах параллельно (типичная система сейчас - дни), это все равно займет почти 10 с половиной дней.

ИДЕЯ: Вместо этого мы попытаемся уменьшить размеры с помощью SVD, чтобы это могло ускорить процесс.

Здесь,

  • ∑⟵∑⟵ (netflix_svd.singular_values_)
  • ⋁T⟵⋁T⟵ (netflix_svd.components_)
  • ⋃⋃ не возвращается. вместо этого возвращается Projection_of_X на новое векторное пространство.
  • Он внутренне использует рандомизированный svd, который возвращает все 3 из них по отдельности. Используйте это вместо этого ..

Я думаю, что 500 измерений достаточно.

  • Просто взяв (от 20 до 30) скрытых факторов, мы можем получить объясненную дисперсию 20%.
  • Чтобы довести его до 60%, нам нужно взять почти 400 скрытых факторов. Это не тариф.
  • По сути, это объяснение увеличения дисперсии, если мы добавим к нему еще один скрытый фактор.
  • При добавлении одного латентного фактора к нему, _ усиление объясненной дисперсии с этим добавлением уменьшается. (Очевидно, потому что они так отсортированы).
  • График LHS:
  • x - - (Количество скрытых факторов),
  • y - - (Разница, объясняемая с учетом x скрытых факторов)
  • Еще большее уменьшение линии (график справа):
  • Мы получаем больше объясненных отклонений, чем раньше.
  • Меньшее уменьшение в этой строке (график справа):
  • Мы не получаем никакой выгоды от дальнейшего добавления латентного фактора. Это то, что показано на графиках.
  • График RHS:
  • x - - (Количество скрытых факторов),
  • y - - (_ усиление объясненной дисперсии за счет принятия одного дополнительного скрытого фактора).

  • Давайте преобразуем это в реальную разреженную матрицу и сохраним для будущих целей.

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

  • как показано на графике выше, для расчета количества похожих пользователей на одного пользователя потребовалось почти 12,18.
  • У нас есть 405041 пользователь в обучающей выборке.
  • 405041 × 12,18 ==== 4933399,38 сек ==== 82223,323 мин ==== 1370,388716667 часов ==== 57,099529861 дней…
  • Даже если мы работаем на 4 ядрах параллельно (типичная система сейчас - дни), это все равно займет почти (14–15) дней.

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

Есть ли другой способ вычислить сходство пользователей с пользователями… ??

- Альтернативой является вычисление похожих пользователей для конкретного пользователя, когда это необходимо (то есть время выполнения).

- We maintain a binary Vector for users, which tells us whether we already computed or not..
- ***If not*** : 
    - Compute top (let's just say, 1000) most similar users for this given user, and add this to our data structure, so that we can just access it(similar users) without recomputing it again.
    - 
- ***If It is already Computed***:
    - Just get it directly from our data structure, which has that information.
    - In production time, We might have to recompute similarities, if it is computed a long time ago. Because user preferences changes over time. If we could maintain some kind of Timer, which when expires, we have to update it ( recompute it ). 
    - 
- ***Which data structure to use:***
    - It is purely implementation dependent. 
    - One simple method is to maintain a **Dictionary Of Dictionaries**.
        - 
        - **key    :** _user id_ 
        - __value__: _Again a dictionary_
            - __key__  : _Similar User_
            - __value__: _Similarity Value_

Вычисление матрицы сходства фильм-фильм

  • Несмотря на то, что у нас есть мера схожести каждого фильма со всеми другими фильмами, мы обычно не заботимся о наименее похожих фильмах.
  • В большинстве случаев имеют значение только похожие предметы top_xxx. Это может быть 10 или 100.
  • Мы берем только самые популярные похожие фильмы и храним их в отдельном словаре.

Поиск наиболее похожих фильмов с помощью матрицы сходства

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

Похожие фильмы на «Журналы вампиров»

У нас около 17284 фильмов, похожих на «Журналы вампиров».

Топ-10 похожих фильмов

Точно так же мы можем найти похожих пользователей и сравнить, насколько они похожи.

Хорошо, теперь давайте рассмотрим некоторые модели машинного обучения.

4. Модели машинного обучения:

Библиотека сюрпризов:

Название СЮРПРИЗ расшифровывается как Простой системный движок рекомендаций Python.

Сюрприз был разработан с учетом следующих целей:

Установка

С пипсом

$ pip install scikit-surprise

С конда

$ conda install -c conda-forge scikit-surprise

Давайте посмотрим, что мы собираемся делать сейчас.

В этом тематическом исследовании мы широко используем библиотеку сюрпризов.

4.1 Данные выборки

Создайте образец данных поезда из данных поезда

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

4.2. Определение глобального среднего для всех рейтингов фильмов, среднего рейтинга для пользователя и среднего рейтинга для фильма (из отобранного поезда)

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

Определение средней оценки на пользователя

Определение средней оценки фильма

4.3 Особенности данных

Определение данных для задачи регрессии

Изменение данных о поездах

Чтение из файла для создания Train_dataframe

  • GAvg: средняя оценка всех оценок.
  • Похожие оценки этого фильма пользователями:
  • sur1, sur2, sur3, sur4, sur5 (топ-5 похожих пользователей, которые оценили этот фильм ..)
  • Похожие фильмы, оцененные этим пользователем:
  • smr1, smr2, smr3, smr4, smr5 (топ-5 похожих фильмов по рейтингу этого фильма ..)
  • UAvg: средний рейтинг пользователя.
  • MAvg: средняя оценка этого фильма.
  • рейтинг: оценка этого фильма данным пользователем.

Изменение тестовых данных

Чтение из файла для создания тестового фрейма данных

  • GAvg: средняя оценка всех оценок.
  • Похожие оценки этого фильма пользователями:
  • sur1, sur2, sur3, sur4, sur5 (топ-5 пользователей, которые оценили этот фильм).
  • Похожие фильмы, оцененные этим пользователем:
  • smr1, smr2, smr3, smr4, smr5 (топ-5 похожих фильмов по рейтингу этого фильма.
  • UAvg: средний рейтинг пользователя.
  • MAvg: средняя оценка этого фильма.
  • рейтинг: оценка этого фильма данным пользователем.

Преобразование данных для моделей-сюрпризов

Преобразование данных о поездах

  • Мы не можем предоставить необработанные данные (фильм, пользователя, рейтинг) для обучения модели в библиотеке Surprise.
  • У них есть отдельный формат для данных TRAIN и TEST, который будет полезен для обучения таких моделей, как SVD, KNNBaseLineOnly… .etc .., в Surprise.
  • Мы можем сформировать набор поездов из файла или из фрейма данных Pandas. Http://surprise.readthedocs.io/en/stable/getting_started.html#load-dom-dataframe-py

Преобразование тестовых данных

  • Testset - это просто список кортежей (пользователь, фильм, рейтинг). (Порядок в кортеже важен).

4.4 Применение моделей машинного обучения:

Глобальный словарь, в котором хранятся RMSE и MAPE для всех моделей.

  • Он хранит метрики в словаре словарей.

ключи: названия моделей (строка)

значение: dict (ключ: показатель, значение: значение)

Служебные функции для запуска регрессионных моделей

Вспомогательные функции для моделей Surprise

XGBoost с начальными 13 функциями

UAvg и MAvg - самые важные функции.

Неожиданная базовая модель

Predicted_rating: (базовый прогноз)

http://surprise.readthedocs.io/en/stable/basic_algorithms.html#surprise.prediction_algorithms.baseline_only.BaselineOnly

  • μ: среднее значение всех тренировок в обучающих данных.
  • bu: предвзятость пользователя.
  • bi: предвзятость позиции (предвзятость в отношении фильмов).

Функция оптимизации (задача наименьших квадратов)

http://surprise.readthedocs.io/en/stable/prediction_algorithms.html#baselines-estimates-configuration

XGBoost с начальными 13 функциями + предсказатель Surprise Baseline

Обновление данных о поездах

Обновление тестовых данных

UAvg и MAvg являются наиболее важными функциями, а bslpr - наименее важной функцией.

Сюрприз KNNBaseline predictor

  • sim (u, v) - Сходство между пользователями u и v.
  • Как правило, это будет косинусное подобие или коэффициент корреляции Пирсона.
  • Но мы используем усеченный коэффициент корреляции Пирсона с базовой линией, который основан на сходстве pearsonBaseline (мы берем базовые прогнозы вместо средней оценки пользователя / элемента).

Прогнозируемый рейтинг (на основе схожести элемента):

  • Обозначения соответствуют тому, что указано выше (прогнозируемый рейтинг, основанный на пользователях).

Удивите KNNBaseline сходством пользователей

Удивите KNNBaseline сходством фильма с фильмом

XGBoost с начальными 13 функциями + предиктор Surprise Baseline + предиктор KNNBaseline

  • Сначала мы запустим XGBoost с прогнозами от обоих KNN (которые используют сходство User_User и Item_Item вместе с нашими предыдущими функциями.
  • Затем мы запустим XGBoost только с прогнозами из моделей KNN и прогнозов из нашей базовой модели.

Подготовка данных о поездах

Подготовка тестовых данных

Методы матричной факторизации

Взаимодействие пользователей с фильмом на основе факторизации матрицы SVD



Прогнозируемый рейтинг:

  • qi - представление предмета (фильма) в латентном факторном пространстве.
  • pu - представление пользователя в пространстве новых скрытых факторов.

Проблема оптимизации взаимодействия элементов пользователя и регуляризации (во избежание переобучения)

Факторизация матрицы SVD с неявной обратной связью от пользователя (фильмы с рейтингом пользователей)

Прогнозируемый рейтинг:

  • Iu - набор всех элементов, оцененных пользователем u.
  • yj - наш новый набор факторов, учитывающих неявные оценки.

Проблема оптимизации взаимодействия элементов пользователя и регуляризации (во избежание переобучения)

Окончательная модель со всеми функциями и предсказателями:

XgBoost с 13 функциями + Surprise Baseline + Surprise KNNbaseline + MF Techniques

Подготовка данных о поездах

Подготовка тестовых данных

XgBoost с неожиданным исходным уровнем + неожиданный базовый уровень KNN + методы MF

Для всех моделей существует высокая важность характеристик.

4.5 Сравнение всех моделей

А теперь сравним все модели.

Лучшая модель, которая есть у нас, - СВД.

Здесь нас не сильно беспокоит наша RMSE, потому что мы не обучили ее на всех данных. Наша основная цель здесь - узнать больше о системах рекомендаций.

Если бы мы взяли все данные, мы бы определенно улучшили RMSE.

4.6 Будущая работа

  1. Здесь мы использовали 10K пользователей и 1K фильмов для обучения вышеуказанных моделей из-за проблем с оперативной памятью моего ноутбука. В будущем я собираюсь запускать весь набор данных с использованием облачных ресурсов.
  2. Настройте гиперпараметры всех вышеперечисленных моделей Xgboost, чтобы улучшить RMSE.

5. Ссылки

  1. Https://www.appliedaicourse.com/
  2. Https://www.yuspify.com/blog/cold-start-problem-recommender-systems/
  3. Http://surpriselib.com/
  4. Http://courses.ischool.berkeley.edu/i290-dm/s11/SECURE/a1-koren.pdf

Спасибо, что нашли время и прочитали мой блог, надеюсь, это вам поможет. Ура, счастливого обучения.