Вступление

[ПРИМЕЧАНИЕ: «Кодировщики», которые пришли сюда, чтобы увидеть алгоритм машинного обучения, могут сразу перейти к коду]

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

Как может случиться мошенничество с кредитной картой?

Вот некоторые из наиболее распространенных причин:

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

Основные проблемы, возникающие при обнаружении мошенничества с кредитными картами:

  • Огромные данные обрабатываются каждый день, и построение модели должно быть достаточно быстрым, чтобы вовремя отреагировать на мошенничество.
  • Несбалансированные данные, т. е. большинство транзакций (99,8%) не являются мошенническими, что затрудняет обнаружение мошеннических транзакций.
  • Доступность данных, так как данные в основном конфиденциальны.
  • Неверно классифицированные данные могут быть еще одной серьезной проблемой, поскольку не все мошеннические транзакции обнаруживаются и сообщаются.
  • И последнее, но не менее важное: Адаптивные методы, используемые мошенниками против модели.

Как решить эти проблемы?

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

Работа с дисбалансом

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

Есть три распространенных способа справиться с дисбалансом данных.

  • Недостаточная выборка - односторонняя выборка Кубата и Матвина (ICML 1997).
  • Передискретизация - SMOTE (техника передискретизации синтетических меньшинств)
  • Объединение двух вышеперечисленных.

Дисбаланс выходит за рамки этой статьи. Вот еще одна статья, которая поможет вам разобраться с этой проблемой.

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

КОД

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

Сначала выбрал платформу, я предпочитаю Google Colab, но Kaggle тоже потрясающий. Вы можете сравнить эти два из этой статьи с точки зрения конфигурации графического процессора, поскольку цена не имеет значения (оба они бесплатны).

Если вы хотите, чтобы я написал статью о том, как использовать платформу Google Colab или Kaggle или ваш локальный компьютер для создания вашего классификатора, дайте мне знать в комментариях ниже 😉.

Вот ссылка GitHub на репозиторий Notebook. Вы можете разветвить его и даже нажать, чтобы предложить некоторые изменения в репозитории. Не стесняйтесь попробовать.

Импорт зависимостей

Вот код для импорта всех необходимых зависимостей

# import the necessary packages
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import gridspec

Если вы не установили все эти зависимости, я бы порекомендовал установить Дистрибутив Anaconda, который включает в себя большинство пакетов, с которыми вы столкнетесь. Вы также можете посмотреть это видео для Windows, руководство по установке Anaconda или прочитать эту статью Analytical Vidya для Mac или Linux.

Загрузка данных

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

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

Примечание. Путь в скобках должен быть путем, по которому вы сохранили набор данных на своем компьютере. Если вы используете Colab, вы можете подключить диск к ноутбуку и указать путь к каталогу на Google Диске для набора данных.

# Load the dataset from the csv file using pandas
data = pd.read_csv(‘/content/drive/My Drive/creditcard.csv’)

Понимание данных

Grab a peak at the data
data.head()

Из-за некоторых проблем с конфиденциальностью исходные элементы заменяются столбцами V1, V2,… V28, которые являются результатом преобразования PCA, примененного к исходным. Единственные функции, которые не были преобразованы с помощью PCA, - это «Время» и «Сумма». Функция «Класс» - это переменная ответа, которая принимает значение 1 в случае мошенничества и 0 в противном случае.

Время

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

Сумма

Сумма транзакции

Класс

1 для мошеннических транзакций, 0 в противном случае

Знайте числа

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

# Print the shape of the data
# data = data.sample(frac=0.1, random_state = 48)
print(data.shape)
print(data.describe())

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

# distribution of anomalous features
features = data.iloc[:,0:28].columns
plt.figure(figsize=(12,28*4))
gs = gridspec.GridSpec(28, 1)
for i, c in enumerate(data[features]):
 ax = plt.subplot(gs[i])
 sns.distplot(data[c][data.Class == 1], bins=50)
 sns.distplot(data[c][data.Class == 0], bins=50)
 ax.set_xlabel(‘’)
 ax.set_title(‘histogram of feature: ‘ + str(c))
plt.show()

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

# Determine number of fraud cases in dataset
Fraud = data[data[‘Class’] == 1]
Valid = data[data[‘Class’] == 0]
outlier_fraction = len(Fraud)/float(len(Valid))
print(outlier_fraction)
print(‘Fraud Cases: {}’.format(len(data[data[‘Class’] == 1])))
print(‘Valid Transactions: {}’.format(len(data[data[‘Class’] == 0])))

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

print(“Amount details of fraudulent transaction”)
Fraud.Amount.describe()

print(“details of valid transaction”)
Valid.Amount.describe()

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

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

# Correlation matrix
corrmat = data.corr()
fig = plt.figure(figsize = (12, 9))
sns.heatmap(corrmat, vmax = .8, square = True)
plt.show()

На тепловой карте мы можем ясно видеть, что большинство функций не коррелируют с другими функциями, но есть некоторые функции, которые имеют положительную или отрицательную корреляцию друг с другом. Например, «V2» и «V5» сильно отрицательно коррелируют с функцией, называемой «Сумма». Мы также видим некоторую корреляцию с «V20» и «Amount». Это дает нам более глубокое понимание доступных нам Данных.

Разобравшись с этим, давайте приступим к разделению значений данных на Features и Target.

