Создание рекомендаций Spotify с помощью науки о данных

Вступление

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

В этой статье дается более подробный обзор этого проекта. Код и результаты можно найти на GitHub здесь.

Данные Spotify

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

Доступ к Spotify API

Чтобы начать работу с нашими музыкальными данными, нам сначала нужно получить доступ к Spotify API:

  1. Создайте учетную запись Spotify для разработчиков
  2. Из панели управления настройте проект (необходим для доступа к API)
  3. Получите идентификатор клиента, секрет клиента и настройте URI перенаправления (в локальных проектах я установил для него значение http: // localhost: 9001 / callback)
  4. Ознакомьтесь с документацией по API.

Музыкальные данные

После настройки учетной записи разработчика мы можем получить доступ к API для извлечения музыкальных данных. Для этого мы можем использовать пакет Python spotipy, которому нужны данные разработчика, которые мы настроили ранее для предоставления разрешений через OAuth.

with open("spotify/spotify_details.yml", 'r') as stream:  
    spotify_details = yaml.safe_load(stream)
# https://developer.spotify.com/web-api/using-scopes/
scope = "user-library-read user-follow-read user-top-read playlist-read-private" 
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(
    client_id=spotify_details['client_id'],
    client_secret=spotify_details['client_secret'],
    redirect_uri=spotify_details['redirect_uri'],    
    scope=scope,)
)

Теперь мы можем извлекать данные из различных источников в нашей библиотеке Spotify. Класс sp имеет функции для этого, такие как sp.current_user_playlists() и sp.current_user_top_tracks(). Из этих вызовов API нам нужно извлечь детали дорожки, такие как уникальный идентификатор, имя, продолжительность и жанры, а также связанные свойства исполнителя, альбома и списка воспроизведения. Я сохранил их как фреймы данных pandas для простоты анализа.

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

Рекомендательные системы

Машинное обучение

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

Классификаторы XGBoost и RandomForest хорошо себя зарекомендовали здесь.

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

Рекомендация по популярности

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

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

Контент-рекомендатель

Рекомендатель на основе содержимого использует атрибуты элементов, с которыми взаимодействовал пользователь, чтобы рекомендовать аналогичные элементы. Здесь используется популярный метод TF-IDF для преобразования неструктурированного текста (униграммы и биграммы жанров и названия песни / исполнителя / альбома / плейлиста) в разреженную матрицу. Косинусное сходство между пользовательским вектором и исходной матрицей (все пользователи) затем дает метрику для рекомендации новых треков.

Похоже, жанр - самая сильная форма контента, на котором основываются рекомендации по трекам.

Совместная рекомендация

Рекомендации для совместной работы могут быть основаны либо на памяти (на основе прошлых взаимодействий с пользователем), либо на модели (например, кластеризации). Здесь матрица элементов × пользователи затем используется, чтобы рекомендовать элементы пользователям на основе взаимодействий схожих пользователей.

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

Гибридный рекомендатель

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

Субъективно этот советник дает лучшие практические рекомендации!

Финальный плейлист и мысли

Теперь мы можем добавить наши треки в плейлист Spotify для прослушивания! Создайте массив tracks_to_add идентификаторов треков, где сила рекомендации превышает определенное значение.

# Create a new playlist for tracks to add
new_playlist = sp.user_playlist_create(
    user=spotify_details['user'], 
    name="spotify-recommender-playlists",
    public=False, 
    collaborative=False, 
    description="Created by https://github.com/anthonyli358/spotify- recommender-systems",
)

# Add tracks to the new playlist
for id in tracks_to_add:
    sp.user_playlist_add_tracks(user=spotify_details['user'], 
                                playlist_id=new_playlist['id'], 
                                tracks=[id],
                               )

Надеюсь, плейлист 🔥. Чтобы еще больше улучшить рекомендации, мы могли:

  • Расширьте набор данных, чтобы включить других пользователей
  • Разработайте другие метрики оценки (здесь использовалась метрика точности Top-N)