Серия: Тайваньский набор данных по кредитным дефолтам

Эта статья является частью серии, в которой мы исследуем, предварительно обработаем и запустим несколько методов машинного обучения для набора данных Taiwan Credit Default. Набор данных можно найти здесь: набор данных.

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

· Все ли указанные функции актуальны, и если нет, то какой из них будет лучшим?

· Какая модель машинного обучения даст наилучшие результаты с учетом наилучшего подмножества функций?

Из-за ограничений вычислительной мощности даже сейчас, в 2022 году, важно сократить количество измерений до минимума, не жертвуя значительными объемами информации. В этой статье мы рассмотрим одну стратегию выбора наилучшего подмножества функций с использованием алгоритма XGBoost. Затем мы будем использовать полученное подмножество данных для оценки нескольких базовых классификаторов, чтобы решить, какой из них заслуживает большего времени настройки для оптимальной производительности. Давайте начнем!

Первым шагом является импорт некоторых исходных пакетов и импорт данных из Excel. Ниже мы импортировали данные в Pandas с помощью вспомогательного приложения xlrd. Это позволит нам импортировать файлы .xls и даже выбрать конкретный лист в книге. Это создает фрейм данных с 24 столбцами и 30 000 экземпляров. Более подробно об этом наборе данных см. в этой статье .

Теперь мы импортируем большинство пакетов, в основном из Scikit Learn, которые будем использовать в будущем.

Этот короткий фрагмент кода отделит функции от целевых переменных.

Наш следующий шаг — использовать train-test-split, чтобы получить подмножества данных для обучения и тестирования наших моделей. Мы будем использовать разбиение 80/20 (20% – тестовые данные) и установим random_state равным 42, что, похоже, является своего рода традицией.

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

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

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

Согласно этому анализу, два признака, по-видимому, имеют большую долю прогностического веса. Теперь следует отметить, что, регулируя n_estimators, Learning_rate и/или max_depth в XGBClassifier, мы можем увидеть, что некоторые функции становятся немного слабее. более заметным. В целом, для этого примера эта конфигурация работала хорошо.

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

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

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

Существует несколько способов подготовки категорийных данных для моделирования. В этом случае мы применим OneHotEncoder ко всем категориальным функциям. Поскольку мы решили быть избирательными в отношении сохраняемых нами функций, это уменьшит бремя сложности. Для каждой категориальной функции OneHotEncoder создаст новую функцию для каждого бинарного результата в исходной функции. Например, если у столбца есть 4 возможных категории, OHE создает 4 столбца, а затем помещает 0 или 1 в каждую строку, чтобы указать, отсутствует или присутствует эта категория в этой строке. В итоге мы получаем разреженное представление данных, которое учитывает категории, но более легко используется моделями.

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

Мы применяем преобразования столбцов как к обучающим, так и к тестовым данным для X с помощью метода fit.

Мы можем видеть новые имена функций преобразованного набора данных ниже:

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

Приведенные ниже шаги были взяты из книги Машинное обучение и наука о данных для финансов, написанной Хариомом Татсатом, Сахилом Пури и Брэдом Лукабо (O'Reilly , 2021), 978–1–492–07305–5.

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

Первым шагом является создание списка Python, а затем добавление к нему каждого из наших классификаторов-кандидатов.

Затем мы устанавливаем значения параметров, таких как n_folds и оценка для KFold перекрестного валидатора. Здесь важен выбор roc_auc в качестве показателя оценки. Наша задача — контролируемая бинарная классификация, что означает, что у нас есть доступ к целевой переменной, и это двоичный выбор, 0 или 1.

Площадь под кривой рабочей характеристики приемника график хорошо подходит для этой задачи классификации. Он строит истинную положительную скорость против ложноположительной скорости при изменении порога дискриминации. Оценка – это область графика, которая находится под полученной линией. Идеальная оценка – 1,0, а не очень хорошая – где-то ниже 0,5. Чем ниже оценка, тем хуже работает классификатор. Кроме того, оценка ниже 0,5 указывает на то, что классификатор не демонстрирует реальной способности предсказывать цель.

Наконец, мы импортируем модуль Python time, чтобы иметь возможность вычислять секунды, прошедшие для запуска каждого классификатора. Выводим результаты на консоль.

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

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

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