#dividing the X and the Y from the dataset
X=data.drop([‘Class’], axis=1)
Y=data[“Class”]
print(X.shape)
print(Y.shape)
#getting just the values for the sake of processing (its a numpy array with no columns)
X_data=X.values
Y_data=Y.values

Используя Skicit, научитесь разделять данные на обучение и тестирование.

# Using Skicit-learn to split data into training and testing sets
from sklearn.model_selection import train_test_split
# Split the data into training and testing sets
X_train, X_test, Y_train, Y_test = train_test_split(X_data, Y_data, test_size = 0.2, random_state = 42)

Построение модели изолированного леса

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

#Building another model/classifier ISOLATION FOREST
from sklearn.ensemble import IsolationForest
ifc=IsolationForest(max_samples=len(X_train),
 contamination=outlier_fraction,random_state=1)
ifc.fit(X_train)
scores_pred = ifc.decision_function(X_train)
y_pred = ifc.predict(X_test)

Построение оценочной матрицы на тестовом наборе

# Reshape the prediction values to 0 for valid, 1 for fraud. 
y_pred[y_pred == 1] = 0
y_pred[y_pred == -1] = 1
n_errors = (y_pred != Y_test).sum()

Визуализация матрицы неточностей для этой модели.

#printing the confusion matrix
LABELS = [‘Normal’, ‘Fraud’]
conf_matrix = confusion_matrix(Y_test, y_pred)
plt.figure(figsize=(12, 12))
sns.heatmap(conf_matrix, xticklabels=LABELS,
 yticklabels=LABELS, annot=True, fmt=”d”);
plt.title(“Confusion matrix”)
plt.ylabel(‘True class’)
plt.xlabel(‘Predicted class’)
plt.show()

Давайте посмотрим, как оценить модель и распечатать результаты. Мы будем рассчитывать Точность, Точность, Напоминание, F1-Score и коэффициент корреляции Мэтьюса для целостности.

#evaluation of the model
#printing every score of the classifier
#scoring in any thing
from sklearn.metrics import confusion_matrix
n_outliers = len(Fraud)
print(“the Model used is {}”.format(“Isolation Forest”))
acc= accuracy_score(Y_test,y_pred)
print(“The accuracy is {}”.format(acc))
prec= precision_score(Y_test,y_pred)
print(“The precision is {}”.format(prec))
rec= recall_score(Y_test,y_pred)
print(“The recall is {}”.format(rec))
f1= f1_score(Y_test,y_pred)
print(“The F1-Score is {}”.format(f1))
MCC=matthews_corrcoef(Y_test,y_pred)
print(“The Matthews correlation coefficient is{}”.format(MCC))

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

Построение модели случайного леса

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

Вы также можете обратиться к этому видео

# Building the Random Forest Classifier (RANDOM FOREST)
from sklearn.ensemble import RandomForestClassifier
# random forest model creation
rfc = RandomForestClassifier()
rfc.fit(X_train,Y_train)
# predictions
y_pred = rfc.predict(X_test)

Построение оценочной матрицы на тестовом наборе

Давайте посмотрим, как оценить модель и распечатать результаты. Мы будем рассчитывать точность, точность, отзывчивость, F1-Score и коэффициент корреляции Мэтьюза.

#Evaluating the classifier
#printing every score of the classifier
#scoring in any thing
from sklearn.metrics import classification_report, accuracy_score,precision_score,recall_score,f1_score,matthews_corrcoef
from sklearn.metrics import confusion_matrix
n_outliers = len(Fraud)
n_errors = (y_pred != Y_test).sum()
print(“The model used is Random Forest classifier”)
acc= accuracy_score(Y_test,y_pred)
print(“The accuracy is {}”.format(acc))
prec= precision_score(Y_test,y_pred)
print(“The precision is {}”.format(prec))
rec= recall_score(Y_test,y_pred)
print(“The recall is {}”.format(rec))
f1= f1_score(Y_test,y_pred)
print(“The F1-Score is {}”.format(f1))
MCC=matthews_corrcoef(Y_test,y_pred)
print(“The Matthews correlation coefficient is{}”.format(MCC))

Также визуализируйте матрицу путаницы.

#printing the confusion matrix
LABELS = [‘Normal’, ‘Fraud’]
conf_matrix = confusion_matrix(Y_test, y_pred)
plt.figure(figsize=(12, 12))
sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt=”d”);
plt.title(“Confusion matrix”)
plt.ylabel(‘True class’)
plt.xlabel(‘Predicted class’)
plt.show()

Визуализация леса

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

#visualizing the random tree 
feature_list = list(X.columns)
# Import tools needed for visualization
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydot
#pulling out one tree from the forest
tree = rfc.estimators_[5]
export_graphviz(tree, out_file = ‘tree.dot’, feature_names = feature_list, rounded = True, precision = 1)
# Use dot file to create a graph
(graph, ) = pydot.graph_from_dot_file(‘tree.dot’)
# Write graph to a png file
display(Image(graph.create_png()))

Заключение

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

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

Итак, давайте посмотрим, сколько целей мы достигли в этой статье:

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

Эта область требует гораздо большего количества исследований, и это одна из тем, где повышение специфичности на 0,1% сэкономит миллионы, если не миллиарды долларов.

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

Увидимся в следующей статье. А пока продолжайте кодировать👩‍💻 !!