Добавление классов к мультиклассовой классификации музыкальных жанров
КОНТЕКСТ
В этом блоге рассказывается о продолжении эксперимента по классификации музыкальных жанров с помощью машинного обучения. В предыдущем эксперименте использовалось машинное обучение для классификации 6 разных жанров. В этом блоге рассматривается машинное обучение для 10 жанров.
Код для 6-ти жанрового эксперимента можно найти здесь.
Код для 10-ти жанрового эксперимента можно найти здесь.
ПОНИМАНИЕ БИЗНЕСА
Более подробное объяснение можно найти в более раннем блоге, посвященном эксперименту с шестью жанрами.
Предыдущий блог здесь.
Потенциал классификации машинного обучения заключается в автоматической сортировке новой музыки, созданной артистом, которая отличается от их типичного репертуара. Например, народный исполнитель выпускает электронную песню для альбома с народной музыкой.
Еще один потенциал существует в способности находить песни, существующие на границе двух жанров. Модель машинного обучения, которая распознает долю каждого из представленных жанров, может находить смеси жанров, например, Jazzy Rock в новой и старой музыке.
ПОНИМАНИЕ ДАННЫХ
Сборник- Предыдущий эксперимент охватывал 6 жанров: кантри, хип-хоп, электронику, джаз, классику и металл. Как упоминалось в другом блоге, код предназначен для повторения с разными жанрами, если вы хотите поэкспериментировать. В это расширение добавлено 4 жанра: блюграсс, блюз, фолк и классический рок.
Итак, genres.collect_genres_features () реализует следующие библиотеки: BeautifulSoup (bs4), YoutubeDL и Librosa. Имея список воспроизведения на YouTube, он проверяет каждый аудиофайл и извлекает звуковые характеристики.
Визуализация
Есть 20 функций и теперь 10 классов. Есть очень много различных комбинаций, которые можно визуализировать. Вместо этого был использован широкий обзорный подход. Имейте в виду, что это беспорядочно, но с целью найти функцию с одинаковым распределением во всех жанрах. Такая функция может иметь небольшую предсказательную силу и потенциально может быть отброшена во избежание переобучения.
Например, показаны две функции. Один демонстрирует четкое распределение между жанрами, что, вероятно, придаст характеристике сильную предсказательную силу, а другой демонстрирует распределения, которые очень похожи для каждого жанра.
ПОДГОТОВКА ДАННЫХ
Разделение теста на обучение - выполняется разделение на обучение / тестирование / проверку 64/16/20. Разделение выполняется стратифицированным по отношению к целевому классу, чтобы сохранить репрезентативное распределение каждого класса в каждом наборе. Stratify - полезный параметр в sklearn.model_selection.train_test_split()
. Распределения изображены ниже.
Были протестированы две модели, которые показали наилучшие результаты в предыдущем эксперименте: классификатор опорных векторов и деревья с усилением градиента. Для моделей Support Vector данные нормализуются и преобразуются с помощью sklearn.preprocessing.PowerTransformer()
. Для модели Gradient Boosted Tree применяется анализ главных компонент.
Также проводились эксперименты с конвейером, который удаляет две функции, распределение которых было очень схожим по жанрам (mfcc9 и mfcc11). Падение конвейера с использованием sklearn_pandas.DataFrameMapper()
mapper = DataFrameMapper(
features=[
(col, None) for col in X_train.columns if col not in [‘mfcc9’, ‘mfcc11’]
],
df_out=True
Затем его удобно применять к началу уже существующего конвейера следующим образом:
svc.steps.insert(0, ('mapper', mapper))
МОДЕЛИРОВАНИЕ
Классификатор опорных векторов снова превзошел деревья с градиентным усилением по потерям журналов и сходству по Жаккару. Удаление mfcc 9 и 11 не улучшило производительность, и шаг был удален из конвейера следующим образом:
svc.steps.remove(('mapper', mapper))
Поиск по сетке- Следующие параметры ищутся для модели с потерями журнала в качестве оценки.
params = { 'model__C': [8,9,10,11,12], 'model__gamma': [0.25, 2, 'auto', 'scale'], 'model__tol': [0.01, 0.001, 0.0001], 'model__decision_function_shape': ['ovo', 'ovr'] }
Результаты приведены ниже:
svc_grid.best_params_ >>> {'model__C': 8, 'model__decision_function_shape': 'ovr', 'model__gamma': 0.25, 'model__tol': 0.0001}
ОЦЕНКА
Окончательная модель была выполнена на основе данных валидации следующим образом:
- Потеря журнала: 0,476
- Оценка Жаккарда: 0,749 (средний)
-Страна: 0,656
-Джаз: 0,854
-Hip_Hop: 0,680
-Классический: 0,824
-Металл: 0,733
-Электроника: 0,673
-Bluegrass: 0,842
-Синий: 0,727
-Народный: 0,767
-Classic_Rock: 0,737 - Точность: 0,854
Ниже приведена матрица неадекватности проверочного набора. Также ниже приведены матрицы неточностей, модифицированные для расчета полноты и точности для каждого жанра.
РАЗВЕРТЫВАНИЕ
Демонстрацию этого классификатора можно найти на сайте http://www.whatsthatgenre.com.