Введение

В качестве моего семестрового проекта я решил построить модель, которая могла бы предсказывать жанр песни по ее тексту. Это непростая проблема, потому что некоторые жанры очень похожи по тексту, а некоторые песни могут принадлежать к большему количеству жанров. Я выбрал 5 жанров для классификации: поп, рок, кантри, электроника и хип-хоп. Я сравнил 4 модели: DNN (глубокая нейронная сеть), XGB (древовидный классификатор), RNN (рекуррентная нейронная сеть) и CNN (сверточная нейронная сеть). DNN и XGB использовали текстовое представление tf-idf, а RNN и CNN использовали встраивание слов. Проект доступен на моей странице Gitlab.

Данные

Я использовал набор данных от Kaggle. Он состоит из почти 300 000 песен с текстами и жанровыми обозначениями. Жанровые метки были получены благодаря библиотеке Spotify. Каждому художнику был присвоен его наиболее распространенный жанр. Набор данных содержит много поп- и рок-песен, но, к сожалению, не так много песен других жанров. Мне нужно было сделать набор данных сбалансированным, чтобы было одинаковое количество песен каждого жанра. После балансировки осталось всего более 13 000 песен.

Я удалил все диакритические знаки и бесполезные символы из текстов и перевел их все в нижний регистр. Затем я токенизировал данные, то есть разделил их на отдельные слова. После этого я удалил стоп-слова. Стоп-слова – это слова, которые встречаются почти в каждом тексте, например я, с или делаю. Эти слова не помогают в классификации. Затем я сделал стемминг. Стемминг — это техника, которая превращает слова в их основы. Например, слово презентация превращается в присутствует, видеть превращается в видеть и т. д. Это уменьшает размерность данных. . В конце подготовки данных я разделил данные на подмножества обучения, проверки и тестирования.

Текстовое представление

Tf-idf

Частота термина — обратная частота документа — это простое текстовое представление. Каждый документ представлен как вектор длины словаря набора данных. Каждый индекс вектора представляет одно слово и равен tf*log(N/d), где tf — количество вхождений данного слова в данном документе, деленное на длину документа, N — общее количество документов в наборе данных и d — количество документов, которые содержат заданное слово. Благодаря второй части умножения общие слова не так важны, а специальные слова, которые могут помочь в классификации, приобретают большее значение. Tf-idf не учитывает похожие слова и порядок слов.

Встраивание слов

Более сложное представление текста — это встраивание слов. Этот метод представляет каждое слово как вектор. Длина вектора может варьироваться, но обычно она исчисляется десятками или сотнями. Важно то, что похожие слова представлены одинаковыми векторами, составляющими небольшой угол. Затем документ представляется вектором векторов. При этом учитывается порядок слов.

Модели

ДНН

Глубокая нейронная сеть представляет собой сеть нейронов. Нейроны соединены в слои. Входной слой является представлением документа. Каждый нейрон в выходном слое соответствует одному классу. Другие слои скрыты. Обучение DNN основано на градиентном спуске, который оптимизирует веса связей между нейронами.

XGB

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

РНН

Рекуррентные нейронные сети заботятся о порядке данных, поэтому они обычно используются для классификации текста. Чтобы предотвратить проблемы взрыва и исчезновения градиента, используется долговременная кратковременная память (LSTM). LSTM — это особый тип RNN. Он имеет аналогичную структуру, но использует некоторые ворота для контроля того, сколько информации запоминается.

Си-Эн-Эн

Сверточная нейронная сеть изначально была создана для обработки изображений, но обычно используется и для классификации текста. Он состоит из нескольких фильтров, которые извлекают шаблоны из заданных данных. Фильтры создают слои, которые накладываются друг на друга, чтобы извлечь даже довольно сложные узоры. Чтобы уменьшить вычислительную сложность, CNN использует объединение, чтобы уменьшить размер вывода от одного уровня к следующему уровню в сети.

Полученные результаты

Наилучшего результата добились DNN с tf-idf. Я ожидал, что RNN и CNN с встраиванием слов будут работать лучше, но это, вероятно, потому, что для этой задачи порядок слов не так важен, как их внешний вид.

Давайте поближе познакомимся с самой эффективной моделью. Я экспериментировал с разными структурами DNN, но различия были совсем небольшими. В итоге я построил сеть с двумя скрытыми слоями по 1024 нейрона в каждом. Я также добавил отсевающий слой со значением 0,2, который отключает некоторые нейроны. Я тренировал модель 10 эпох.

Через 2 эпохи DNN начала переобучать. Больше всего от переобучения помогла балансировка набора данных. Без балансировки модель предсказывала только поп-музыку или рок и имела точность проверки всего около 30%. Также помогло добавление выпадающего слоя. Отключение некоторых нейронов заставляет сеть больше обобщать. Удаление стоп-слов и основ также немного помогло.

Я напечатал матрицу путаницы данных проверки.

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

Наконец, я позволяю этой модели предсказывать тестовые данные. Он достиг точности 54,82 %.

Заключение

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