Конкурс 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», который является одним из ее ключевых гиперпараметров.
Лучшая производительность модели 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.