Концепция алгоритмов классификации с учетом затрат и затрат на основе примеров

В традиционных задачах двухклассной классификации мы стремимся минимизировать ошибочные классификации и измерять производительность модели с помощью таких показателей, как точность, F-оценка или кривая AUC-ROC. Однако при определенных проблемах лучше допускать большее количество неправильных классификаций при более низких общих затратах. Если затраты, связанные с неправильной классификацией, различаются в зависимости от выборки, мы должны применить метод обучения, учитывающий затраты и зависящий от конкретного примера. Но давайте начнем с самого начала ...

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

Что такое рентабельное обучение?

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

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

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

Обратите внимание, что «положительные» - это транзакции, которые считаются мошенническими, а «отрицательные» - это транзакции, которые считаются законными. «Истина» и «Ложь» относятся к правильному и неправильному прогнозу соответственно.

Поскольку стоимость транзакции зависит от выборки, стоимость ложноотрицательного результата может быть пренебрежимо низкой (например, для транзакции на сумму 0,10 доллара США), и в этом случае административные затраты на положительный прогноз будут перевешивать затраты на возмещение или очень высоки (например, для транзакция на сумму 10 000 долларов США).

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

Стоимость обучения по сравнению с классификацией, зависящей от стоимости

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

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

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

Внедрение и оценка моделей

Для этого тематического исследования я использовал набор данных о мошенничестве с кредитными картами (доступен на Kaggle) с 284 000 образцов и 30 функциями. Целевая переменная указывает, является ли транзакция законной (0) или мошеннической (1). Данные сильно несбалансированы, всего 0,17% мошеннических транзакций. Я обучил и оценил следующие пять моделей.

  1. Регулярная логистическая регрессия (из scikit-learn)
  2. Обычная искусственная нейронная сеть (построена на Керасе)
  3. Искусственная нейронная сеть с учетом затрат (Керас)
  4. Логистическая регрессия классификации затрат
  5. Классификация затрат Искусственная нейронная сеть

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

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

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

Затем я вычислил сумму затрат, которые возникли бы, если бы все случаи были спрогнозированы отрицательными («cost_max»), и определил экономию затрат как долю, на которую фактические прогнозы уменьшают затраты.

Для оценки моделей я использовал 5-кратную перекрестную проверку и разделил данные на пять различных обучающих (80%) и тестовых наборов (20%). Результаты, представленные в следующем разделе, относятся к среднему результату по пяти тестам.

Логистическая регрессия

Базовой моделью служит обычная модель логистической регрессии из библиотеки scikit-learn. На графике ниже показано распределение между прогнозируемыми вероятностями и суммами транзакций. Без классификации, чувствительной к затратам, нет видимой связи между вероятностью мошенничества и суммой транзакции.

Логистическая регрессия работает достаточно хорошо со средним показателем F1 тестового набора 0,73 и экономией затрат 0,48.

Искусственная нейронная сеть

Затем я построил ANN в Keras с тремя полностью связанными слоями (50, 25 и 15 нейронов) и двумя слоями исключения. Я запускал модель для двух эпох и использовал размер пакета 50. Используя API последовательной модели от Keras, реализация на Python выглядит так:

from keras.models import Sequential
from keras.layers import Dense, Dropout
def ann(indput_dim, dropout=0.2):
    model = Sequential([
    Dense(units=50, input_dim=indput_dim, activation='relu'),
    Dropout(dropout),
    Dense(units=25, activation='relu'),
    Dropout(dropout),
    Dense(15, activation='relu'),
    Dense(1, activation='sigmoid')])
    return model
clf = ann(indput_dim=X_train.shape[1], dropout=0.2)
clf.compile(optimizer='adam', loss='binary_crossentropy')
clf.fit(X_train, y_train, batch_size=50, epochs=2, verbose=1)
clf.predict(X_test, verbose=1)

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

ИНС превзошла модель логистической регрессии по показателям F1 и экономии затрат.

Чувствительная к стоимости искусственная нейронная сеть

Теперь становится немного интереснее. Чувствительная к стоимости ИНС идентична обычной ИНС с той разницей, что чувствительная к стоимости функция потерь. Обе предыдущие модели использовали логарифмические потери («бинарную кросс-энтропию») как функцию потерь:

Эта функция потерь одинаково наказывает ложноотрицательные и ложные срабатывания. Давайте теперь посмотрим на функцию потерь, чувствительную к стоимости. Здесь рассматриваются все четыре возможных результата (ложноположительные, ложноотрицательные, истинно положительные и истинно отрицательные), и каждый из результатов имеет определенную стоимость. Функция потерь с учетом затрат выглядит так:

