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

О наборе данных:

Итак, здесь мы собираемся выбрать набор данных, известный как Набор данных Spotify Hit Predictor (1960–2019), который содержит данные о песнях за последние шесть десятилетий. Набор данных состоит из функций для треков, полученных с помощью веб-API Spotify. Треки помечены 1 или 0 (Хит или Провал) в зависимости от некоторых критериев автора. Набор данных можно найти здесь.

Импорт библиотек:

Итак, мы начинаем анализ, создавая блокнот jupyter «spotify-popularity-prediction-01.ipynb» и импортируя обязательные библиотеки:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns

После импорта основных библиотек мы собираемся импортировать библиотеки, необходимые для построения текстовых данных и разработки для них модели ML. Здесь мы собираемся использовать библиотеку sci-kit.

Scikit-learn в основном используется для классического машинного обучения, такого как линейная и логистическая регрессия, деревья решений и k-ближайших соседей. Он также имеет некоторые инструменты предварительной обработки текста, такие как набор слов и tf-idf, которые широко используются для анализа текста. TensorFlow больше используется для задач глубокого обучения и может быть излишним для простых задач анализа текста.

from sklearn.model_selection import train_test_split
from sklearn import preprocessing
#Model
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import LinearSVC, SVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier

Чтение данных:

Набор данных состоит из 6 подмножеств, созданных в соответствии с десятилетиями, т. Е. Набором данных 00, 10 и т. Д. Чтобы прочитать данные из всех подмножеств вместе, нам нужно объединить их и передать в один набор данных:

data = [pd.read_csv(f'dataset-of-{decade}0s.csv') for decade in ['6', '7', '8', '9', '0', '1']]

Теперь объедините данные в один набор данных и управляйте индексацией и последовательностью таким образом, чтобы набор данных начинался с 1960 года и заканчивался в 2010 году.

for i, decade in enumerate([1960, 1970, 1980, 1990, 2000, 2010]):
    data[i]['decade'] = pd.Series(decade, index=data[i].index)

data = pd.concat(data, axis=0).sample(frac=1.0, random_state=1).reset_index(drop=True)

Профилирование панд:

Pandas Profiling предоставляет быстрый и всесторонний EDA для Pandas DataFrame, который помогает в очистке данных, разработке функций и моделировании. Следовательно, мы создадим профиль pandas для быстрого анализа данных:

from pandas_profiling import ProfileReport
prof = ProfileReport(data)
prof.to_file(output_file='output.html')

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

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

Вы можете создать отчет и просмотреть его в деталях самостоятельно. Наслаждайтесь!!

Исследовательский анализ данных (EDA):

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

data.head()
data.info()

Одномерный анализ:

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

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

Мы собираемся с выходным параметром «цель». Чтобы узнать, сколько у него различных значений, мы проверяем количество его значений:

print(data['target'].value_counts())

Благодаря этому мы обнаруживаем, что он имеет 2 значения: «1» и «0», и это можно превратить в модель классификации.

Чтобы построить график вклада целевой переменной, мы строим график подсчета:

sns.countplot(x='target', data=data)
plt.show()

Рассчитайте долю целевых значений, равных 1:

prop_1 = data[data['target'] == 1].shape[0] / data.shape[0]
print("Proportion of target values that are 1:", prop_1)

Запустив это, мы обнаружим, что доля единиц равна 0,5.

Создайте блочную диаграмму, чтобы сравнить распределение других столбцов между целью 0 и целью 1:

columns_to_compare = ['danceability', 'energy', 'loudness', 'valence']
for column in columns_to_compare:
    sns.boxplot(x='target', y=column, data=data)
    plt.show()

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

Би/многовариантный анализ:

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

sns.scatterplot(x='danceability', y='energy', data=data)
plt.show()

Гистограмма средней танцевальности по десятилетиям будет действительно полезна:

data.groupby('decade')['danceability'].mean().plot(kind='bar')
plt.show()

На этом графике видно, что танцевальность была наиболее адаптирована в 90-х и 10-х годах и наименее адаптирована в 60-х годах.

Создание скрипичного графика взаимосвязи между модой и речевостью с оттенком цели поможет нам наблюдать влияние моды и речевости на целевое значение:

sns.violinplot(x='mode', y='speechiness', hue='target', data=data)
plt.show()

Мы можем специально вывести некоторые вопросы из данных, а затем найти ответы на них, используя методы анализа данных. Некоторые из примерных вопросов могут быть:

Какова средняя танцевальность песен, ставших хитами?

На это можно ответить, сохранив данные хитов (цель = 1) в 1 переменной, а затем сгенерировав среднее значение танцевальности этих значений.

