Как машинное обучение меняет ландшафт обнаружения мошенничества

1. 1 Суть проблемы

« Мошенничество - это бизнес на миллиард

И с каждым годом увеличивается »

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

Неудивительно, что мошенничество так важно. Предполагаемые убытки коммерческих организаций увеличиваются до 4–5% их доходов из-за мошеннических операций. Мошенничество в 5% может показаться не слишком большим, но в денежном выражении это нетривиально и значительно перевешивает затраты, связанные с бездействием. Исследование PwC показало, что 50% из 7 200 опрошенных компаний были жертвами какого-либо мошенничества. Недавнее исследование FICO показало, что 4 из 5 банков, участвовавших в опросе, испытали рост мошенничества, и ожидается, что в будущем этот показатель будет расти.

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

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

1. 2 Сценарии использования

Мошенничество присутствует везде - где бы ни происходила транзакция, - но мошенничество с кредитными картами, вероятно, является наиболее известным случаем. Это может быть как примитивное, например кража или использование украденных карт, так и агрессивные формы, такие как захват аккаунта, подделка и т. Д.. Мошенничество с кредитными картами существовало всегда, но его масштабы растут только в последнее время из-за увеличения количества онлайн-транзакций, совершаемых с помощью кредитных карт каждый день. Согласно отчету Nilson Report в 2010 году, сумма глобального мошенничества составила 7,6 миллиарда долларов США и, как ожидается, превысит колоссальную сумму в 31 миллиард долларов в 2020 году. Только в Великобритании убытки от мошеннических транзакций оценивались в более чем 1 миллиард долларов США в 2018 году. .

Другие виды крупных случаев мошенничества продолжаются в страховых отраслях. По некоторым оценкам, до 10% заявлений о медицинском страховании в США могут быть связаны с мошенничеством, что является нетривиальной суммой в 110 миллиардов долларов США в год.

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

2.1 Решение для науки о данных

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

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

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

2.2 Методы

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

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

Алгоритмы машинного обучения без учителя: кластерный анализ, байесовская сеть, групповой анализ, анализ точек разрыва, закон Бенфорда (закон аномальных чисел).

3. Простая реализация Python

3.1 Подготовка данных

Для этой простой демонстрации я использую популярный набор данных Kaggle.

# import libraries
import pandas as pd
import numpy as np
# import data
df = pd.read_csv("..\creditcard.csv")
# view the column names
df.columns

Набор данных состоит из 31 столбца. Первый столбец «Время» - это временная метка транзакции, второй последний столбец «Сумма» - сумма транзакции, а последний столбец «Класс» указывает, является ли транзакция мошеннической или немедленной (мошенничество = 1, отсутствие мошенничества = 0). Остальные столбцы от «V1» до «V28» представляют собой неизвестные переменные, которые были преобразованы перед публикацией данных.

# number of fraud and non-fraud observations in the dataset
frauds = len(df[df.Class == 1])
nonfrauds = len(df[df.Class == 0])
print("Frauds", frauds); print("Non-frauds", nonfrauds)
## scaling the "Amount" and "Time" columns similar to the others variables
from sklearn.preprocessing import RobustScaler
rob_scaler = RobustScaler()
df['scaled_amount'] = rob_scaler.fit_transform(df['Amount'].values.reshape(-1,1))
df['scaled_time'] = rob_scaler.fit_transform(df['Time'].values.reshape(-1,1))
# now drop the original columns
df.drop(['Time','Amount'], axis=1, inplace=True)
# define X and y variables
X = df.loc[:, df.columns != 'Class']
y = df.loc[:, df.columns == 'Class']

3.2 Изготовление подвыборок

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

# number of fraud cases
frauds = len(df[df.Class == 1])
# selecting the indices of the non-fraud classes
fraud_indices = df[df.Class == 1].index
nonfraud_indices = df[df.Class == 0].index
# From all non-fraud observations, randomly select observations equal to number of fraud observations
random_nonfraud_indices = np.random.choice(nonfraud_indices, frauds, replace = False)
random_nonfraud_indices = np.array(random_nonfraud_indices)
# Appending the 2 indices
under_sample_indices = np.concatenate([fraud_indices,random_nonfraud_indices])
# Under sample dataset
under_sample_data = df.iloc[under_sample_indices,:]
# Now split X, y variables from the under sample data
X_undersample = under_sample_data.loc[:, under_sample_data.columns != 'Class']
y_undersample = under_sample_data.loc[:, under_sample_data.columns == 'Class']

3.3 Моделирование

## split data into training and testing set
from sklearn.model_selection import train_test_split
# # The complete dataset
# X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)
# Split dataset
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_undersample,y_undersample                                                                                                                                                                                                                                                                                             ,random_state = 0)
## modeling with logistic regression
#import model
from sklearn.linear_model import LogisticRegression
# instantiate model
model = LogisticRegression()
# fit 
model.fit(X_train_undersample, y_train_undersample)
# predict
y_pred = model.predict(X_test_undersample)

3.4. Проверка модели

Примечание. Не используйте показатель точности в качестве показателя. В наборе данных с 99,9% наблюдений, не связанных с мошенничеством, вы, вероятно, сделаете правильный прогноз в 99% случаев. Матрица путаницы и оценка точности / запоминания являются лучшими показателями.

# import classification report and confusion matrix
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
classification_report = classification_report(y_test_undersample, y_pred)
confusion_matrix = confusion_matrix(y_test_undersample, y_pred)
print("CLASSIFICATION REPORT")
print(classification_report)
print("CONFUSION MATRIX") 
print(confusion_matrix)

Конец примечания:

Спасибо, что прочитали это. Блокнот Jupyter вместе с демонстрацией Python можно найти в репозитории GitHub. Со мной можно связаться через Twitter или LinkedIn.