Добавление классов к мультиклассовой классификации музыкальных жанров

КОНТЕКСТ

В этом блоге рассказывается о продолжении эксперимента по классификации музыкальных жанров с помощью машинного обучения. В предыдущем эксперименте использовалось машинное обучение для классификации 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.