Каков наилучший способ сломать компьютер? Создайте механизм рекомендаций с матричной факторизацией из набора данных объемом 12 ГБ на своем ноутбуке.
Если вы хотите создать механизм музыкальных рекомендаций с методом совместной фильтрации, а ваш набор данных содержит 21 866 пользователей и 151 499 музыкальных композиций, технически вы обучаете модель прогнозировать, понравится ли каждому пользователю та или иная музыка. Если вы сделаете математику, модель будет обучена для каждого значения:
21866 x 151499 = ~3 300 000 000 (да, миллиардное уникальное значение)
Ну, это тот случай, который вы узнаете здесь. К счастью, у нас есть решение для этого со средой Spark, в которой работает кластер AWS EMR (уменьшенная эластичная карта).
Набор данных!
Здесь я работал с набором данных «Sparkify», который представлял собой набор данных событий с платформы потоковой передачи музыки.
Набор данных был получен из курса Udacity Data Scientist Nanodegree. (Спасибо Udacity!)
Вот схема набора данных.
Давайте посмотрим на первую строку набора данных.
В этом проекте я сосредоточусь только на создании механизма рекомендаций с помощью совместной фильтрации. Поэтому я сосредоточусь только на том, какая песня нравится или не нравится пользователям.
Давайте проверим, какая страница доступна в наборе данных, и подсчитаем, сколько раз она встречается в таблице.
На изображении выше мы видим, что NextSong является основным событием, и дальнейшее углубленное изучение покажет, что это страница, на которой пользователь воспроизводит песню.
Вернемся к основной цели. Я буду использовать страницу «Большие пальцы вверх» и «Большие пальцы вниз», чтобы предсказать, какая песня нравится пользователю, а какая нет.
Давайте сосредоточимся на этих данных о событиях.
Хм, кажется, набор данных не хранит значение песни в данных Thumbs. Это может быть со страницы NextSong до того, как пользователь нажмет палец вверх/вниз.
Давайте углубимся только в данные одного пользователя. Мы увидим userId=1526624
Да, похоже, что пользователь слушает песню (записанную на странице NextSong), а затем устанавливает палец вверх или вниз, нравится это пользователю или нет.
В порядке! Давайте манипулируем набором данных, используя функцию окна задержки в Spark SQL. Запрос будет генерировать уникальное значение для каждого пользователя и песни из-за группировки по функциям. Каждая строка будет представлять, нравится ли пользователю музыка или нет (1 — нравится, 0 — не не нравится). Вот результат после обработки
Давайте изучим данные! Далее мы увидим, сколько уникальных песен и пользователей в наборе данных.
Всего в наборе данных 151499 уникальных песен и 21866 уникальных пользователей.
Здорово! Давайте посмотрим, насколько вероятно, что пользователю понравится песня. Следующая статистика покажет, сколько песен оценивают пользователи.
В среднем пользователь оценивает 62песни в наборе данных, в среднем 37 песен.
С другой стороны, мы посмотрим, как пользователи могут оценивать песни. Следующая статистика покажет, сколько пользователей оценивает каждую песню:
В среднем песни, полученные от 9 пользователей, в среднем 2 пользователя. С точки зрения песни мы можем видеть, что многие песни оцениваются только небольшим набором пользователей (судя по медиане для 2 пользователей). Но это должно быть хорошо, потому что наш механизм прогнозирования рассчитает скрытые факторы, внутреннюю ценность песни, которая нравится пользователю.
Прохладный! Судя по приведенной выше статистике, у нас достаточно данных для создания механизма рекомендаций.
Давайте создадим механизм рекомендаций!
Изначально я планировал использовать метод FunkSVD (победитель конкурса Netflix Prize Challenge) как часть совместной фильтрации.
Однако, покопавшись в сети. Я нашел эту прекрасно написанную статью (Спасибо автору, Кевину Ляо): https://towardsdatascience.com/prototyping-a-recommender-system-step-by-step-part-2-alternating-least-square-als -матрица-4a76c58714a1
Он предлагал построить совместную фильтрацию с использованием матричной факторизации чередующихся наименьших квадратов (ALS). Поскольку его можно масштабировать с помощью больших данных и выполнять в среде Spark (со встроенной функцией). Пожалуйста, прочитайте статью Кевина Ляо для более подробной информации.
Затем я создаю кодовую базу по алгоритму, предоставленному Кевином Ляо. Однако в нашем случае набор данных представляет собой двоичную единицу или 0 вместо рейтинга от 1 до 10. Поэтому нам придется немного обновить код, чтобы получить двоичные результаты.
Прогноз алгоритма ALS для данного набора данных поезда даст нам результат в диапазоне 0–1. В коде я указываю, если прогнозируемый результат выше 0,5, мне будет приписано 1, а остальным будет 0.
А оценочную матрицу я найду для той модели, которая даст нам наивысшую точность прогноза.
Вот фрагменты кода:
Показатели
При оценке модели я измерял точность, воспроизводимость и полноту прогнозируемого значения. Почему?
Точность. Метрика определяет, правильно ли модель предсказывает, понравится музыка пользователю или нет. Если у вас точность 0,88, то 88 из 100 ваших предсказанных значений верны (нравится это пользователю или нет).
Напоминаем, этот показатель будет определять, насколько хорошо модель «улавливает» всю музыку, которая нравится пользователю. Если у вас есть отзыв 0,95, из 100 песен, которые нравятся пользователю, 95 предсказаны правильно.
Точность. Этот показатель определяет, насколько хорошо модель рекомендует музыку. Если у вас есть точность 0,90, из 100 рекомендаций по песням 90 будут понравиться пользователю.
Теперь давайте обучим модель!
Сначала я пытаюсь использовать следующий параметр Hyper (без GridSearch):
- макситер: 10
- regParam: [0,05]
- ранг: [20]
Первое испытание модели привело к точности предсказания модели на 88,6%. Звучит отлично. Попробуем для другого значения
Мы попробуем использовать другой гиперпараметр:
- макситер: 10
- regParam: [0,05]
- ранг: [30]
Я вам скажу, у меня ушло 1 час на запуск кода (поэтому я пропускаю использование gridSearch, он меня постоянно подводил)
Таким образом, вторая попытка дает нам немного большую точность. С точностью 89,1% по данным проверки.
Отсюда мы понимаем, что обе модели уже имеют высокую точность в прогнозировании того, понравятся песни пользователю или нет. Далее давайте попробуем предсказать, какую песню пользователь может поставить «большой палец вверх» после ее прослушивания.
Давайте дадим им нашу рекомендательную песню для пользователей!
Мы вернемся к модели, созданной в результате первого обучения.
Далее мы создадим фрейм данных Spark, который содержит строки всех песен и пользователя, чтобы оценить, понравится ли ему музыка или нет. Мы выбираем пользователя 1000025 в качестве нашей цели.
Поместив фрейм данных в качестве входных данных модели, мы получим нашу рекомендацию песни для пользователя! Результат был отфильтрован по всем песням, которые были оценены пользователем.
Отражение и возможное улучшение
Создание механизма рекомендаций с помощью ALS в Spark довольно интересно, поскольку позволяет нам создавать механизм рекомендаций ALS с очень большим набором данных поверх инфраструктуры параллельных вычислений. Удивительно, но модель обладает высокой точностью, точностью и полнотой предсказания, понравятся песни пользователю или нет.
В этом механизме рекомендаций есть несколько возможных улучшений и последующих действий:
- Мы можем порекомендовать песню, которая, скорее всего, будет оценена положительно, но пользователь никогда ее раньше не слушал (фильтрация на странице NextSong).
- Мы можем измерить увеличение вовлеченности пользователей после того, как песня была рекомендована.
- Мы также можем сравнить фактический рейтинг с прогнозируемым для рекомендованной песни.
Построить модель сложно, потому что для построения и измерения модели требуется много времени. Однако приятно видеть, что результат дает нам довольно высокую точность предсказания.
Пожалуйста, найдите ссылку на git hub здесь, чтобы увидеть процесс исследования данных и процесс создания модели.
Ах, я нашел тот, который заставляет мой компьютер зависать. Это я не знал среду spark для работы с большими данными
Ссылка: