Конкурс Data Scientist Challenge на Hackerearth для Eli Lilly and Company

Доступ к полному закодированному решению здесь

Постановка задачи: -

Эли Лилли и компания разместили на сайте Hackerearth челлендж Data Scientist Challenge. Вопрос машинного обучения из задачи приведен ниже: -
Музыкальный жанр – это общепринятая категория, которая идентифицирует некоторые музыкальные произведения как принадлежащие к общей традиции или набору условностей. Основная задача – определить, к какому музыкальному жанру принадлежит песня??

Данные поезда: -

Этот CSV-файл состоит из 15 681 экземпляра, в каждом из которых содержится 18 объектов. Список функций с описанием выглядит следующим образом: -
instance_id — уникальный идентификатор песни в наборе данных.
track_name — название песни.
популярность — зависит от общего количества воспроизведений трека и от того, насколько недавно они были воспроизведены.
акустика — показатель того, является ли музыка акустической. . Оценка 1,0 означает, что песня, скорее всего, будет акустической.
танцевальность — насколько эта песня подходит для танцев.
duration_ms — Продолжительность музыкальной композиции.
энергия — представляет перцептивную меру интенсивности и активности.
инструментальность — это значение представляет количество вокала в песне. песня. Чем он ближе к 1.0, тем более инструментальной является песня.
тональность — указана тональность, в которой была написана эта песня.
живость — Обнаруживает присутствие аудитории в записи.
громкость — эта песня тихая или громкая? Измеряется в децибелах.
voice_gender – исполнитель мужского или женского пола?
лад – лад – это словарный запас мелодии.
speechiness — определяет наличие произносимых слов в треке.
темп — скорость, с которой песня записывается и исполняется. (ударов в минуту)
musician_category – категория исполнителя, будь то дуэт, соло или группа.
валентность – описывает музыкальную позитивность, передаваемую треком.< br /> music_genre – Жанр музыкальной композиции.

Данные испытаний: -

Этот CSV-файл состоит из 3921 экземпляра, в каждом из которых содержится 17 объектов. В этих данных отсутствует целевой атрибут «music_genre», который необходимо спрогнозировать на основе доступных функций.

Подход к решению: -

Испытать все алгоритмы классификации машинного обучения, чтобы найти лучший.

1.Импорт всех библиотек

Для этого проекта нам понадобятся: -
1. pandas — обработка фреймов данных.
2. numpy — массивы и математические операции
3. matplotlib — для подграфиков
4. seaborn — построение стилизованных графиков
5. multiprocessing — для эффективного использования CPU's
6. time — расчет времени, необходимого для обучения моделей.
7. sklearn — для алгоритмов классификации машинного обучения и методов предварительной обработки

Нам также понадобится библиотека sklearn для импорта моделей.

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

Использование методов предварительной обработки данных: -

1. Очистка данных — обработка значений NA в фрейме данных Train and Test.
Для большинства функций я заменил значения NA на среднее значение этой функции. Однако для объектов, имеющих строковые значения, я заменил значения NA символом, не имеющим значения, например X.
Здесь следует отметить один важный момент: значения NA в тестовом наборе данных должны быть заменены средними показателями, полученными из функций набора данных поезда.
Автор Практического машинного обучения с помощью Scikit-Learn & TensorFlow также предлагает то же самое:

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

2. Кодирование строковых значений — строковые значения некоторых функций необходимо кодировать для большинства алгоритмов классификации, таких как деревья решений, линейная регрессия и т. д. Для кодирования мы используем LabelEncoder из библиотеки sklearn.
Здесь также кодирование в тестовом наборе данных необходимо выполнить с экземпляром кодировщика, который был помещен в набор данных поезда так же, как и раньше в очистке данных.

3. Нормализация. Нормализация данных используется в машинном обучении, чтобы сделать обучение модели менее чувствительным к масштабу функций. Это позволяет нашей модели сходиться к лучшим весам и, в свою очередь, приводит к более точной модели.
Мы используем MinMaxScaler из библиотеки sklearn для нормализации.
Здесь также необходимо выполнить нормализацию в тестовом наборе данных с экземпляром скейлера, который соответствует набору данных поезда так же, как и раньше.

Время выполнения предварительной обработки данных — 0,50 сек

3. Визуализация данных

Здесь я выполнил два шага: -

1. Выбор функций с помощью матрицы корреляции и тепловой карты.
На рисунке ниже показана тепловая карта матрицы корреляции функций. Это было бы полезно при выборе функций (т. е. составление короткого списка функций, которые лучше коррелируют с нашим целевым атрибутом «music_genre»).

Из тепловой карты и матрицы корреляции мы находим важные функции, влияющие на Music_Genre. Здесь я принял порог корреляции за 5% или 0,05, т. е. я считаю хорошими все признаки, имеющие абсолютное значение корреляции больше 0,05. Теперь это выбор пользователя. Я также запустил блокнот один раз, сохранив порог корреляции 0,10 или 10%. Я показал полные результаты со сравнением в конце этой статьи.
Корреляция больше 0,05 или меньше -0,05
Особенности: -
1. Популярность
2 .акустика
3. танцевальность
4. продолжительность_мс
5. энергия
6. инструментальность
7. громкость
8. речь
9. темп
10. валентность
11. живость

