Автоматизация машинного обучения в финансах

Машинное обучение находит множество применений в финансах, таких как безопасность, автоматизация процессов, андеррайтинг ссуд / страховок, кредитный скоринг, торговля и т. Д. [1] [2]. Финансовое мошенничество - одна из основных проблем финансовой безопасности [1] [2]. Чтобы бороться с растущим риском финансового мошенничества, машинное обучение активно применяется для обнаружения мошенничества [3] [4].

Применение машинного обучения для обнаружения мошенничества связано с множеством технических проблем. Одна из основных трудностей состоит в том, что набор данных имеет тенденцию быть сильно искаженным и несбалансированным с точки зрения положительных и отрицательных классов [3] [4]. Как показано в [3], в этом случае для получения результатов обнаружения / прогнозирования спуска мошенничества, как правило, требуются как опыт в предметной области, так и большой объем ручной работы для исследования данных, предварительной обработки данных, проектирования функций, выбора модели, обучения, оценки. , так далее.

Для решения этих проблем H2O [6] предоставляет удобный модуль автоматического машинного обучения под названием AutoML [7], который могут использовать неспециалисты.

В этой статье, как и в [3], я использую тот же сильно искаженный и несбалансированный набор синтетических финансовых данных в Kaggle [5], чтобы продемонстрировать, как использовать AutoML [7] для упрощения машинного обучения для прогнозирования мошенничества по сравнению с методом машинного обучения в [ 3].

1. Машинное обучение без автоматизации

В этом разделе резюмируются ключевые моменты метода машинного обучения без автоматизации из [3], чтобы установить базовый уровень для сравнения с методом автоматического машинного обучения H2O в разделе 2.

1.1 Исследование данных

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

  • функция тип

Класс ответа isFraud (0-нет, 1-да) устанавливается только тогда, когда свойство type имеет значение CASH_OUT или TRANSFER. Таким образом, единственными релевантными записями данных являются те записи, которые имеют тип значения CASH_OUT или TRANSFER [3].

  • функция isFlaggedFraud

Функция isFlaggedFraud устанавливается только в 16 записях / выборках данных [3] из миллионов записей данных в общей сложности, поэтому мы можем отказаться от этой функции без значительного влияния на результаты моделирования и прогнозирования мошенничества.

  • функции nameOrig и nameDest

Как указано в [3], функции nameOrig и nameDest бессмысленны, поскольку они не кодируют аккаунты продавцов ожидаемым образом и, следовательно, могут быть отброшены.

1.2 Предварительная обработка данных

Набор данных предварительно обрабатывается в [3], как показано ниже, на основе результатов исследования данных.

  • Извлечение записей данных типа TRANSFER или CASH_OUT

Согласно результатам исследования данных, мошенничество происходит только в том случае, если тип данных - TRANSFER или CASH_OUT. Таким образом, только те записи данных извлекаются из необработанного набора данных, как показано ниже для обучения модели и прогнозирования мошенничества в [3]. Кроме того, исключены менее полезные функции nameOrig, nameDest и isFlaggedFraud:

X = df.loc[(df.type == ‘TRANSFER’) | (df.type == ‘CASH_OUT’)]
X = X.drop([‘nameOrig’, ‘nameDest’, ‘isFlaggedFraud’], axis = 1)
  • Ввод отсутствующих значений

Как описано в [3], нулевой баланс целевого счета является сильным признаком мошенничества. Таким образом, сальдо счета не должно вменяться статистическим значением или значением из распределения с последующей корректировкой суммы транзакции. Это связано с тем, что в этом случае мошеннические транзакции будут казаться подлинными. Чтобы избежать этой проблемы, баланс целевой учетной записи со значением 0 заменяется на -1 в [3], чтобы сделать его более поддающимся обработке алгоритмом машинного обучения для обнаружения мошенничества:

X.loc[(X.oldBalanceDest == 0) & (X.newBalanceDest == 0) & (X.amount != 0), [‘oldBalanceDest’, ‘newBalanceDest’]] = -1

Кроме того, как указано в [3], данные также содержат несколько транзакций с нулевым балансом исходного счета как до, так и после транзакции с ненулевой суммой. При этом доля таких транзакций намного меньше в случае мошеннических (0,3%) по сравнению со случаем подлинных транзакций (47%) [3]. Аналогично обработке нулевого сальдо счета назначения, нулевое сальдо исходного счета заменяется значением null вместо приписывания числового значения для отделения мошеннических транзакций от подлинных в [3].

X.loc[(X.oldBalanceOrig == 0) & (X.newBalanceOrig == 0) & (X.amount != 0), ['oldBalanceOrig', 'newBalanceOrig']] = np.nan

1.3 Разработка функций

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

X[‘errorBalanceOrig’] = X.newBalanceOrig + X.amount - X.oldBalanceOrig
X[‘errorBalanceDest’] = X.oldBalanceDest + X.amount — X.newBalanceDest

1.4 Выбор модели

