Как машинное обучение меняет ландшафт обнаружения мошенничества
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.