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

Это головная боль, поскольку мы очень легко можем построить модель, которая склонна к классу большинства и плохо работает при прогнозировании класса меньшинства. Мы не можем использовать точность для проверки такой модели. Например, если у нас есть 100 точек данных, из которых 30 точек данных являются дефолтными, а остальные не дефолтными, то в этом случае, даже если мы построим плохую модель, которая предсказывает все точки данных как не дефолтные, моя точность будет 0,7, что это хорошо, поэтому здесь нельзя использовать точность. Оценка ROC_AUC или F1 - хороший выбор.

Мы можем в общих чертах разделить наши варианты на две категории:

  1. Использование методов предварительной обработки
  2. Настройка алгоритмов для работы с дисбалансом - добавление весов классов в алгоритм, например логистическая регрессия или дерево решений, или использование алгоритма ансамблевых методов (пакетирование и повышение), например, adaboost или XGBoost

2a) добавление весов классов в алгоритм, такой как логистическая регрессия или дерево решений, с использованием алгоритма ансамбля (пакетирование и ускорение), например, adaboost или XGBoost]

Некоторую технику предварительной обработки можно найти в пакете imbalance Python. (URL: - https://imbalanced-learn.readthedocs.io)

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

  1. Под выборкой
  2. Перед выборкой

Под выборкой означает удаление экземпляров класса большинства, в то время как передискретизация означает добавление экземпляров класса меньшинства. Если вы читаете документацию по несбалансированному пакету (https://imbalanced-learn.readthedocs.io), то есть много способов сделать это, но я остановлюсь только на некоторых из них.

  1. Передискретизация - случайная передискретизация, удар, адасин
  2. Недостаточная выборка - случайная при выборке, кластерные центроиды

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

Случайная передискретизация

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

X_train, X_test, y_train, y_test = train_test_split (X, y, test_size = 0.3, random_state = 0)
из imblearn.under_sampling import RandomUnderSampler
ros = RandomOverSampler (random_state = 0)
X_resampled, y_resampled = ros.fit_sample (X_train, y_train)
clf = DecisionTreeClassifier ()
clf.fit (X_resampled, y_resampled)
y_pred = clf.predict (X_test)

Roc_auc использовался для сравнения. ROC этого метода был 0,65.

SMOTE

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

X_train, X_test, y_train, y_test = train_test_split (X, y, test_size = 0.3, random_state = 0)
из imblearn.over_sampling import SMOTE
ros = SMOTE (random_state = 0, ratio = 1)
X_resampled, y_resampled = ros.fit_sample (X_train, y_train)
clf = DecisionTreeClassifier ()
clf.fit (X_resampled, y_resampled)
y_pred = clf.predict (X_test)

Roc_auc использовался для сравнения. ROC этого метода был 0,67.

ADASYN (https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.ADASYN.html)

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

Случайно с недостаточной выборкой

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

Центроиды кластера

Он группирует похожие точки данных и удаляет данные из кластера. Это гарантирует, что каждый кластер представлен правильно. Рассчитанный ROC_AUC составил 0,5.

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

Мой репозиторий на github: - https://github.com/Alekh-sinha/imbalance_class.git