Прогнозирование потоковой передачи 200 лучших песен Spotify

Введение

Это заключительная часть моей серии статей о прикладном байесовском выводе. В части 1 я познакомил с условным миром и вероятностным программированием:



Во второй части я показал, как можно масштабировать свои модели до «реальных» данных, моделируя обувь Nike и Adidas. В этой статье показано, как можно проводить более эффективные A / B-тесты и групповые сравнения:



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

В этой статье мы рассмотрим данные Spotify, а именно 200 лучших песен за 2020–2021 годы. Вы можете найти набор данных здесь: https://www.kaggle.com/sashankpillai/spotify-top-200-charts-20202021. Мы попытаемся смоделировать апостериорную часть потоков для каждой песни на основе характеристик, связанных с каждой песней (танцевальность, подписчики исполнителей и т. Д.)

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

Dtypes - отличное место для начала:

Это определенно потребует некоторой очистки. Кроме того, поскольку они являются объектами, у них, вероятно, будет странный текст, который нужно очистить, чтобы сделать числовым. Между тем, самым большим изменением, которое мне потребовалось, стала колонка «Жанр». Кажется, что каждая песня соответствует ≥1 жанру, который представлен в виде списка. В нашем случае мы хотим использовать One Hot Encode для этих столбцов. Это легко сделать с помощью MultiLabelBinarizer из sklearn.

Это должно быть намного лучше! Теперь мы хотим разделить столбцы по типу, чтобы 1. исправить dtype и 2. отфильтровать, чтобы с чего начать. Отсюда мы можем построить распределение потоков, чтобы увидеть, на что мы нацелены.

Регрессии - это обычная практика для центрирования или стандартизации ваших ценностей, и здесь все ничем не отличается. Фактически, стандартизация ваших значений может быть особенно важной с моделями MCMC, поскольку в противном случае сэмплеру будет трудно сойтись. Стандартизация может иметь еще одно преимущество для нас, которое заключается в возможности использовать слабые информативные априорные значения, поскольку пересечение всегда будет равным нулю и наклону около -1 и 1. Это также позволяет нам говорить о Z-показателях, определяя, сколько стандартных отклонений значения взяты из среднего.

0

Пока мы будем работать только с этими числовыми полями; более поздняя реализация этого может легко масштабироваться, чтобы включить категориальные столбцы, которые мы OneHotEncoded ранее (жанр).

Это обычная форма распределения, которую мы видим во многих сценариях. Это следствие того, что многие люди имеют «более низкие» значения и экспоненциально меньше по мере того, как вы заходите дальше в хвосте вправо. Интересно, что мы находим его таким сильным даже для песен из 200 лучших, но это будет важная часть, которую нужно помнить, когда мы будем моделировать эту апостериорную.

Для начала возьмем график стандартизированного журнала Streams:

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

Простая регрессия

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

Хорошая практика - сначала понять отношения; Как подписчики исполнителя соотносятся с потоками в топ-200?

Едва ли корреляция, которая, кажется, имеет смысл, поскольку это уже очень популярные песни - здесь может быть даже обратная корреляция (когда новая песня попадает в Топ-200, число подписчиков этого исполнителя значительно увеличивается). Подобные идеи невероятно важно понимать не только перед моделированием, но и когда приходит время делать выводы из результатов. К настоящему времени каждый должен понять, что корреляция! = Причинная связь, но в каком направлении может течь корреляция? И почему? Это может дать потрясающее представление о том, как исправить проблемы в вашей модели или какие данные вы можете захотеть обработать, чтобы улучшить свою модель.

