Обнаружение мошенничества с онлайн-платежами с использованием машинного обучения в Python
По мере того, как мы приближаемся к современности, тенденция к оплате онлайн значительно возрастает. Покупателю очень выгодно платить онлайн, так как это экономит время, и решает проблему свободных денег. Кроме того, нам не нужно носить с собой наличные деньги. Но все мы знаем, что Хорошие вещи сопровождаются плохими вещами .
Метод онлайн-платежей приводит к мошенничеству, которое может произойти с использованием любого платежного приложения. Вот почему обнаружение мошенничества с онлайн-платежами очень важно.
Обнаружение мошенничества с онлайн-платежами с использованием машинного обучения в Python
Здесь мы попробуем решить этот вопрос с помощью машинного обучения в Python.
Набор данных, который мы будем использовать, имеет эти столбцы:
Особенность | Описание |
шаг | говорит о единице времени |
тип | тип совершаемой сделки |
количество | общая сумма сделки |
названиеОрг | счет, с которого начинается транзакция |
oldbalanceOrg | Баланс счета отправителя до транзакции |
newbalanceOrg | Баланс счета отправителя после транзакции |
имяDest | счет, который получает транзакцию |
старый балансDest | Баланс счета получателя до операции |
newbalanceDest | Баланс счета получателя после транзакции |
этоМошенничество | Прогнозируемое значение, т.е. 0 или 1 |
Импорт библиотек и наборов данных
Используемые библиотеки:
- Pandas: эта библиотека помогает загружать фрейм данных в формате 2D-массива и имеет несколько функций для выполнения задач анализа за один раз.
- Seaborn/Matplotlib: для визуализации данных.
- Numpy: Массивы Numpy очень быстрые и могут выполнять большие вычисления за очень короткое время.
Python3
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns % matplotlib inline |
Набор данных включает в себя такие функции, как тип платежа, старый баланс, уплаченная сумма, название пункта назначения и т. д.
Python3
data = pd.read_csv( "new_data.csv" ) data.head() |
Выход :
Чтобы распечатать информацию о данных, мы можем использовать команду data.info().
Python3
data.info() |
Выход :
Давайте посмотрим среднее, count , минимальное и максимальное значения данных.
Python3
data.describe() |
Выход :
Визуализация данных
В этом разделе мы постараемся разобраться и сравнить все столбцы.
Давайте посчитаем столбцы с разными типами данных, такими как Category, Integer, Float.
Python3
obj = (data.dtypes = = "object" ) object_cols = list (obj[obj].index) print ( "Categorical variables:" , len (object_cols)) int_ = (data.dtypes = = "int" ) num_cols = list (int_[int_].index) print ( "Integer variables:" , len (num_cols)) fl = (data.dtypes = = "float" ) fl_cols = list (fl[fl].index) print ( "Float variables:" , len (fl_cols)) |
Выход :
Categorical variables: 3 Integer variables: 2 Float variables: 5
Давайте посмотрим график подсчета столбца «Тип платежа», используя библиотеку Seaborn.
Python3
sns.countplot(x = "type" , data = data) |
Выход :
Мы также можем использовать гистограмму для одновременного анализа столбца «Тип» и «Количество» .
Python3
sns.barplot(x = "type" , y = "amount" , data = data) |
Выход :
Как на графике хорошо видно, что в основном тип cash_out и transfer максимальны как по количеству, так и по сумме.
Давайте проверим распределение данных между обоими значениями прогноза.
Python3
data[ "isFraud" ].value_counts() |
Выход :
0 8000 1 8000
Набор данных уже находится в том же количестве. Так что нет необходимости в примерке.
Теперь давайте посмотрим на распределение столбца шага с помощью distplot.
Python3
plt.figure(figsize = ( 15 , 6 )) sns.distplot(data[ "step" ], bins = 50 ) |
Выход :
На графике показано максимальное распределение между 200 и 400 шагами.
Теперь давайте найдем корреляцию между различными функциями, используя тепловую карту.
Python3
plt.figure(figsize = ( 12 , 6 )) sns.heatmap(data.corr(), cmap = "BrBG" , fmt = ".2f" , linewidths = 2 , annot = True ) |
Выход :
Предварительная обработка данных
Этот шаг включает в себя следующее:
- Кодировка столбца Тип
- Удаление ненужных столбцов, таких как nameOrig, nameDest
- Разделение данных
Python3
type_new = pd.get_dummies(data[ "type" ], drop_first = True ) data_new = pd.concat([data, type_new], axis = 1 ) data_new.head() |
Выход:
Как только мы закончили с кодировкой, теперь мы можем удалить ненужные столбцы. Для этого следуйте приведенному ниже коду.
Python3
X = data_new.drop([ "isFraud" , "type" , "nameOrig" , "nameDest" ], axis = 1 ) y = data_new[ "isFraud" ] |
Давайте проверим форму извлеченных данных.
Python3
X.shape, y.shape |
Выход:
((16000, 10), (16000,))
Теперь давайте разделим данные на 2 части: обучение и тестирование.
Python3
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.3 , random_state = 42 ) |
Обучение модели
Поскольку предсказание является проблемой классификации, мы будем использовать следующие модели:
- Логистическая регрессия : Он предсказывает, относится ли вероятность данных к определенной категории или нет.
- XGBClassifier : относится к деревьям решений Gradient Boosted. В этом алгоритме деревья решений создаются в последовательной форме, и всем независимым переменным присваиваются веса, которые затем вводятся в дерево решений, предсказывающее результаты.
- SVC: SVC используется для поиска гиперплоскости в N-мерном пространстве, которая четко классифицирует точки данных. Затем он выдает результат в соответствии с наиболее близким элементом.
- RandomForestClassifier : классификатор случайного леса создает набор деревьев решений из случайно выбранного подмножества обучающего набора. Затем он собирает голоса из разных деревьев решений, чтобы сделать окончательный прогноз.
Давайте импортируем модули соответствующих моделей.
Python3
from xgboost import XGBClassifier from sklearn.metrics import roc_auc_score as ras from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier |
Закончив импорт, давайте обучим модель.
Python3
models = [LogisticRegression(), XGBClassifier(), SVC(kernel = "rbf" , probability = True ), RandomForestClassifier(n_estimators = 7 , criterion = "entropy" , random_state = 7 )] for i in range ( len (models)): models[i].fit(X_train, y_train) print (f "{models[i]} : " ) train_preds = models[i].predict_proba(X_train)[:, 1 ] print ( "Training Accuracy : " , ras(y_train, train_preds)) y_preds = models[i].predict_proba(X_test)[:, 1 ] print ( "Validation Accuracy : " , ras(y_test, y_preds)) print () |
Выход:
Оценка модели
Лучшей моделью является XGBClassifier. Давайте построим матрицу путаницы для того же самого.
Python3
from sklearn.metrics import plot_confusion_matrix plot_confusion_matrix(models[ 1 ], X_test, y_test) plt.show() |
Выход: