Определение проекта

Проблема и мотивация

Любой, кто использует Spotify (или любое другое музыкальное программное обеспечение), сталкивался с плейлистами. Плейлисты — это способ хранить различные треки в одном списке, чтобы вы могли вернуться к своей любимой песне позже. Обычно списки со временем засоряются. Так же как и плейлисты Spotify.

Вы когда-нибудь были в утренней поездке на работу, раскачивая свои любимые песни, а затем вдруг следующая песня в очереди просто взорвала вашу мелодию, потому что она просто не совсем подходит? Spot-On-Playlist-Organizer решает эту проблему, убирая списки воспроизведения и реорганизуя данный список воспроизведения в несколько меньших. Он принимает во внимание различные особенности ваших треков, чтобы сгруппировать (кластерировать) их. Цель состоит в том, чтобы сгруппировать похожие треки в плейлисты.

Метрики

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

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

Оценка силуэта оценивает кластер по тому, насколько хорошо точка данных вписывается в этот кластер, а не в другие. Другими словами, он отвечает на вопрос: находится ли эта точка здесь в наилучшем возможном кластере?

Анализ

Исследование

Подробное исследование данных можно найти в моем профиле Github: https://github.com/nsiicm0/Spot-On-Playlist-Organizer/blob/v0.1/data_exploration.ipynb.

Я использовал различные звуковые функции, предоставляемые Spotify. После нашей очистки и обработки почти ни один из признаков не коррелирует, что хорошо для нашей кластеризации.

Методология

Выполнение

Приложение можно найти в моем профиле Github вместе с инструкциями по его запуску: https://github.com/nsiicm0/Spot-On-Playlist-Organizer.

В следующих строках это приложение упоминается как «эталонное приложение».

Результаты

В нашем эталонном приложении я использовал особый вид плейлиста. Плейлисты состоят (на момент публикации) примерно из 1000 треков. Источником этого плейлиста является еженедельно создаваемый плейлист «Ваш микс недели» от Spotify. Так что треки в плейлисте все очень похожи, иначе Spotify не рекомендовал бы их нам. Тем не менее, мой личный музыкальный вкус колеблется между рок-треками и EDM (электронной танцевальной музыкой). Это рисует забавную картину в агрегированном плейлисте. Одну неделю Spotify рекомендует мне электронную музыку (более мягкие и жесткие треки), а на другой неделе Spotify рекомендует мне рок-музыку (более или менее похожие треки).

Как выглядят данные?

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

Оценка и обоснование

Для этого проекта использовались различные методы кластеризации.

  • kMeans
  • ДБСКАН
  • AffinityPropagation

kMeans:
Эталонное приложение реализует kMeans как «несложный» алгоритм кластеризации. Метод kMeans использовался с методом локтя для определения соответствующего количества кластеров.

Как мы видим на рисунке выше, кривая локтя не совсем хорошо показывает соответствующее k (количество кластеров). Для нашего эталонного приложения я выбрал k=2, так как это хорошее количество списков воспроизведения, и, учитывая знание списка воспроизведения под рукой, это кажется хорошим выбором. Результаты вполне хорошие.

Результат кластеризации kMeans выглядит почти как идеальный алгоритм кластеризации. Есть две вещи, которые заставили меня рассмотреть дополнительные методы кластеризации:

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

DBSCAN:

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

Если присмотреться, мы можем распознать два класса кластеров (красный и голубой). К сожалению, это не то, что мы искали. Таким образом, я отказался от алгоритма DBSCAN, так как он мог не очень хорошо подходить для нашей задачи.

Распространение сходства:

Affinity Propagation — это еще один неконтролируемый алгоритм кластеризации, реализованный как «сложный» алгоритм кластеризации в эталонном приложении. Опять же, я использовал перекрестную проверку поиска по сетке с оценкой силуэта в качестве показателя производительности, чтобы определить идеальную конфигурацию для алгоритма.

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

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

Вывод

Отражение

В этом проекте я реализовал приложение, которое позволяет мне извлекать треки из плейлиста на Spotify. Затем данные используются для поиска похожих треков и объединения их в новые списки воспроизведения.

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

Во время моего проекта я немного потрудился после того, как увидел результаты kMeans и DBSCAN. Мне потребовалось некоторое время, чтобы наткнуться на AffinityPropagation. У меня также были некоторые проблемы с пониманием результатов кластеризации. Оглядываясь назад, становится очевидным, что имеющиеся данные взяты из особого списка воспроизведения. Плейлист состоит из треков, рекомендованных Spotify. Таким образом, они уже подходят под определенный профиль, иначе Spotify не рекомендовал бы их мне. Если бы я нашел значительное количество кластеров, я бы фактически сломал механизм рекомендаций Spotify, что я сомневаюсь, что смогу сделать.

Учитывая обстоятельства, я очень доволен результатом.

Улучшение

Я вижу возможности для улучшения этого приложения по следующим темам:

  • Правильная реализация (не полагающаяся на Spotipy) и надежный доступ к API.
  • Дополнительные функции, которые необходимо включить в кластеризацию. В настоящее время мы используем функции, предоставляемые Spotify (предустановленные). Spotify предлагает API для анализа звука, который позволяет разрабатывать пользовательские функции. Это позволило бы разработать детализированную разработку функций.

Отказ от ответственности

Этот проект был представлен в рамках Udacity Data Science Nano Degree. Он послужил краеугольным камнем проекта.