Интересно то, что мы создаем априор для беты (вес x, последователи художника) и смещение, а затем создаем линейную функцию (альфа + бета * x) для моделирования вероятности. Помните, что мы пытаемся смоделировать апостериорную вероятность как функцию априорных значений, но когда мы делаем это таким образом, мы можем количественно оценить распределение значений на основе неопределенности наблюдаемых значений. Мы хотим заключить mu в детерминированную функцию, потому что мы не хотим, чтобы она каждый раз была разной; он всегда должен следовать за следствием альфа + бета * x, но альфа и бета имеют стохастические априорные значения, которые позволяют модели сканировать для них ряд вариантов.

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

Теперь мы можем выбрать данные. NUTS (пробоотборник без разворота) - фантастический выбор для большинства случаев использования. Хотя он может быть медленнее на шаг, чем Метрополис, он может преодолевать диагональные пространства с меньшими трудностями. Кроме того, обычно требуется гораздо меньше шагов, чтобы получить разумное приближение к апостериорной.

Мы не видим заметных расхождений в следах, а стандартизация / центрирование значительно помогла нашей модели найти подходящие распределения для каждой песни. Давайте посмотрим на наш r2 и нанесем на график результаты.

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

Надежная линейная регрессия и прогнозирование вне выборки

Мы получили резкое улучшение подгонки линии к нашим данным - ~ 0,16! Технически, поскольку мы стандартизировали данные, наклон и коэффициент корреляции Пирсона имеют одинаковое значение, но это действительно интересный способ встроить их в ваше моделирование. По-прежнему не лучший предсказатель потоков, но мы можем видеть, как меньше вероятность того, что эта линия будет захвачена потенциальными выбросами в нашем наборе данных. Хотя это принесло бы нам мало пользы, мы также можем легко обновить наши данные и предсказать апостериорную, используя эту модель в тестовом наборе данных.

Mean Squared Error: 0.6710557105827462

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

Войдите в BAyesian Model-Building Interface - Bambi.

Множественные, иерархические и обобщенные линейные модели

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

Кажется, что «Энергия» и «Громкость» более взаимосвязаны, чем мы хотели бы. Это может вызвать множество проблем при попытке смоделировать связь между этими переменными, чтобы мы могли ее удалить.

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

Множественная линейная регрессия

Используя Bambi, мы можем легко написать нашу формулу и приготовить модель следующим образом:

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

Mean Squared Error: 0.5720862510645325

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

MSE значительно лучше, поскольку мы добавляем больше функций конкретной песни (танцевальность, валентность, энергия и другие). При оценке средних значений в сводке подобранной модели интересно, что Followers, по-видимому, имеют самый сильный эффект для увеличения Log_Streams по сравнению с другими значениями. Такие функции, как Danceability и Speechiness, по-видимому, оказывают негативное влияние на Log_Streams, но важно отнестись к этим функциям с долей скептицизма, поскольку я не совсем уверен, как Spotify записывает эту информацию (не говоря уже о том, как кто-то мог манипулировать ею, чтобы получить в Kaggle).

Важный вопрос, который вы, возможно, уже осознали, - это как насчет вариаций песен артистов? В настоящее время мы моделируем каждую песню индивидуально (не в пуле), но мы также можем моделировать песни каждого исполнителя (объединенные). Проблема с каждым из них в том, что ради этого нужно чем-то отказываться. С unpooled вы теряете способность видеть нюансы в творчестве художников; с объединением вы теряете детализацию распределения каждой песни. Так что мы можем сделать? На помощь приходит иерархический частичный пул!

Иерархический частичный пул

Это выглядит намного сложнее, но на самом деле все очень просто. Вся концепция байесовского вывода, которую мы до сих пор усвоили, заключается в том, что вы можете использовать предыдущие знания и моделировать апостериорное распределение, которое подходит для обновления по мере формирования новых знаний. Пока мы смоделировали только непосредственные априорные значения (например, априорные вероятности mu и sigma для нормального правдоподобия), но что, если наши данные имеют иерархический характер? Разве не было бы замечательно, если бы мы могли смоделировать распределение метаданных песен по исполнителям? Короткий ответ: мы можем и легко. Это иерархическая модель, и она включает в себя добавление гиперприоров к вашим априорным значениям; в этом случае мы добавляем группировку функций метаданных песни по исполнителю и добавляем гиперприоры к нашим приоритетам вместе с нашей вероятностью.

