Краткое описание шагов по созданию модели машинного обучения с использованием библиотек Python для машинного обучения и визуализации

Вдохновляющие сообщения в моем блоге

Я заядлый читатель и ученик. За последние несколько месяцев я прочитал несколько десятков сообщений в блогах Medium по различным темам, связанным с машинным обучением. Я многому у них научился. Я заметил, что у большинства постов есть определенная область внимания. В блогах не так много сообщений, в которых описываются этапы построения модели машинного обучения от начала до конца с объяснениями и кодом для каждого этапа.

Я предполагаю, что одна из причин этого может заключаться в том, что обсуждение всех этапов построения модели в одном сообщении блога Medium, прямо от сбора и подготовки данных, предварительной обработки данных, EDA, обучения модели машинного обучения, оценки модели, настройки гиперпараметров, до наконец, прогнозирование с использованием модели и интерпретация результатов модели действительно составили бы один очень длинный и исчерпывающий пост. У большинства читателей не хватит времени и терпения, чтобы пройти через это.

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

Некоторые важные примечания о моем сообщении в блоге:

  • Для каждого шага я даю краткое объяснение, важные идеи, код Python и графики.
  • Сообщение в блоге не является исчерпывающим. Поэтому я не вдавался в подробные объяснения алгоритмов, методов и кода.
  • Я не объясняю теоретические концепции, лежащие в основе моделей.
  • Самая трудоемкая задача при разработке модели машинного обучения - этап сбора, очистки и подготовки данных. Для простоты в этой записи блога я использовал популярный набор данных завершения Kaggle. Данные довольно чистые с четко определенным словарем данных. Это позволяет мне сосредоточить внимание в блоге на этапах построения модели, когда у нас будет окончательный чистый набор данных для работы.

Мои данные и цель

Набор данных, который я использовал для этого проекта, взят из Конкурса машинного обучения риска дефолта Home Credit, который был проведен на Kaggle в мае 2018 года. По кредиту предоставлено 7 различных таблиц данных. заявители и они связаны друг с другом.

  • Чтобы не усложнять текст, в этом сообщении в блоге я работаю только с APPLICATION_TRAIN набором данных.
  • Каждой ссуде соответствует отдельная строка, которая обозначается функцией SK_ID_CURR.
  • В поле ЦЕЛЬ указано 0: ссуда была возвращена или 1: ссуда не была возвращена.
  • Цель состоит в том, чтобы использовать предоставленную информацию, чтобы предсказать, сможет ли заявитель погасить ссуду.

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

Давайте начнем.

1. Импортируйте библиотеки Python, считайте в наборе данных как Pandas DF, генерируйте сводную статистику по DF

Давайте импортируем библиотеки Python, которые мы будем использовать для обработки данных, создания визуализаций и построения наших моделей машинного обучения.

Затем загрузите файл application_train.csv и сохраните его на локальном диске. Затем прочитайте данные как фрейм данных Pandas.

У DF есть 307 511 займов и 122 функции.

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

2. Исследовательский анализ данных (EDA)

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

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

Я много узнал о наборе данных о ссуде и его функциях из этого Блокнота Kaggle.

Начнем с изображения различных функций.

Давайте построим NAME_INCOME_TYPE с помощью Plotly.

Мы наблюдаем, что 99% соискателей ссуды имеют какой-либо источник дохода, например, от работы, коммерческого сотрудника, пенсионера или государственного служащего.

Для анализа данных было нанесено несколько других функций.

Выводы:

  • Некоторые функции искажены вправо, например AMT_INCOME_TOTAL, AMT_CREDIT, AMT_GOODS_PRICE.
  • Некоторые функции оставлены искаженными, например DAYS_REGISTRATION, EXT_SOURCE_2, EXT_SOURCE_3.
  • На момент подачи заявки на получение кредита 81% заявителей не сопровождались сопровождением.
  • 90% ссуд - ссуды наличными.
  • 66% соискателей не владеют автомобилями.
  • 70% соискателей владеют домами.
  • 75% соискателей кредита состоят в браке или гражданском браке.
  • Топ-5 профессий соискателей кредита: рабочие 55 тыс., Продавцы 32 тыс., Основной персонал 28 тыс., Менеджеры 21 тыс., Водители 19 тыс.
  • 95% соискателей кредита имеют среднее или высшее образование.
  • 89% соискателей проживают в доме или квартире.
  • Топ-5 организаций, в которых работает заявитель: Business Entity Type3 68K, XNA 55K, Self-worker 38K, Others 17K, Medicine 11K.