Год с наибольшим количеством просмотров?

На это можно ответить:

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

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

Предварительная обработка данных:

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

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

data.drop(['track', 'artist','uri'],axis=1,inplace=True)

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

y = data['target']
X = data.drop('target', axis = 1)
  1. Разделение данных: код использует функцию train_test_split для разделения входных данных X и целевых данных y на обучающие и тестовые наборы. Размер поезда установлен равным 0,7, что означает, что 70 % данных используются для обучения, а 30 % — для тестирования. Перетасовка считается истинной, поэтому данные разбиваются случайным образом независимо от времени выполнения кода.
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.7, shuffle = True, random_state = 1)
  1. Масштабирование данных: код использует функцию preprocessing.robust_scale для масштабирования данных. Функция robust_scale выполняет надежное масштабирование данных, которое является типом масштабирования, устойчивым к выбросам. После масштабирования данные преобразуются в Pandas DataFrame для сохранения индекса исходных данных.
X_train = pd.DataFrame(preprocessing.robust_scale(X_train), index=X_train.index)
X_test = pd.DataFrame(preprocessing.robust_scale(X_test), index=X_test.index)

Обучение модели:

  1. Словарь моделей: создается словарь с именем models, где ключи — это имена моделей машинного обучения, а значения — экземпляры соответствующего классификатора sci-kit-learn.
  2. Обучение модели: затем код использует цикл for для перебора словаря models. Для каждой итерации модель обучается на обучающих данных X_train и y_train с использованием метода fit. Имя модели печатается после обучения, чтобы показать, что модель прошла успешное обучение.
models = {
    "                   Logistic Regression": LogisticRegression(),
    "                   K-Nearest Neighbors": KNeighborsClassifier(),
    "                         Decision Tree": DecisionTreeClassifier(),
    "Support Vector Machine (Linear Kernel)": LinearSVC(),
    "   Support Vector Machine (RBF Kernel)": SVC(),
    "                        Neural Network": MLPClassifier(),
    "                         Random Forest": RandomForestClassifier(),
    "                     Gradient Boosting": GradientBoostingClassifier()
}

for name, model in models.items():
    model.fit(X_train, y_train)
    print(name + " trained.")

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

for name, model in models.items():
    print(name + ": {:.2f}%".format(model.score(X_test, y_test) * 100))

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

clf=RandomForestClassifier()

clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)

Сохранение модели:

Вы можете сохранить модель в виде файла .pkl, используя библиотеки joblib.

joblib.dump(clf, 'clf.pkl')

Теперь, когда у вас есть сохраненная модель, вы можете развернуть ее, как хотите!!!!

Развертывание модели:

Развертывание модели машинного обучения помогает несколькими способами:

  1. Делает модель доступной для пользователей для реальных приложений.
  2. Позволяет модели обрабатывать большие объемы данных и делать прогнозы в масштабе.
  3. Позволяет упростить интеграцию с другими системами и приложениями.
  4. Облегчает обновление и обслуживание модели.
  5. Облегчает мониторинг и оценку производительности модели.
  6. Повышает эффективность и скорость прогнозирования моделей.
  7. Обеспечивает развертывание модели в безопасной и надежной среде.

Здесь мы собираемся использовать Streamlit для развертывания нашей модели. Для этого мы создаем файл Python с именем «frontend.py» и импортируем необходимые библиотеки:

import streamlit as st
import pandas as pd
import numpy as np
import joblib

Дайте вашей странице название, по которому можно пройти:

st.title('Spotify Popularity Prediction')

Создайте поля для ввода данных пользователем и используйте для этого разные методы в зависимости от типа и диапазона вводимых значений:

Например, если ввод танцевальности находится в диапазоне от 0,00 до 1,00, вы можете использовать ползунок со значением слайда 0,01:

danceability = 0.000
danceability = st.slider("Enter Danceability", min_value=0.000, max_value=1.000, value=danceability, step=0.001)

Получив все 16 входных данных, поместите их все вместе в список «входные данные». Загрузите модель, которую мы сохранили ранее:

loaded_model = joblib.load('clf.pkl')

Нам нужно создать кнопку «предсказать по клику»:

if st.button("Predict"):
   result = loaded_model.predict([input])
if result == 1:
    st.success("Hit")
else:
    st.error("Flop")

Теперь, когда мы закончили кодирование, протестируйте развертывание. Запустите оператор в терминале:

streamlit run frontend.py

Вот, у вас есть модель, все развернуто и готово к использованию!!!

И это знаменует собой конец нашего проекта. Исходный код находится на моем GitHub и доступен здесь.

Надеюсь, это поможет вам в вашей практике и путешествии. Удачи!!