Целевая аудитория

Целевой аудиторией этой статьи являются люди с базовым пониманием языка программирования Python, а также с базовым уровнем комфорта при использовании среды, похожей на ноутбук Jupyter.

Цель

Наша цель — предоставить пример основных методов обработки данных, которые будут очищать, кодировать и нормализовать набор данных для загрузки в различные модели классификации. Будет предоставлен весь необходимый код, чтобы читатель мог следовать в своем собственном блокноте/среде.

Набор данных

  • Мы будем использовать набор данных «WA_Fn-UseC_-HR-Employee-Uttrition», который обычно используется в машинном обучении для разработки моделей, которые могут прогнозировать отсев сотрудников и определять факторы, способствующие текучести кадров.
  • Набор данных содержит информацию о сотрудниках в компании, включая их возраст, должностные обязанности, ежемесячный доход, а также о том, покинули ли они компанию (т. е. их статус увольнения).
  • Всего в наборе данных 35 столбцов, включая числовые и категориальные переменные.

Общая стратегия

Для достижения нашей цели мы сделаем следующее:

  1. Настройка среды: импортируйте все библиотеки, которые мы будем использовать для этого проекта.
  2. Загрузка данных: загрузите набор данных во фрейм данных Pandas.
  3. Обработка данных: подгруппируйте данные и выполните предварительную очистку данных.
  4. Анализ признаков: выполняйте простой одномерный и двумерный анализ, чтобы лучше понять переменные в наборе данных.
  5. Кодирование данных:кодирование категорийных данных.
  6. Масштабировать данные. Когда все функции станут числовыми, мы будем масштабировать все нецелевые функции.
  7. Обучение, тестирование и проверка разделения: разделение закодированного набора данных на данные обучения, тестирования и проверки.
  8. Обучение/оценка моделей: запускайте различные модели в наборе обучающих данных и оценивайте их производительность.
  9. Оптимизировать наиболее эффективные модели. Настройте гиперпараметры наиболее эффективных моделей.

1. Настройте среду

Импортируйте все библиотеки, необходимые для этого проекта, с помощью следующего кода:

2. Загрузка данных

Данные можно загрузить из CSV-файла на локальном диске или из размещенного источника, как показано в примере ниже:

3. Обработка данных

Столбцы только с одним уникальным значением

Глядя на форму данных, можно увидеть набор данных, содержащий 1470 строк и 35 столбцов:

Беглый взгляд на количество уникальных значений в столбце приводит к следующему:

Похоже, есть несколько столбцов, содержащих только 1 уникальное значение. Их можно изолировать с помощью следующего кода:

Для столбцов, содержащих только 1 уникальное значение, если столбец представляет собой смесь нулевых значений и 1 уникального значения, они могут быть закодированы как 0 и 1. Однако, если пустые значения отсутствуют, столбцы можно отбросить, поскольку это не будет предоставлять никакого дискриминантного значения для моделей (т. е. все значения одинаковы для всех строк). Для определения пустых значений в столбцах можно использовать следующий код:

Поскольку столбцы «EmployeeCount», «Over18» и «StandardHours» не содержат пустых значений и содержат только 1 уникальное значение, их можно удалить. Для удаления столбцов можно использовать следующий код:

Столбцы идентификаторов

На другой стороне спектра находятся столбцы, содержащие все уникальные значения. Эти подобные индексу столбцы идентификаторов также можно удалить. В нашем примере столбец «EmployeeNumber» — единственный, который соответствует такому критерию. Столбец можно удалить с помощью следующего кода:

Кодирование столбцов с 2 уникальными значениями

Столбцы с двумя уникальными значениями можно легко закодировать. В нашем примере столбцы «Истощение», «Пол» и «Сверхвременные» содержат 2 уникальных значения. Мы будем кодировать данные в этих столбцах, заменив их строковые значения на 0 и 1. Мы начинаем с добавления столбцов в отдельный df с именем df_2unique и удаляем столбцы, которые будут закодированы следующим кодом:

С помощью функции .head() мы можем легко просмотреть значения, которые мы будем заменять:

Для кодирования заменим значения «Нет» и «Да» на 0 и 1 соответственно. Точно так же мы заменим значения «Мужской» и «Женский» на 0 и 1 соответственно. Мы используем следующий код для достижения замен:

Затем мы объединяем закодированный df обратно в основной набор данных:

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

4. Взаимосвязи функций

Одномерный анализ: гистограммы

Мы можем выполнить простой одномерный анализ, чтобы лучше понять переменные в наборе данных. Во-первых, мы отделяем числовые данные от остальных категориальных данных:

С помощью приведенного ниже кода мы можем нанести все числовые функции на гистограммы:

В результате получается следующее:

Мы можем видеть нормальное распределение для функции «Возраст», а также искаженное вправо распределение функций «Ежемесячный доход», «Процент повышения зарплаты» и «Общее количество рабочих лет». Также обратите внимание на разницу в «Истощении», нашей целевой функции. Из-за разницы нам нужно будет стратифицироваться во время нашего теста, тренировать сплит-шаг.

Одномерный анализ: графики KDE

График оценки плотности ядра (KDE) — это графическое представление функции плотности вероятности. Он используется для визуализации распределения набора данных и особенно полезен для определения формы распределения и любых лежащих в его основе закономерностей.

Мы генерируем графики KDE для всех числовых функций с помощью следующего кода:

Например, ниже приведен график KDE для функции «Возраст», разделяющий популяции на популяции «Истощение-Нет» и «Истощение-Да». Как видим, связь между возрастом работника и убылью, по-видимому, слабая.

Двумерный анализ: корреляция Пирсона

Корреляция Пирсона — это статистический метод, используемый для измерения силы и направления линейной зависимости между двумя переменными. Он широко используется для понимания взаимосвязи между двумя переменными и для прогнозирования на основе этой взаимосвязи. Мы можем начать наш анализ со следующего кода:

Затем мы можем создать тепловую карту полученных корреляций с помощью следующего кода:

В результате корреляции выглядят следующим образом:

Обратите внимание на сильную корреляцию между «Возрастом» и «Ежемесячным доходом», «Уровнем работы» и «Общим рабочим годом». Как правило, мы ожидаем, что пожилые сотрудники будут иметь больше рабочих лет и, как следствие, уровень работы и ежемесячный доход. Кроме того, обратите внимание, что между нашей целевой функцией «Истощение» и всеми другими функциями существует только слабая корреляция. Однако беспокоиться не о чем, поскольку корреляция Пирсона является линейным методом. Иными словами, между нашей целевой переменной и функциями нет сильных линейных отношений.

5. Кодирование данных

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

Мы будем кодировать полученные функции с помощью функции «get_dummies». Функция создает новые столбцы в DataFrame для каждого уникального значения в категориальной переменной и присваивает значение 1 или 0, чтобы указать, присутствует ли это значение в исходных данных. Это также известно как однократное кодирование. Мы можем использовать однократное кодирование со следующим кодом:

6. Масштабирование данных

Теперь, когда наши данные обработаны и закодированы, мы разделим их на входы (X) и целевую функцию (y) со следующим:

Затем мы можем масштабировать входные данные в X с помощью следующего кода:

Тестирование, обучение и проверка разделения

Обработанные, закодированные и масштабированные данные теперь можно разделить на наборы для обучения, тестирования и проверки. Помните, что наша целевая функция несбалансирована, и в результате ее необходимо расслоить во время разделения. Используя параметр «стратификация», мы гарантируем, что пропорция каждой категории в целевой переменной сохраняется во всех разделенных наборах. Это может улучшить производительность вашей модели, особенно если целевая переменная является важным фактором анализа.

7. Обучение/оценка моделей

Начнем с импорта всех библиотек, которые будем использовать.

Мы создадим список со всей информацией о модели, необходимой для запуска моделей. Затем мы будем использовать цикл for для перебора списка и запуска всех моделей, используя приведенный ниже код. Когда модели закончат работу, будет напечатана оценка перекрестной проверки точности. Примечание: создание моделей может занять значительное время.

После завершения мы можем построить первоначальные результаты модели с помощью следующего кода:

Результирующий график будет выглядеть так:

Нашими наиболее эффективными моделями являются логистическая регрессия, линейный дискриминантный анализ, XGBoosted Trees и Random Forest. Мы создадим прогнозы для каждого и измерим их точность, используя данные проверки, используя следующее:

Затем мы можем распечатать матрицу путаницы для каждого из прогнозов моделей, используя следующее:

В нашем примере наша модель логистической регрессии имела самую высокую общую точность с точностью 90%.

8. Оптимизируйте самые эффективные модели

Мы можем быстро оптимизировать наши модели с помощью метода грубой силы, который будет пробовать различные гиперпараметры для каждой из моделей. Пример такого метода может быть выполнен с помощью кода ниже:

Заключение

Поздравляем! Мы успешно очистили набор данных, закодировали категориальные признаки и масштабировали полученные числовые признаки. Затем мы разделили данные и прогнали входные данные через различные модели классификации. Затем мы смогли создать различные модели, которые могут предсказывать отсев в наборе данных с точностью более 85%.