2. Визуализация выбранных объектов и целевой переменной.
Теперь, когда объекты выбраны, мы наносим их на график относительно целевого объекта для визуализации и лучшего понимания. Для этой цели я использовал библиотеку seaborn и matplotlib. Здесь показаны два графика, остальные можно посмотреть в моем Jupyter Notebook в моем аккаунте на github.

Время выполнения визуализации данных — 3,75 сек

4. Набор для обучения и набор для проверки

На этом этапе мы разделяем наши обучающие данные на обучающий набор (для обучения модели машинного обучения) и проверочный набор (для проверки производительности обученной модели). Для этого я использовал метод train_test_split библиотеки sklearn.

5. Обучение модели и проверка модели

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

Алгоритмы классификации: -
Машинное обучение: -
1. Логистическая регрессия
2. Наивный байесовский классификатор
3. Стохастический градиентный спуск — используется для более чем 100 000 наборов данных (поэтому исключено)
4. k Ближайший сосед
5. Методы опорных векторов
6. Деревья решений
7. Случайный лес
Глубокое обучение: -
1. Многослойный Персептроны

Давайте посмотрим на производительность каждого из этих алгоритмов в наборе проверки.

1. Логистическая регрессия — я импортировал этот алгоритм из библиотеки sklearn. Затем я создал файл hyper_params_lr, содержащий комбинации всех гиперпараметров для логистической регрессии. Затем я написал скрипт на Python для обучения модели с использованием одного набора гиперпараметров за раз, а затем записал ее оценку обучения и оценку проверки. Это делается для того, чтобы найти лучший набор гиперпараметров для модели и набора данных. Это также можно сделать с помощью метода Grid Search CV библиотеки sklearn, как я сделал для других алгоритмов.

Лучшая производительность модели логистической регрессии: -
Оценка обучения — 73,69%
Оценка теста — 75,59%
F1_Score на проверочном наборе — 54,99%

Время выполнения логистической регрессии — 36,01 сек

2.Наивный байесовский классификатор —класс этого алгоритма был импортирован из библиотеки sklearn. Производительность наивного байесовского классификатора очень низкая по сравнению с логистической регрессией. Поэтому я не стал вдаваться в детали этого алгоритма. Как мы видим, оценка обучения составляет 66,34%, а оценка теста — 68,01%, что плохо по сравнению с предыдущим.

3.k Ближайший сосед (kNN) — Здесь также модель была импортирована из библиотеки sklearn. Я попробовал модель kNN для разных значений «, который является одним из ее ключевых гиперпараметров.

Лучшая производительность модели k ближайших соседей: -
Оценка обучения — 75,16%
Оценка теста — 73,73%
F1_Score на проверочном наборе — 52,80%

Время выполнения kNN — 34,89 сек

4. Машины опорных векторов (SVM) — класс, импортированный из библиотеки sklearn. Здесь я выполнил поиск по сетке, чтобы найти лучший набор гиперпараметров. Метод GridSearchCV присутствует в библиотеке sklearn. Нам нужно количество ЦП, чтобы метод поиска по сетке работал с максимальной производительностью, поскольку он занимает много времени.

Лучшая производительность модели SVM: -
Тестовый балл — 76,21%
F1_Score на проверочном наборе — 58,09%

Время выполнения SVM — 747,16 сек

5. Деревья решений — класс, импортированный из библиотеки sklearn. Реализован метод поиска по сетке.

Лучшая производительность модели дерева решений: -
Тестовый балл — 73,54%
F1_Score на проверочном наборе — 54,97%

Время выполнения дерева решений — 13,28 сек

6. Классификатор случайных лесов (RFC) — класс, импортированный из библиотеки sklearn. Реализован метод поиска по сетке.

Лучшая производительность RFC-модели: -
Тестовый балл — 78,04%
F1_Score на проверочном наборе — 59,81%

Время выполнения RFC — 13,28 сек

7. Многослойные персептроны (MLP) — класс, импортированный из библиотеки sklearn. Реализован метод поиска по сетке.

Лучшая производительность модели MLP: -
Тестовый балл — 77,08%
F1_Score на проверочном наборе — 59,04%

Время выполнения MLP — 233,74 сек

6. Лучшая производительность модели

На данный момент наилучшую производительность дает классификатор Random Forest. Поэтому мы проводим обучение и делаем прогнозы по этой лучшей модели RFC.
Прогнозы, основанные на этой модели, я назвал ее "best_model_results.csv".

Лучшая производительность модели: -
Оценка обучения — 99,76%
Оценка теста — 78,93%
F1_Score на проверочном наборе — 60,78%

7. Уменьшите переоснащение

Лучшая модель RFC приводит к переоснащению, поэтому я пробовал разные max_depth” деревьев, что известно как ранняя остановка (не позволять дереву расти до большего количества узлов).

Мы видим, что для критерия: «энтропия» и max_depth: 7
Модель случайного леса дает хорошее обобщение
Я называю эту модель «best_generalized_model»

Затем я провел обучение и получил прогнозы от этой модели в качестве окончательного результата.

Лучшая производительность обобщенной модели: -
Оценка обучения — 78,12 %
Оценка теста — 77,68 %
F1_Score на проверочном наборе — 56,25 %

Полное время выполнения Notebook — 1115 сек

Прогнозы этой модели хранятся в файле best_generalized_model_results.csv.

Полный отчет об эффективности

Моя заявка на Hackerearth привела к F1_Score 59,63%