С постоянным увеличением финансовых транзакций в Интернете и растущей популярностью электронной коммерции кредитные карты стали одной из самых распространенных форм оплаты. Однако этот сценарий также открыл двери для значительного роста мошенничества с кредитными картами, что представляет собой постоянную проблему как для финансовых учреждений, так и для потребителей.
В 2021 году только в Бразилии число случаев мошенничества с кредитными картами увеличилось более чем на 30 %, что составило более 2 миллионов попыток мошенничества за период наблюдения в 6 месяцев.
Согласно опросу, проведенному Kaspersky
в 2022 году, 20% населения Бразилии уже пострадали от мошенничества с кредитными картами.
То есть 2 из 10 бразильцев уже сталкивались с какой-либо проблемой, связанной с этой темой.
В этой статье обсуждается важность использования методов обработки данных и моделей машинного обучения для обнаружения и предотвращения мошенничества с кредитными картами. Мы рассмотрим, как эти интеллектуальные подходы могут помочь выявить подозреваемых и повысить безопасность транзакций, сводя к минимуму финансовые последствия и беспокойство пользователей.
Я приведу несколько важных кодов и визуализаций для понимания контекста. Однако, если вы хотите ознакомиться с полным кодом, пожалуйста, посетите полный исходный код на Colab.
Во-первых, перед любым глубоким анализом или созданием конкретной модели необходимо понять набор данных, над которым ведется работа. Его сложность, характеристики, ключевые моменты и то, что он может представлять для тех, кто его анализирует.
С помощью краткого исследовательского анализа мы можем лучше понять контекст, чтобы сделать выводы и предложить улучшения и прогнозы.
Набор данных, с которым мы работаем, представляет собой базу данных банковских транзакций за определенный период времени. Чтобы избежать каких-либо проблем, все данные были анонимизированы в каждой транзакции, и мы в основном будем следить за датой, суммой транзакции и данными «класса».
В столбце «класс» все транзакции были разделены на бинарные группы, 0 или 1.
If the transaction was rated 0, it is a normal, genuine transaction. If the transaction is classified in group 1, it has been identified as a fraudulent transaction for some reason.
Теперь давайте углубимся в наши данные.
Используя метод .describe(), мы можем определить некоторые интересные моменты в нашем фрейме данных.
Time Amount Class count 242086.000000 242086.000000 242086.000000 mean 94857.597379 88.612429 0.001727 std 47490.660832 247.655020 0.041517 min 0.000000 0.000000 0.000000 25% 54234.000000 5.662500 0.000000 50% 84747.000000 22.000000 0.000000 75% 139362.000000 77.580000 0.000000 max 172792.000000 19656.530000 1.000000
Возможно, у нас уже есть доказательства большой разницы в классификации мошенничества в нашем наборе данных, что означает, что транзакции, идентифицированные как мошенничество, намного меньше, чем обычные операции.
Считаем "0" = Normal and "1" = Fraud
, видим во всех квартилях, что большая часть значений подходит для обычных транзакций, и лишь небольшая группа — для подозреваемых или действительно мошеннических транзакций.
Чтобы наша модель работала наилучшим образом, важно также проверять количество отсутствующих данных в наших строках.
Если они существуют, это может поставить под угрозу окончательный результат нашей модели.
Sum of missing values: Time 0 V1 0 V2 0 V3 0 V4 0 V5 0 V6 0 V7 0 V8 0 V9 0 V10 0 V11 0 V12 0 V13 0 V14 0 V15 0 V16 0 V17 0 V18 0 V19 0 V20 0 V21 0 V22 0 V23 0 V24 0 V25 0 V26 0 V27 0 V28 0 Amount 0 Class 0 dtype: int64
Всего пропущенных значений: 0
Все наши строки заполнены, и отсутствуют пропущенные значения.
Имея эту информацию, мы можем продолжить анализ без необходимости заполнять пробелы или удалять информацию.
Проверка дисбаланса между подлинными и мошенническими транзакциями.
При работе с финансовой информацией, особенно ежедневными транзакциями, обычно наблюдается значительный дисбаланс информации.
Почему? Поскольку постоянно осуществляются тысячи банковских транзакций, at every second, minute, hour and day.
очевидно, что в банке или в клиентах той или иной карты большинство этих пользователей честны и совершают ежедневные транзакции в законном порядке. и законным путем, поэтому мошеннических транзакций существует лишь малая часть.
Информация в нашей базе данных проясняет эту ситуацию.
Мы можем легко убедиться, что признание транзакций мошенническими очень мало.
Подавляющее большинство транзакций идентифицируются как подлинные и осуществляются без каких-либо ограничений.
Могут быть ситуации и типы анализа, в которых эта вариация не столь несбалансирована, например, при определении типа продукта, который продается больше, или типа решения, которое более востребовано.
В этих других типах вопросов можно разделить наборы данных между 50/50, 70/30, 60/40
или самым различным образом, с более близкой пропорцией.
Процент мошеннических транзакций
fraud_percentage = (df["Class"].value_counts(normalize=True) *100).loc[1] print(f"The percentage of entries classfied as fraud is {fraud_percentage:.4f}%.")
Процент записей, классифицированных как мошенничество, составляет 0,1727%.
Таким образом мы идентифицируем небольшую сумму мошеннических транзакций в нашем наборе данных.
Всего 0,17%, при этом 492 транзакции считаются мошенничеством, а более 280 000 – обычными транзакциями.
Давайте воспользуемся гистограммами и ящичковой диаграммой, чтобы идентифицировать эту информацию более наглядно.
Выше мы видим разницу между транзакциями разных классов. Важно проверять объем сделок и выявлять разницу между ними.
При анализе диаграмм с учетом "Amount"
мы выявили разницу в отношении этих значений.
Плотность
Графики плотности очень полезны для визуального выявления больших различий между параметрами.
В очень наглядном виде нам не нужно знать числа, чтобы легко определить различия. Здесь мы можем продемонстрировать различия в каждой из записей.
Выше мы можем выделить похожие графики, где степень различия не так велика и следует закономерности. В этом сценарии мы можем указать, например, графики "V13"
и "V15"
.
Но другие, такие как "V4", "V7", "V8", "V14", "V16"
и другие, имеют огромную степень различия.
Пока что мы можем сделать некоторые выводы, прежде чем продолжить:
The data is highly imbalanced between genuine and normal.
No missing data
Columns "Time" and "Amount" are not normalized
Подготовка данных
Поскольку это вопрос классификации, мы будем использовать Logistic Regression
. Для этого необходимо обработать наши данные и адаптировать их для этой цели.
— -› Мы стандартизируем информацию
— -› Разделите наши данные на обучающие данные и тестовые данные
— -› Сбалансировать данные
— -› Избегайте переобучения
Далее выполняется разделение между training data
и validation data
.
#Separate X and Y X = df_clean.drop("Class", axis = 1) y = df["Class"] X_train, X_val, y_train, y_val = train_test_split(X, y, stratify=y, shuffle = True)
Балансировка данных
#use under-sampling technique rus = RandomUnderSampler() X_rus, y_rus = rus.fit_resample(X_train, y_train) class_counts_after = pd.Series(y_rus).value_counts() print(class_counts_after) data = pd.DataFrame({ "Class":["0","1"], "Count":[class_counts_after[0], class_counts_after[1]] }) sns.barplot(x="Class", y="Count", data=data);
Записей в «0»: 313
Записей в «1»: 313
Матрица корреляции
С помощью графиков корреляционной матрицы мы можем проверить разницу между балансировкой data before
и after
.
Гораздо интереснее извлечь некоторую релевантную информацию с правильно сбалансированными данными.
Модель машинного обучения
Подготовка данных, а также первоначальный исследовательский анализ были завершены.
Для следующих шагов нашей модели мы будем использовать классификатор Logistic Regression
.
Наша модель была обучена и сделаны прогнозы.
Теперь мы можем перейти к другой части модели, оценивая ее производительность.
Важно помнить, что даже при высокой точности модель может пропустить большую часть интересующих задач.
Ниже мы включим confusion matrix
и проверим количество подлинных транзакций и мошеннических транзакций.
Матрица путаницы
Матрица путаницы (также известная как матрица ошибок) – важный инструмент для оценки эффективности модели классификации в задачах обучения с учителем.
Он предоставляет подробную информацию о том, как модель correctly
и incorrectly
классифицирует различные классы в наборе данных.
Матрица путаницы особенно полезна для задач бинарной классификации, где есть два разных класса, таких как "positive"
и "negative"
, "true"
и "false"
и т. д. Однако ее можно распространить и на задачи многоклассовой классификации.
Давайте разберемся с четырьмя основными элементами матрицы путаницы:
True Positive (TP)
: указывает количество наблюдений, правильно отнесенных к положительному классу.
False Positive (FP)
: Указывает количество наблюдений, неправильно отнесенных к положительному классу, хотя на самом деле они относятся к отрицательному классу. Это ошибка первого рода (ложноположительный результат).
True Negative (TN)
: указывает количество наблюдений, правильно отнесенных к отрицательному классу. В этих случаях модель правильно предсказала отрицательный класс.
False Negative (FN)
: Указывает количество наблюдений, неправильно классифицированных как принадлежащие к отрицательному классу, когда на самом деле они принадлежат к положительному классу. Это ошибка II рода (ложноотрицательный результат).
Давайте проверим матрицу путаницы в нашем случае:
Classification Report: precision recall f1-score support 0 0.9998 0.9669 0.9831 60417 1 0.0453 0.9048 0.0863 105 accuracy 0.9668 60522 macro avg 0.5226 0.9358 0.5347 60522 weighted avg 0.9982 0.9668 0.9815 60522 Accuracy:0.9668
Мы будем использовать бенчмарк AUC ("Area Under the Roc Curve")
.
Значение AUC находится в диапазоне от 0 to 1
, и чем ближе к 1, тем лучше.
Он делит классы на значение0.5
-> Меньше этого значения переходит в один класс, а если больше, то в другой.
Если модель не соответствует 100 % своих прогнозов, это означает, что ее AUC equals 0
Если модель соответствует 100% своих прогнозов, ее AUC is considered 1.
- › AUC: 0,9358
В текущей модели, над которой мы работаем, был идентифицирован AUC of 93%
Делаем прогнозы на тестовом наборе
Наши данные были разделены на 3 основных набора:
-› Обучение
-› Проверка
-› Тест
На данный момент мы уже сделали прогнозы для проверочного набора, и теперь мы можем проверить потенциал модели на нашем тестовом наборе.
Однако, поскольку существует разница в расположении данных в столбце "Time"
и в столбце "Amount"
, необходимо предварительно стандартизировать эти столбцы.
Classification Report: precision recall f1-score support 0 0.9999 0.9679 0.9836 42647 1 0.0479 0.9324 0.0911 74 accuracy 0.9678 42721 macro avg 0.5239 0.9501 0.5374 42721 weighted avg 0.9982 0.9678 0.9821 42721 Accuracy: 0.9678
- › AUC: 0,9501
Здесь мы определили accuracy of 97%
и AUC of 94%
, что немного выше, чем в предыдущем наборе.
Выводы
Этот проект был направлен на разработку модели машинного обучения, способной эффективно обнаруживать мошеннические транзакции и отличать их от законных в данных кредитных карт.
Благодаря тщательной предварительной обработке данных, разработке функций и тщательному выбору алгоритмов нам удалось создать надежную и точную систему обнаружения мошенничества.
Модель достигла точности более 96%
, при этом 97% accuracy for true negatives
(немошеннические транзакции) и 93% accuracy for true positives
(мошеннические транзакции).
Это крайне важно для поддержания хорошего опыта для законных клиентов и сведения к минимуму ложных срабатываний, которые потенциально могут причинить им неудобства.
По мере продвижения вперед мы продолжим отслеживать производительность модели, собирать новые данные и изучать передовые методы, чтобы еще больше расширить ее возможности.
В результате этого проекта была создана мощная и надежная система обнаружения мошенничества с кредитными картами, которая представляет значительную ценность для организации и клиентов.