Первый подход, рассмотренный в [3] для выбора модели, состоит в том, чтобы сбалансировать несбалансированные данные путем недостаточной выборки класса большинства перед применением алгоритма машинного обучения. Недостатком недостаточной выборки является то, что обученная таким образом модель может не работать хорошо на реальных невидимых несбалансированных данных, поскольку почти вся информация о дисбалансе была отброшена во время обучения модели.

Второй подход, рассмотренный в [3], - это избыточная выборка класса меньшинства. Автор пробовал различные методы обнаружения аномалий и контролируемого обучения.

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

1.5 Модельное обучение и оценка

Набор данных разделен на две части, как показано ниже в [3], 80% для обучения модели и 20% для тестирования модели:

trainX, testX, trainY, testY = train_test_split(X, Y, test_size = 0.2, random_state = randomState)

Для гиперпараметров выбранной модели XGBClassifier устанавливаются определенные значения:

weights = (Y == 0).sum() / (1.0 * (Y == 1).sum())
clf = XGBClassifier(max_depth = 3, scale_pos_weight = weights, n_jobs = 4)

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

probabilities = clf.fit(trainX, trainY).predict_proba(testX)

Для оценки производительности модели используется значение AUPRC (Площадь под кривой точности-отзыва) вместо обычного AUC:

print(‘AUPRC = {}’.format(average_precision_score(testY, probabilities[:, 1])))

2. Автоматическое машинное обучение.

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

В этом разделе показано, как использовать H2O AutoML [7] для уменьшения объема ручной работы за счет автоматического машинного обучения, включая, помимо прочего, следующее:

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

H2O [6] основан на клиент-серверной кластерной архитектуре. Сервер H2O должен быть запущен до начала любых других действий:

import h2o
from h2o.automl import H2OAutoML
h2o.init()

Следующее должно появиться, если сервер H2O успешно запускается на локальном компьютере:

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

После того, как набор синтетических финансовых данных в Kaggle [5] загружен на сервер H2O, набор данных можно загрузить на сервер H2O следующим образом:

df = h2o.import_file(‘./data/PS_20174392719_1491204439457_log.csv’)
df.head(10)

Краткое описание набора данных можно получить, как показано ниже:

df.describe()

Тип данных класса ответа isFraud установлен как категориальный (т. Е. Фактор), поскольку он двоичный (0-нет, 1-да):

factorslist = [‘isFraud’]
df[factorslist] = df[factorslist].asfactor()

2.2 Предварительная обработка данных

Чтобы быть сопоставимым с методом в [3], аналогично [3], только записи данных типа TRANSFER или CASH_OUT извлекаются из исходного набора данных для обучения модели и прогнозирования мошенничества, а незначительные функции nameOrig , nameDest и isFlaggedFraud удаляются.

df1 = df[df[‘type’] == ‘TRANSFER’ or df[‘type’] == ‘CASH_OUT’]
y = “isFraud”
x = df.columns
x.remove(y)
x.remove(“nameOrig”)
x.remove(“nameDest”)
x.remove(“isFlaggedFraud”)

2.3 Выбор модели и обучение

Чтобы быть сопоставимым с методом в [3], извлеченный набор данных разделен на две части следующим образом: 80% для обучения модели и 20% для тестирования модели:

train, test = df1.split_frame([0.8])

Выбрана модель H2O AutoML с гиперпараметром max_models со значением 10:

aml = H2OAutoML(max_models = 10, seed = 1)

Выбранная модель обучается с настройками по умолчанию следующим образом:

aml.train(x = x, y = y, training_frame = train)

2.4 Оценка модели

  • Просмотр верхнего списка обученных моделей

После обучения модели H2O AutoML можно использовать соответствующий метод таблицы лидеров для отображения списка обученных моделей в порядке убывания AUC (не AUPRC ):

lb = aml.leaderboard
lb.head(rows=lb.nrows)

Из приведенной выше таблицы видно, что H2O AutoML автоматически выбрал и обучил 12 различных моделей, включая составные ансамблевые модели. Ведущая модель - XGBoost_3_AutoML_20191113_110031.

  • Получение и оценка ведущей модели

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

leader_model = aml.leader

Обратите внимание, что эта ведущая модель является лучшей с точки зрения результатов обучения модели AUC (не AUPRC).

Исчерпывающий обзор результатов тестирования ведущих моделей можно получить следующим образом:

leader_model.model_performance(test)

Как показано ниже, ведущая модель получила оценку AUPRC (т. Е. pr_auc) на уровне 0,988.

Следующий код предназначен для получения важности характеристик ведущей модели:

leader_model.varimp_plot()

  • Получение и оценка модели с лучшей подготовкой AUPRC

Однако тестирование модели AUPRC, а не AUC используется в [3] для оценки производительности модели. Чтобы провести честное сравнение, нам нужно получить и оценить обученную модель с лучшим тестированием AUPRC. С этой целью мы можем сначала получить и оценить модель с лучшим обучающим AUPRC, а затем сравнить его тестовые характеристики AUPRC с ведущей моделью, чтобы определить, какую модель следует выбрать.