Помните из первого раздела, что истинные положительные и ложные положительные результаты считаются одинаково дорогими (фиксированные административные расходы на блокировку транзакции). Стоимость истинно отрицательных результатов составляет 0 долларов США (никаких действий), а стоимость ложных отрицательных результатов - это сумма транзакции (предположим, что мы должны возместить всю транзакцию). Обратите внимание, что из этих четырех затрат только стоимость ложноотрицательных результатов зависит от конкретного примера. Это приводит к тому, что при более высокой сумме транзакции наказание за необнаруженную мошенническую транзакцию увеличивается по сравнению с административными затратами на положительный прогноз. Следовательно, функция потерь должна обучать модель, которая с большей вероятностью отклонит подозрительную транзакцию, когда сумма транзакции выше. Суммы транзакций варьируются от 0 до 25 691 долларов США, в среднем 88 долларов, и я предположил, что фиксированные административные расходы составляют 3 доллара.

В Python мы определяем стоимость ложноположительных, ложноотрицательных, истинных положительных и истинно отрицательных результатов соответственно. Поскольку стоимость ложноотрицательных результатов зависит от примера, они представлены в виде вектора, длина которого равна количеству выборок.

cost_FP = 3
cost_FN = data['Amount']
cost_TP = 3
cost_TN = 0

Реализовать пример зависимой функции потерь в Keras сложно, потому что Keras не позволяет передавать аргументы, кроме y_true и y_pred, в функцию потерь. Постоянные переменные могут быть переданы в функцию потерь, заключив функцию потерь в другую функцию. Однако стоимость ложноотрицательных результатов зависит от конкретного примера. Поэтому я использовал уловку добавления стоимости ложных отрицательных значений в виде цифр после запятой к y_true и извлечения их внутри пользовательской функции потерь, округляя y_true до исходного целочисленного значения. Реализация функций преобразования y_true и пользовательской функции потерь в Keras выглядит так:

import keras.backend as K
def create_y_input(y_train, c_FN):
    y_str = pd.Series(y_train).reset_index(drop=True).\
            apply(lambda x: str(int(x)))
    c_FN_str = pd.Series(c_FN).reset_index(drop=True).\
            apply(lambda x: '0'*(5-len(str(int(x)))) + str(int(x))
    return y_str + '.' + c_FN_str
def custom_loss(c_FP, c_TP, c_TN):
    def loss_function(y_input, y_pred):
        y_true = K.round(y_input)
        c_FN = (y_input - y_true) * 1e5
        cost = y_true * K.log(y_pred) * c_FN + 
               y_true * K.log(1 - y_pred) * c_TP) +
               (1 - y_true) * K.log(1 - y_pred) * c_FP +
               (1 - y_true) * K.log(y_pred) * c_TN)
        return - K.mean(cost, axis=-1)
    return loss_function

Затем я вызвал определенные функции, чтобы создать вектор y_input, обучить чувствительную к стоимости ANN и сделать прогнозы:

y_input = create_y_input(y_train, cost_FN_train).apply(float)
clf = ann(indput_dim=X_train.shape[1], dropout=0.2)
clf.compile(optimizer='adam', loss=custom_loss(cost_FP, cost_TP,
            cost_TN))
clf.fit(X_train, y_input, batch_size=50, epochs=2, verbose=1)
clf.predict(X_test, verbose=1)

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

Оценка показывает ожидаемый эффект от обучения с учетом затрат. Экономия затрат увеличилась на 5%, а оценка F1 снизилась с такой же разницей. Следствием классификации, чувствительной к затратам, является большее количество неправильных классификаций в пользу более низких общих затрат на неправильную классификацию.

Модели классификации затрат

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

Затем классификатор выбирает тот прогноз, который, как ожидается, приведет к снижению затрат.

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

Классификация прогнозов на основе ожидаемых затрат приводит к еще лучшим результатам с точки зрения экономии затрат (и значительно худшим результатам с точки зрения F1-балла). В то время как реализация чувствительной к стоимости функции потерь для ИНС снизила затраты на 5%, ИНС с классификацией затрат смогла снизить затраты на 10%.

Заключение

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

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

Код, созданный для этой иллюстрации, доступен на моем GitHub.

Набор данных о мошенничестве с кредитными картами доступен на Kaggle.

Если вам интересно узнать больше о рентабельном обучении с использованием древовидных моделей, я предлагаю эту статью от A. C. Bahnsen, D. Aouada и B. Ottersten вместе с репозиторием costcla GitHub.