Затем давайте найдем функции, наиболее соответствующие цели.

В данных 122 объекта. Корреляционную матрицу всех данных будет трудно прочитать. Давайте просто посмотрим на 20 самых положительных и отрицательных корреляций с TARGET. Значения корреляции могут быть созданы только для числовых функций.

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

Давайте изучим переменную DAYS_EMPLOYED.

Максимальное количество рабочих дней составляет 365 243 дня, что составляет ~ 1000 лет. И это положительное значение (на самом деле должно быть отрицательным). Это выброс.

Есть 55 374 строки, где количество рабочих дней клиента составляет 365 243 дня.

Мы заполняем выбросы не числом (np.nan). Эта операция не приводит к утечке данных, поэтому мы можем выполнить ее на всем DF.

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

Давайте изучим переменную DAYS_BIRTH.

Возраст заявителя от 20 до 69 лет. Никаких выбросов по возрасту.

Корреляция -0.07. Существует отрицательная линейная связь с целевым показателем, что означает, что по мере взросления клиенты, как правило, чаще возвращают свои ссуды вовремя.

Затем давайте выясним, как распределение возраста меняется для Target = 0 и Target = 1, используя график оценки плотности ядра (KDE).

Мы наблюдаем перекос кривой Target = 1 в сторону младшего конца диапазона. Хотя это несущественная корреляция (только коэффициент корреляции -0,07), эта переменная, скорее всего, будет быть полезным в модели машинного обучения, потому что это влияет на цель.

Теперь давайте проанализируем EXT_SOURCE_1, EXT_SOURCE_2 и EXT_SOURCE_3.

Переменные, имеющие наиболее сильную отрицательную корреляцию с целью, - это EXT_SOURCE_1, EXT_SOURCE_2 и EXT_SOURCE_3. Согласно документации, эти функции представляют собой «нормализованную оценку из внешнего источника данных». Возможно, кредитный рейтинг составлен с использованием многочисленных источников данных. Давайте изучим их дальше.

Давайте получим корреляции функций EXT_SOURCE с целью и друг с другом.

Мы отмечаем, что три функции EXT_SOURCE имеют отрицательную корреляцию с целью, указывая на то, что по мере увеличения значения EXT_SOURCE клиент с большей вероятностью вернет ссуду.

Мы наблюдаем, что DAYS_BIRTH положительно коррелирует (коэффициент корреляции = 0,6) с EXT_SOURCE_1, что указывает на то, что, возможно, одним из факторов в этой оценке является возраст клиента.

Затем давайте посмотрим на распределение каждой из этих функций по значению Target. Это позволит нам визуализировать влияние этой переменной на Target.

Мы видим, что формы кривых для Y = 0 и Y = 1 различаются для каждой из трех функций. Это означает, что эти функции могут оказаться полезными при построении моделей.

Затем давайте проверим, нет ли недостающих данных.

Отображаются 10 основных функций с максимальным% отсутствующих данных. Примерно для 68 из 122 функций отсутствуют данные.

Библиотеки машинного обучения, такие как Scikit-learn, не могут обрабатывать отсутствующие значения. Мы выполним преобразования, чтобы иметь дело с недостающими данными для числовых и категориальных переменных.

3. Проверьте дисбаланс данных

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

Мы учтем этот дисбаланс данных на этапе построения модели.

4. Обработка категориальных функций

В нашем DF есть 16 категориальных функций.

Давайте заменим отсутствующие значения для каждого столбца объекта на «Неизвестно». Эта операция не приводит к утечке данных и может быть выполнена до разделения данных на набор для обучения и тестирования.

Библиотеки машинного обучения, такие как Scikit-learn, не могут обрабатывать категориальные функции. Их необходимо закодировать.

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

