Это выборка ответа? Давайте разберемся!

Абхи Савалия, Чираю Шах, Сагар Парих

Предположим, вы работаете в финансовом учреждении, и перед вами стоит задача прогнозировать мошенничество с кредитными картами. Вы выбрали лучший алгоритм для обучения своей модели. Оценив модель, вы обнаружите, что она имеет точность 99,8%. В восторге, вы открываете пиво, но подождите!

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

Так что же скрывается за классовым дисбалансом и проблемами его решения? Давайте возьмем наивный подход к выбору классификатора логистической регрессии для обучения нашей модели.

В нашем случае 99% случаев не были бы мошенническими, и наша модель обучалась бы по такому шаблону. Даже если наша модель предсказывает, что все экземпляры не являются мошенническими, мы все равно получим точность 99%! Хотя, прежде чем решать такие проблемы, мы должны убедиться, что эти методы необходимы только тогда, когда мы действительно заботимся о классе minority. Примеры таких случаев:

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

Теперь давайте посмотрим, как справляться с дисбалансом классов и какие показатели мы можем использовать для оценки нашей модели.

Для этого случая мы будем использовать набор данных кредитной карты, доступный в Kaggle. Он содержит данные о транзакциях по кредитным картам, которые произошли в течение двух дней, с 492 случаями мошенничества из 284 807 транзакций. Все переменные в наборе данных числовые. Данные были преобразованы с использованием преобразований PCA из соображений конфиденциальности.

Давайте изучим данные и визуализируем количество классов.

Normal data distribution: Counter({0: 284315, 1: 492})

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

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

Ложно-положительный результат (FP): если транзакция не является мошенничеством, но наша модель предсказывает ее как мошенничество.

Истинно положительный результат (TP): когда транзакция является мошенничеством и правильно определяется нашей моделью.

Ложноотрицательный (FN): когда транзакция является мошенничеством, но наша модель классифицирует ее как мошенничество. Это число, которое мы стремимся уменьшить в нашем случае. (В идеале 0!)

Истинно-отрицательный (TN): когда обычная транзакция правильно классифицируется нашей моделью.

Точность: процент мошеннических транзакций, правильно классифицированных нашей моделью (TP / TP + FP).

Напомним: процент мошеннических транзакций, обнаруженных нашей моделью (TP / TP + FN). Уменьшение числа FN означает высокий рейтинг запоминаемости.

Оценка F1: средневзвешенное значение точности и запоминания. Это дает сбалансированную оценку точности и отзывчивости в сочетании. (2 * Точность * Вызов / (Точность + Вызов))

Давайте еще раз вернемся к нашему наивному подходу и посмотрим на результаты.

classifier = LogisticRegression
# splitting data into training and test set
X_train, X_test, y_train, y_test = train_test_split(data[features], data[y_label], random_state=2)
# build normal model
pipeline = make_pipeline(classifier(random_state=42))
model = pipeline.fit(X_train, y_train)
prediction = model.predict(X_test)

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

precision: 0.74462
recall: 0.56143
f1 score: 0.63764

Оценка отзыва 56%. Нашей модели не удалось поймать почти половину мошенничества! Попробуем улучшить производительность с помощью методов выборки.

Два основных метода решения нашей проблемы:

  1. Недостаточная выборка - этот метод заключается в уменьшении количества выборок класса большинства до размера класса меньшинства.
  2. Передискретизация - этот метод заключается в увеличении количества меньшинств до размера большинства.

Теперь давайте рассмотрим и реализуем оба этих метода и поймем плюсы и минусы обоих.

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

NearMiss data distribution: Counter({0: 492, 1: 492})

Перекрестная проверка методом K-сгибов

Давайте оценим нашу модель с помощью перекрестной проверки K Fold. Это случайным образом перемешает набор данных поезда и разделит его на K уникальных групп. Здесь мы будем тренировать нашу модель с k = 5 складками.

#We will use the Random Forest Classifier 
classifier = RandomForestClassifier
kf = KFold(n_splits=5, random_state=42)
accuracy_nm = []
precision_nm = []
recall_nm = []
confusion_nm = []
models_nm = []
f1_nm = []
for train, test in kf.split(X_train, y_train):
    pipeline = make_pipeline_imb(NearMiss(random_state=42), classifier(random_state=42))
    model = pipeline.fit(X_train.iloc[train], y_train.iloc[train])
    models_nm.append(model)
    prediction = model.predict(X_train.iloc[test])
    accuracy_nm.append(pipeline.score(X_train.iloc[test], y_train.iloc[test]))
    precision_nm.append(precision_score(y_train.iloc[test], prediction))
    recall_nm.append(recall_score(y_train.iloc[test], prediction))
    f1_nm.append(f1_score(y_train.iloc[test], prediction))
    confusion_nm.append(confusion_matrix(y_train.iloc[test], prediction))

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

best_idx = recall_nm.index(max(recall_nm))
best_model = models_nm[best_idx]
prediction_test = best_model.predict(X_test)
plot_confusion_matrix(confusion_matrix(y_test,prediction_test),classes=LABELS, title=’Confusion Matrix’)

precision: 0.00165
recall: 0.99064
f1: 0.00334

Ага! Оценка отзыва 99%! Это выглядит слишком хорошо, чтобы быть правдой. Изучая нашу матрицу путаницы, кажется, что наша модель имеет очень большое количество ложных срабатываний, о чем свидетельствует низкая оценка точности. В таких случаях неравномерного распределения классов предпочтительным показателем является оценка F1. В нашем примере мы получили очень низкий балл F1. Почему слабая производительность? Давайте исследуем:

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

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

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

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

best_idx = recall.index(max(recall))
best_model = models[best_idx]
prediction_test = best_model.predict(X_test)
plot_confusion_matrix(confusion_matrix(y_test,prediction_test),classes=LABELS, title=’Confusion Matrix’)

precision: 0.85072
recall: 0.82241
f1: 0.83852

Мы видим высокий результат F1 с техникой SMOTE. Большой! Это означает, что мы выявляем большое количество случаев мошенничества (высокий уровень отзыва) с высокой точностью. Эта модель дает нам лучшую производительность по сравнению с нормальным распределением и недостаточной выборкой.

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

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

Надеюсь, вам понравилось чтение :)