www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Создание Spotify «Discover Weekly» с помощью Spark

Дата публикации May 24, 2017

Сегодня третий день моей стажировки вNBC Universalи я вдохновлен на достижение новой цели: мастерингискраперед уходом30 Рок&1221 Кампус(где я буду проводить большую часть своего рабочего времени) этим летом.

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

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

Какой алгоритм использовать?

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

Достаточно известный пример реализациифильтрация контентаэтоМузыкальный проект Genomeонлайн радио Пандора. Здесь эксперт оценивает песню на основе сотен характеристик. Пользователь также предоставляет информацию о своих музыкальных предпочтениях. Рекомендации сделаны на основе сопряжения этих двух источников.

В то время как Pandora использует контентную фильтрацию, Spotify используетсовместная фильтрациядля нихОткройте для себя Еженедельносистема рекомендаций. Этот последний метод использует вход / поведение предыдущих пользователей, чтобы делать будущие рекомендации. Мы игнорируем любыеаприориинформация о пользователе или объекте. Мы используем рейтинги похожих пользователей для прогнозирования рейтинга.

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

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

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

Почему Спарк?

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

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

Кроме того, Spark предоставляет инженерам данных и ученым данных мощный, унифицированный механизм, который не только быстр (В 100 раз быстрее, чем Hadoop для крупномасштабной обработки данных) и простой в использовании, но также простой, легко масштабируемый и эффективно интегрируемый с другими инструментами, такими как R, SQL, Python, Scala и Java.

Источник:Инфомир Аналитика

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

Пошаговая реализация с использованием PySpark

Теперь мы реализуем алгоритм совместной фильтрации для построения системы рекомендаций по аудио с использованиемНабор данных AudioScribbler(скачать сжатый архивВот).

Импорт библиотек и наборов данных

Когда у вас есть три файла в наборе данных, вы можете начатьspark-shell, Первый шаг в построении модели - понять ваши данные и разобрать их в формы, которые полезны для анализа в Spark. Давайте начнем с импорта библиотек и инициализации вашегоSparkContextначать кодирование с PySpark.

import findspark
import pyspark
from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.mllib import recommendation
from pyspark.mllib.recommendation import *'''initialize spark in VM'''findspark.init('/usr/local/bin/spark-1.3.1-bin-hadoop2.6/')
try:
sc=SparkContext()
except:
None

Затем сохраните каждый файл в переменной.user_artist_data текстпредставляет набор данных списка воспроизведения, где каждая строка файла содержит идентификатор пользователя, идентификатор исполнителя и счетчик воспроизведения, разделенные пробелами.artist_data.txtсодержит непрозрачные числовые идентификаторы, связанные с именами артистов.artist_alias.txtсопоставляет идентификаторы артиста, которые могут быть написаны с ошибками или нестандартно, с идентификатором канонического имени артиста. Он содержит два идентификатора в строке, разделенных вкладкой.

'''define variables'''rawUserArtistData = sc.textFile("vagrant/user_artist_data.txt")
rawArtistData = sc.textFile("vagrant/artist_data.txt")
rawArtistAlias = sc.textFile("vagrant/artist_alias.txt")

Данные предварительной обработки

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

def pairsplit(singlePair):
splitPair = singlePair.rsplit('\t')
if len(splitPair) != 2:
return []
else:
try:
return [(int(splitPair[0]), splitPair[1])]
except:
return []
artistByID = dict(rawArtistData.flatMap(lambda x: pairsplit(x)).collect())

Мы также используемartist_alias.txtсопоставить «плохие» идентификаторы исполнителей с «хорошими», вместо того, чтобы просто использовать их в качестве необработанных пар данных идентификаторов исполнителей. Мы конвертируем плохие идентификаторы в хорошие, используя коды ниже. Например, первая запись отображает ID 6803336 на 1000010, что означает, что она отображает «Aerosmith (unplugged)» на «Aerosmith».

def aliaslookup(alias):
splitPair = alias.rsplit('\t')
if len(splitPair) != 2:
return []
else:
try:
return [(int(splitPair[0]), int(splitPair[1]))]
except:
return []
artistAlias = rawArtistAlias.flatMap(lambda x: aliaslookup(x)).collectAsMap()

Построить модель

Затем мы создаем функцию поиска для преобразования данных в объекты рейтинга. Обратите внимание, что любой основнойMLlibмоделям потребуются продукты в качестве объективной меры. В нашей модели изделия являются художниками. Поэтому мы будем использоватьuser_artist_data.txtдля реализации наших данных поезда.

def ratinglookup(x):
userID, artistID, count = map(lambda line: int(line), x.split())
finalArtistID = bArtistAlias.value.get(artistID)
if finalArtistID is None:
finalArtistID = artistID
return Rating(userID, finalArtistID, count)trainData = rawUserArtistData.map(lambda x: ratinglookup(x))
trainData.cache()

Мы также создаем широковещательную переменную под названиемbArtistAliasдляartistAlias, Это позволяет Spark отправлять и хранить в памяти только одну копию для каждого исполнителя в кластере. Когда есть тысячи задач, и многие из них выполняются параллельно для каждого исполнителя, это может сэкономить значительный сетевой трафик и память.

bArtistAlias = sc.broadcast(artistAlias)

Наконец, мы строим нашу модель, используясовместная фильтрацияАлгоритм работает следующим образом. Операция, вероятно, займет несколько минут или более в зависимости от вашего кластера. Мне потребовалось около 15 минут, чтобы запустить модель.

'''build model'''model = ALS.trainImplicit(trainData, 10, 5)

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

'''test artist'''spotcheckingID = 2093760
bArtistByID = sc.broadcast(artistByID)rawArtistsForUser = (trainData
.filter(lambda x: x.user == spotcheckingID)
.map(lambda x: bArtistByID.value.get(x.product))
.collect())
print(rawArtistsForUser)

Получите ваши рекомендации

Я хочу взять 10 лучших песен на основе моей модели данных:

'''output recommendations'''recommendations = map(lambda x: artistByID.get(x.product), model.call("recommendProducts", spotcheckingID, 10))
print(recommendations)

Запуск это на моемСпарк В.М.кластер, я получил следующий вывод:

  • Jay Z, 50 Cent, Snoop Dogg, 2Pac, Nas, Kanye West, Outkast, Eminem, Dr. Dre и Ludacris.
Скриншот вывода моей модели. Обратите внимание, что ваши 10 лучших песен в списке могут быть в случайном порядке.

Да, артисты выглядят как смесь рэперов! Помните, что этот набор художников был очень популярен в течение 2005 года, когда был выпущен этот набор данных.

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

Надеюсь, вам понравится и счастливого взлома!

Справочник по кодированию

Вы можете найти мои оригинальные коды здесь:https://github.com/moorissa/audiorecommender


Мурисса - аспирант, в настоящее время изучающая машинное обучение в Колумбийском университете, и надеется, что когда-нибудь она сможет использовать эти навыки, чтобы сделать мир лучше, один день за один раз.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map