После однократного кодирования DF имеет 252 функции.

5. Разделите DF на данные обучения и данные тестирования

Теперь мы разделим наш DF на данные обучения и данные тестирования.

Мы устанавливаем матрицу признаков X и целевой вектор y. Затем выполните train_test_split, используя параметр stratify, потому что наши данные несбалансированы.

Затем проверьте формы X_train, X_test, y_train и y_test, чтобы убедиться, что они правильно настроены в соответствии с требованиями библиотек Sklearn и XGBoost.

6. Преобразования для работы с отсутствующими данными для числовых переменных

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

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

7. Разработка функций

Как правило, перед началом разработки функций создается базовая модель с использованием доступных функций и оценка производительности модели. Моя базовая модель имела средние показатели ROC AUC.

Чтобы улучшить показатели производительности модели, нам нужно создать новые функции, которые могут лучше прогнозировать результат. Разработка функций - важный шаг в прикладной науке о данных.

Чтобы избежать утечки данных, разработка функций выполняется отдельно для данных обучения и данных тестирования. Функции, которые я использовал, вдохновлены этим Блокнотом Kaggle.

Примените тот же код к X_test.

Проверьте формы.

8. Построение и оценка модели

Давайте подгоним Классификатор случайного леса ко всем данным поезда. Используйте Конвейер (из библиотеки imblearn) для последовательного применения списка преобразований и окончательной оценки. Выполните исчерпывающий поиск по заданным значениям параметров с помощью GridSearchCV. Выберите лучший оценщик из поиска по сетке, чтобы получить оценку ROC AUC и кривую ROC.

В конвейере мы выполняем два преобразования данных. Во-первых, стандартизируйте функции с помощью StandardScaler ». Чтобы учесть дисбаланс данных, выполните передискретизацию с помощью SMOTE .

Выполнение параллельных заданий заняло около 2 часов. Это потому, что у нас есть большое количество функций и в общей сложности 40 подгонок на основе указанных параметров, включая 5-кратную перекрестную проверку.

Лучшая оценка, найденная при поиске по сетке - это модель случайного леса с максимальной глубиной 10 и 500 деревьев.

Есть несколько показателей для оценки модели для задачи классификации. Мы используем показатель ROC AUC. Модель имеет показатель ROC AUC 0,7 по тестовым данным. Оценка ROC AUC 0,7 - это хороший результат, но не лучший.

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

  • Нам необходимо использовать все источники данных, предоставленные нам в конкурсе Kaggle. Доступно 7 таблиц входных данных, но мы использовали только основную таблицу приложения для построения нашей модели.
  • Нам нужно провести дальнейшую разработку функций, используя все доступные таблицы входных данных.
  • Мы можем установить разные модели, например XGBoost или LightGBM, чтобы посмотреть, сможем ли мы улучшить этот результат.

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

Мы заметили, что две основные функции, основанные на важности функции, - это новые функции, которые мы разработали с использованием EXT_SOURCE_1, EXT_SOURCE_2, EXT_SOURCE_3. Следующим на очереди идет EXT_SOURCE_3. Это имеет смысл, потому что три функции EXT_SOURCE заняли первое место в списке функций, имеющих наиболее отрицательную корреляцию с целью, и, судя по графикам KDE, мы обнаружили, что эти функции имеют разное распределение для Y = 0 и Y = 1.

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

Следовательно, мы повторно подбираем модель, используя только 16 основных функций. Достигнутый показатель ROC AUC составляет 0,73. Похоже, мы добились небольшого улучшения в рейтинге, отбросив функции, которые незначительно важны.

Отображается график важности функции.

Большинство победителей соревнований Kaggle используют некоторые разновидности алгоритмов повышения для достижения наивысших результатов. Давайте подгоним модель XGBoost ко всем данным поезда с 268 функциями, чтобы увидеть, улучшится ли наша оценка.

Модель XGBoost соответствует параметрам, указанным ниже. Достигнутый показатель ROC AUC составляет 0,74. Это несущественное улучшение по сравнению с нашей моделью случайного леса.

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