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

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

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

Также всю реализацию можно найти здесь.

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

1. Очистка, исследование и визуализация данных

Мы читаем данные с помощью библиотеки pandas и детально изучили данные. Из этих данных можно сделать несколько выводов.

Наблюдение

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

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

- Класс имеет два значения: «0» → «Операции без мошенничества» и «1» → «Операции с мошенничеством».

- В наборе данных нет нулевых значений.

Затем мы искали доступные классы, присутствующие в нашем наборе данных, и вычисляли их количество.

Наблюдение

- Можно заметить, что транзакций без мошенничества в слишком большом количестве по сравнению с транзакциями с мошенничеством.

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

- Следовательно, мы рассмотрим различные методы передискретизации и недостаточной выборки.

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

В пакете sklearn доступны различные методы масштабирования. Будет интересно проверить, какой метод масштабирования может лучше всего масштабировать нашу переменную, что поможет центрировать наши данные для нашей гауссовой кривой. Мы протестировали различные методы масштабирования, такие как StandardScaler, MinMaxScaler и RobustScaler, и решили использовать RobustScaler. Robust Scaler менее подвержен выбросам. Посетите эту страницу для получения более подробной информации - сравнение между другими методами масштабирования.

Чтобы просмотреть наш набор данных, нам нужно уменьшить размерность до 2. У нас есть 3 варианта:

  1. Анализ основных компонентов (PCA)
  2. Разложение по сингулярным значениям (SVD)
  3. Распределенное стохастическое соседнее вложение (t-SNE)

Мы заметили, что tSNE показывает точность, которая может четко отображать случаи мошенничества и отсутствия мошенничества.

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

Наша цель - создать данные с одинаковой выборкой из каждого класса, чтобы устранить систематическую ошибку в наборе данных. Как мы поняли ранее, у нас всего 492 класса для образцов без мошенничества, то мы должны взять только 492 образца для мошенничества. Следовательно, мы выберем RandomUnderSampler для библиотеки imblearn.

2. Оптимизация данных

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

  1. Отрицательная корреляция для проверки аномалий - v3, v9, v10, v12, v14, v16, v17 сильно отрицательно коррелированы.
  2. Положительная корреляция для аномалии chcek - v2, v4, v11, v19 сильно положительно коррелированы.

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

Мы также построили график распределения, чтобы посмотреть, насколько они отклоняются от нормального распределения.

Удаление выбросов

Чтобы удалить достаточное количество выбросов, мы попытались использовать метод Z-score и метод IQR.

  1. Метод Z-Score: интуиция Z-Score состоит в том, чтобы описать любую точку данных, найдя их связь со стандартным отклонением и средним значением группы точек данных. Z-оценка находит распределение данных, где среднее значение равно 0, а стандартное отклонение равно 1, то есть нормальное распределение. В большинстве случаев используется порог 3 или -3, т.е. если значение Z-score больше или меньше 3 или -3 соответственно,
  2. Метод IQR: IQR чем-то похож на Z-оценку с точки зрения определения распределения данных и последующего сохранения некоторого порога для выявления выброса. Затем мы умножаем на порог (1.5) и пытаемся включить только эти значения.

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

3. Моделирование и обучение

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

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_curve, auc, classification_report
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.gaussian_process import GaussianProcessClassifier
import xgboost
from sklearn import svm, tree
from sklearn import metrics

classifiers = []
nb_model = GaussianNB()
classifiers.append(("Gausian Naive Bayes Classifier",nb_model))
lr_model= LogisticRegression()
classifiers.append(("Logistic Regression Classifier",lr_model))
# sv_model = svm.SVC()
# classifiers.append(sv_model)
dt_model = tree.DecisionTreeClassifier()
classifiers.append(("Decision Tree Classifier",dt_model))
rf_model = RandomForestClassifier()
classifiers.append(("Random Forest Classifier",rf_model))
xgb_model = xgboost.XGBClassifier()
classifiers.append(("XG Boost Classifier",xgb_model))
lda_model = LinearDiscriminantAnalysis()
classifiers.append(("Linear Discriminant Analysis", lda_model))
gp_model =  GaussianProcessClassifier()
classifiers.append(("Gaussian Process Classifier", gp_model))
ab_model =  AdaBoostClassifier()
classifiers.append(("AdaBoost Classifier", ab_model))

cv_scores = []
names = []
for name, clf in classifiers:
    print(name)
    clf.fit(X_train, y_train)
    y_prob = clf.predict_proba(X_test)[:,1] # This will give you positive class prediction probabilities  
    y_pred = np.where(y_prob > 0.5, 1, 0) # This will threshold the probabilities to give class predictions.
    print("Model Score : ",clf.score(X_test, y_pred))
    print("Number of mislabeled points from %d points : %d"% (X_test.shape[0],(y_test!= y_pred).sum()))
    scores = cross_val_score(clf, X, y, cv=10, scoring='accuracy')
    cv_scores.append(scores)
    names.append(name)
    print("Cross validation scores : ",scores.mean())
    confusion_matrix=metrics.confusion_matrix(y_test,y_pred)
    print("Confusion Matrix \n",confusion_matrix)
    classification_report = metrics.classification_report(y_test,y_pred)
    print("Classification Report \n",classification_report)

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