“ СО СТАТИСТИКОЙ ЛЕГКО ЛГАТЬ. ТРУДНО СКАЗАТЬ ПРАВДУ БЕЗ СТАТИСТИКИ»

(Андрейс Дубкельс)

Андрей прав! Статистика может быть использована, чтобы сказать заслуживающую доверия ложь. Данные — это основа машинного обучения или статистических моделей. Что произойдет, если данные будут несбалансированными? К сожалению, модель покажет высокую точность, но машина будет склоняться к большинству классов данных!

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

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

Понимание проблемы

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

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

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

Описание данных

Набор данных содержит транзакции, совершенные по кредитным картам в сентябре 2013 года держателями карт из Европы. Этот набор данных представляет транзакции, которые произошли за два дня, где у нас есть 492 мошенничества из 284 807 транзакций. Набор данных сильно несбалансирован, на положительный класс (мошенничество) приходится 0,172% всех транзакций. Он содержит только числовые входные переменные, которые являются результатом преобразования PCA. Из соображений конфиденциальности не предоставляются исходные функции и дополнительная справочная информация о данных.

  • Характеристики V1, V2, … V28 являются основными компонентами, рассчитанными с помощью PCA;
  • Единственными функциями, которые не были преобразованы с помощью PCA, являются время и количество. Feature Time содержит количество секунд, прошедших между каждой транзакцией и первой транзакцией в наборе данных. Функция «Сумма» — это сумма транзакции, эту функцию можно использовать для зависимого от примера обучения с учетом затрат.
  • Feature Class — это переменная ответа, которая принимает значение 1 в случае мошенничества и 0 в противном случае.

Пожалуйста, обратитесь к описанию Kaggle для более подробной информации о наборе данных здесь.

Изучение данных

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

1. Загрузка необходимых пакетов:

Сначала импортируйте все необходимые пакеты. Если вы не установили их должным образом, обратитесь к официальной документации каждой библиотеки для получения подробной информации (pandas, seborn, sklearn, numpy и imblearn).

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from imblearn.over_sampling import SMOTE
from imblearn.combine import SMOTEENN
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score,roc_auc_score,recall_score,accuracy_score,precision_score
import warnings
warnings.filterwarnings('ignore')

2. Импорт данных и проверка

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

df=pd.read_csv('creditcard.csv')
 values=df['Class'].value_counts()
 f1 = sns.barplot(values.index,values.values)
 plt.title("Number of Class Labels")

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

3. График плотности времени транзакций

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

lass_0 = df.loc[df['Class'] == 0]["Time"] # Fraud transactions
class_1 = df.loc[df['Class'] == 1]["Time"] # Genuine transactions
f1=sns.distplot(class_0,kde=True,hist=False,label='Genuine')
f2=sns.distplot(class_1,kde=True,hist=False,label='Fraud')
plt.legend()
plt.title('Time Density Distribution of Transactions')

plt.show()

Как видно из графика плотности времени, мошеннические транзакции распределены более равномерно, чем законные.

4. Общая сумма транзакции

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

fig, (ax1, ax2) = plt.suAs can be seen from the time density plot, the fraudulent transactions are more evenly distributed than the legitimate ones.

4. Total Amount Transacted

In this step, we will visualize the trend of the transaction amount by using a line plot.

fig, (ax1, ax2) = plt.subplots(ncols=2,figsize=(15,5))
f=sns.lineplot(ax=ax1,data=df_amount.loc[df_amount['Class']==0], x='Hour',y='sum')
f=sns.lineplot(ax=ax2,data=df_amount.loc[df_amount['Class']==1], x='Hour',y='sum',color='orange')
ax1.title.set_text("Genuine")
ax2.title.set_text("Fraud")
plt.suptitle("Total Amount Transacted")
plt.show)

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

5. Среднее количество транзакций

Как и в случае с графиком общего количества транзакций, давайте также визуализируем среднюю сумму транзакции.

fig, (ax1, ax2) = plt.subplots(ncols=2,figsize=(15,5))
f=sns.lineplot(ax=ax1,data=df_amount.loc[df_amount['Class']==0], x='Hour',y='mean')
f=sns.lineplot(ax=ax2,data=df_amount.loc[df_amount['Class']==1], x='Hour',y='mean',color='orange')
ax1.title.set_text("Genuine")
ax2.title.set_text("Fraud")
plt.suptitle("Average Amount of Transactions")
plt.show()

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

6. Соотношение характеристик

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

correlation = df.corr()
plt.figure(figsize = (12,12))
sns.heatmap(correlation,cmap='Blues',linewidths=0.1)
plt.title("Correlation Heat Map")
plt.show()

  • Отрицательная или обратная корреляция со временем: V25, V11, V3
  • Положительная корреляция со временем: V22, V18, V16, V12, V7, V5, V1, НО НЕ СИЛЬНАЯ ВИДИМАЯ КОРРЕЛЯЦИЯ
  • Отрицательная корреляция с количеством: V2, V5
  • Положительная корреляция с количеством: v4, v6, v7, v20
  • Время и количество не коррелируют с классом.
  • V2, V4 и V11 имеют положительную корреляцию с классом
  • Нет корреляций между переменными от V1 до V28.

Преодоление проблем с несбалансированными данными

Как мы видели ранее, данные сильно несбалансированы. Итак, если мы обучим здесь наивную модель как простую модель, которая всегда предсказывает цель как класс 0. Модель будет имитировать высокую точность. Учтите, что мы тестируем модель с набором данных с тем же распределением, что и исходные данные, тогда она будет предсказывать с точностью 99,83%, хотя не сможет обнаружить мошеннические транзакции, и поэтому модель не смогла выполнить свою задачу. цель.

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

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

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

# function to train the Logistic Regression Model
def train_model_LR(X_train,y_train, X_test,y_test):
    model = LogisticRegression()
    model.fit(X_train,y_train)
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test,y_pred)
    f1 = f1_score(y_test,y_pred)
    recall = recall_score(y_test,y_pred)
    prec = precision_score(y_test,y_pred)
    auc = roc_auc_score(y_test,y_pred)
    print(f' accuracy = {accuracy}\n recall = {recall}, \n precision = {prec}, \n auc score = {auc}')
    lr_disp = RocCurveDisplay.from_estimator(model,X_test,y_test)

    return None

1. Неполная выборка

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

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

from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled_under, y_resampled_under =rus.fit_resample(X_train, y_train)

2. Излишняя выборка

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

from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled_over, y_resampled_over = ros.fit_resample(X_train, y_train)

3. SMOTE (Техника передискретизации синтетического меньшинства)

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

sampling_model = SMOTE() 
X_resampled,y_resampled = sampling_model.fit_resample(X_train,y_train) 
fraud = y_resampled[~(y_resampled == 1)]

4. Анализ эффективности

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

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

Конечные примечания

Из таблицы показателей производительности и кривых ROC, приведенных в предыдущем разделе, мы можем сделать вывод, что:

  • Модель, построенная на несбалансированных данных без применения каких-либо методов выборки, является ненадежной и представляется очень точной. Модель работала с низкими значениями точности и полноты, 0,664 и 0,629 соответственно.
  • Недостаточная выборка данных могла помочь улучшить значение полноты модели до 0,905, но модель была менее точной.
  • Избыточная выборка данных улучшила точность и полноту до 0,042 и 0,931 соответственно.
  • Применение SMOTE повысило точность модели с 0,042 до 0,071 и продемонстрировало хорошую полноту и точность.

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

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