В блоке кода мы можем обозначить, что нам нужна иерархическая модель, добавив «(1 |…)» к каждой функции, а затем просто добавив приоритетные значения к значениям соответствующим образом. Синтаксис можно разбить следующим образом:

  • Общие предикторы - это ваши основные эффекты. Например, Danceability.
  • Групповые предикторы можно определить тремя разными способами: 1. (Танцевальность | Артист) указывает, что мы хотим позволить каждому артисту иметь свой собственный наклон и перехват для Танцевальности, 2. (1 | Артист) указывает, что мы хотели разные перехваты для Артиста. но не склоны, и 3. (0 + Danceability | Artist) указывает, что нам нужны только наклоны, специфичные для каждого исполнителя, без включения перехвата, специфичного для исполнителя.

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

К сожалению, в Bambi нет текущей функции (версия 0.6.3) для прогнозирования вне выборки, когда вы еще используете иерархическое группирование по категориям, но наша модель, похоже, точно так же изучает распределение. Преимущество частичного объединения состоит в том, что мы можем не только увидеть апостериорное распределение в этом отношении, но и измерить влияние, которое оказало распределение атрибутов песни каждого исполнителя. Вот несколько примеров по популярности:

Хотя иерархическое моделирование чрезвычайно увлекательно, совершенно очевидно, что мы не можем полностью смоделировать наблюдаемое распределение так эффективно. На самом деле это связано с его негауссовой формой. Мы пытаемся смоделировать это с помощью линейных моделей, которые предполагают уровень нормальности, которого в действительности мы просто не видим. Более того, наши Streams никогда не опускаются ниже 0, поэтому наши Log_Streams никогда не опускаются ниже 0 (наименьшее возможное количество Stream - 1 и дискретное). Как мы можем это смоделировать?

Обобщенные линейные модели

Обобщенные линейные модели невероятно легко реализовать в Bambi, и они являются решением нашей проблемы. Наши потоки обычно не распространяются по своей природе, поэтому нам следует подумать о том, как эффективно моделировать их реальную природу. Хорошим началом является руководство, которое я изложил в части 1 - как мы думаем, собираются эти данные? Потоки - это счетная мера; они отражают количество раз, когда песня была проиграна на Spotify. К счастью для нас, существует популярный тип GLM, который моделирует именно это: Пуассон. Вот как мы реализуем это с помощью Bambi и результатов (обратите внимание, как мы прямо сейчас моделируем Stream).

Mean Squared Error: 0.2989611604295006

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

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

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

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

По умолчанию AriZ использует перекрестную проверку без исключения. Другой вариант - широко применяемый информационный критерий (WAIC). Поскольку результаты представлены в логарифмической шкале, лучшее прогнозное соответствие вне выборки дает модель с наивысшим значением, которая, как мы видели ранее, является Обобщенной линейной моделью.

Вывод

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

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

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

Ссылки

[1] Освальдо Мартин, Байесовский анализ с помощью Python

[2] PyMC3, GLM в PyMC3: прогнозы вне выборки

[3] PyMC3, (Обобщенные) линейные и иерархические линейные модели в PyMC3

[4] PyMC3, GLM: регрессия Пуассона

[5] PyMC3, Иерархический частичный пул

[6] PyMC3, Учебник по байесовским методам многоуровневого моделирования

[7] Бэмби, Уолд и гамма-регрессия (австралийские страховые выплаты 2004–2005 гг.)

[8] Бэмби, Многоуровневая регрессия

[9] Бэмби, Логистическая регрессия и сравнение моделей с Bambi и ArviZ

[9] Бэмби, Иерархическая логистическая регрессия с биномиальным семейством