Как описано ранее, метод таблица лидеров в H2O AutoML отображает список обученных моделей в порядке убывания обучения AUC, а не AUPRC. Чтобы найти модель с наилучшим обучением AUPRC, можно использовать следующий код, чтобы показать обученные модели в порядке убывания обучения AUPRC:

import pandas as pd
model_ids = list(aml.leaderboard['model_id'].as_data_frame().iloc[:,0])
model_auprc_map = {'Model Id' : [], 'AUPRC' : []}
for mid in model_ids:
    model = h2o.get_model(mid)
    model_prauc_map['Model Id'].append(mid)
    model_prauc_map['AUPRC'].append(model.pr_auc(train))
model_auprc_df = pd.DataFrame(model_auprc_map)
model_auprc_df.sort_values(['AUPRC'], ascending=0, inplace=True)
model_auprc_df.head(20)

Видно, что идентификатор модели с лучшим обучением AUPRC 0,937 - XGBoost_2_AutoML_20191113_110031.

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

best_auprc_model_id = model_auprc_df.iloc[0, 0]
best_auprc_model = h2o.get_model(best_auprc_model_id)

Затем можно получить исчерпывающий отчет о характеристиках тестирования модели:

best_auprc_model.model_performance(test)

Как показано ниже, модель с наилучшим обучением AUPRC (т. Е. pr_auc) достигла результата тестирования AUPRC 0,975.

Следующий код предназначен для получения характеристики важности модели с лучшим показателем AUPRC обучения:

best_prauc_model.varimp_plot()

Результаты тестирования показывают, что ведущая модель превзошла модель с лучшим показателем AUPRC для обучения с точки зрения результатов тестирования AUPRC. Таким образом, следует выбрать ведущую модель.

2.5 Сравнение с машинным обучением без автоматизации

В следующей таблице сравниваются основные действия по машинному обучению между H2O AutoML [7] и методом машинного обучения без автоматизации в [3].

Как описано в разделах 1 и [3], для обработки недостающих данных, проектирования функций, выбора модели, обучения, оценки и т. Д. Требуются знания предметной области и большой объем ручной работы. Все эти типы работы выполняются автоматически в AutoML [ 7] без вмешательства человека. Кроме того, установка гиперпараметров модели в AutoML [7] намного проще по сравнению с методом машинного обучения в [3].

Что касается производительности тестирования моделей с точки зрения тестирования моделей AUPRC, однако, метод машинного обучения в [3] получил более высокий балл 0,997 по сравнению с 0,988 баллом AutoML.

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

Резюме

В этой статье, как и в [3], я использовал тот же сильно искаженный и несбалансированный набор синтетических финансовых данных в Kaggle [5], чтобы продемонстрировать способность H2O AutoML [7], позволяющую неспециалистам применять машинное обучение для обнаружения финансового мошенничества. Это было достигнуто за счет автоматизации предварительной обработки данных, проектирования функций, выбора модели, обучения модели и оценки модели. Был достигнут приличный результат тестирования модели AUPRC, равный 0,988.

Как описано в разделе 2.5, более высокая оценка AUPRC тестирования модели, равная 0,997, была достигнута в [3] путем ручной обработки методов предварительной обработки данных, проектирования функций, выбора модели, обучения и т. Д. может быть оправдано предпочтение метода машинного обучения, определяемого пользователем, а не AutoML, в зависимости от бизнес-требований. Я заметил, что H2O предоставляет более мощный набор инструментов для непрерывного автоматического машинного обучения, который называется H2O Driverless AI [8]. В этом наборе инструментов есть функция Принеси свои собственные рецепты, позволяющая пользователям настраивать собственные методы предварительной обработки данных, разработки функций, моделирования и т. Д.

Блокнот Jupyter со всем исходным кодом из этой статьи доступен на Github [9].

использованная литература

[1]. К. Дидур, Машинное обучение в финансах: зачем, что и как

[2]. Д. Фаггелла, Машинное обучение в финансах - настоящее и будущее

[3]. А. Джошуа, Прогнозирование мошенничества в сфере финансовых платежных услуг

[4]. Р. Пьер, Обнаружение финансового мошенничества с помощью машинного обучения: победа в войне с несбалансированными данными

[5]. Синтетические наборы финансовых данных для обнаружения мошенничества

[6]. H2O.ai

[7]. H2O AutoML

[8] H2O ИИ без водителя

[9]. Я. Чжан, Блокнот Jupyter в Github

СООБЩЕНИЕ О РАСКРЫТИИ ИНФОРМАЦИИ: © 2019 Capital One. Мнения принадлежат отдельному автору. Если в этом посте не указано иное, Capital One не является аффилированным лицом и не поддерживается ни одной из упомянутых компаний. Все используемые или отображаемые товарные знаки и другая интеллектуальная собственность являются собственностью соответствующих владельцев.