Detectando padrões de fraude em transações de cartão de crédito com Machine Learning
O problema das fraudes em cartões de crédito é uma das principais preocupações das instituições financeiras, já que essas fraudes podem causar prejuízos significativos para os consumidores e para as próprias instituições. Segundo dados da Serasa Experian, apenas no Brasil, cerca de 12,1 milhões de pessoas foram vítimas de algum tipo de fraude financeira no último ano, representando um prejuízo de 1,8 bilhão de reais para os últimos 12 meses.
O objetivo deste artigo é explanar a análise exploratória dos dados de transações com cartões de crédito, bem como a construção de um modelo de machine learning capaz de detectar transações fraudulentas com alta precisão. Para isso, foi necessário utilizar técnicas avançadas de análise de dados e machine learning, balanceamento de dados e avaliação do modelo.
A análise completa, pode ser observada no projeto presente no github.
Conhecendo os dados
Os dados que usaremos neste projeto foram disponibilizados por algumas empresas européias de cartão de crédito. O dataset representa as operações financeiras que aconteceram no período de dois dias, onde foram classificadas 492 fraudes em meio a quase 290 mil transações. Este é um conjunto de dados extremamente desbalanceado, onde as fraudes representam apenas 0,17% do total.
Outro detalhe interessante é que as features são todas numéricas, e foram descaracterizadas (por problemas ligados à privacidade e segurança).
Time
- contém o número de segundos decorridos entre a primeira transação e a transação atual.V1, V2, ..., V28
- colunas numéricas anônimas que contêm características do tipo PCA (Principal Component Analysis) transformadas. Infelizmente, devido a questões de privacidade, não podemos saber o significado exato dessas características.Amount
- contém o valor da transação.Class
- é a coluna de destino e contém 0 para transações normais e 1 para transações fraudulentas.
Além disso, foi possível observar que as variáveis Time
e Amount
estão em ordem de grandeza diferente.
Balanceamento do dataset
Como citado, o dataset é altamente desbalanceado, com apenas 0,172% das transações sendo fraudulentas. Uma consequência de ter dados desbalanceados é um modelo enviesado, que privilegia a classe maioritária. No escopo do problema, detectar transações normais corretamente, mas não detectar fraudes causa enormes prejuízos. Logo, é necessário um balanceamento a fim de construir um modelo eficaz ao problema.
Visualização de Dados
A seguir um histograma para a variável Time
quando há fraudes e quando não há. Podemos observar um pico em 100000 segundos quando há fraudes, ao contrário de transações normais em que esse valor é diminuto.
A seguir, observação estatística da variável Time
quando não há e há fraudes. É possível notar que quando há fraudes, a média e mediana são menores, o que sugere menor espaço de tempo entre uma transação e outra. Porém, num contexto geral, as diferenças são sutis.
# Não há fraudes
df.Time.loc[df.Class == 0].describe()
# Há fraudes
df.Time.loc[df.Class == 1].describe()
A seguir um histograma para a variável Amount
quando há fraudes e quando não há. Os resultados indicam que transações normais tendem a ter valores mais elevados, com média de 88,29 e mediana de 22,00, enquanto que transações fraudulentas tendem a ter valores menores, com média de 122,21 e mediana de 9,25.
Além disso, a amplitude de valores nas transações normais é muito maior do que nas transações fraudulentas. O valor máximo observado nas transações normais foi de 25.691,16, enquanto que nas transações fraudulentas foi de 2.125,87.
Esses resultados indicam que, em geral, as transações fraudulentas tendem a ser de valores mais baixos do que as transações normais. Isso pode ser explicado pelo fato de que transações fraudulentas são frequentemente realizadas de forma indiscriminada, visando obter lucros menores, mas em maior volume, enquanto que transações normais geralmente têm valores mais altos e são realizadas de forma mais seletiva, visando objetivos específicos.
De maneira resumida, pode-se observar que:
- Não há valores nulos no dataframe.
- As variáveis
time
eamount
não estão padronizadas. - Os dados estão extremamente desbalanceados.
- Transações normais tendem a ter valores maiores.
Pré-processamento dos Dados
Padronizar Time
e Amount
O objetivo do pré-processamento de dados é garantir que as features estejam na mesma escala, garantindo um desempenho melhor do algoritmo de machine learning. Para padronizar as variáveis Time
e Amount
será utilizado o StandardScaler. Ele ajusta os dados para que tenham uma média zero e um desvio padrão de um.
# padronizar as colunas Time e Amount
df_clean = df.copy()
std_scaler = StandardScaler()
df_clean['std_amount'] = std_scaler.fit_transform(df_clean['Amount'].values.reshape(-1, 1))
df_clean['std_time'] = std_scaler.fit_transform(df_clean['Time'].values.reshape(-1, 1))
df_clean.drop(['Time', 'Amount'], axis=1, inplace=True)
Balanceamento de dados
Um dataset que possua mais de 50% das entradas em uma classe já é considerado desbalanceado. A maioria dos algoritmos de aprendizado de máquina funcionam bem com conjuntos de dados equilibrados, uma vez que eles buscam otimizar a precisão geral da classificação ou medidas relacionadas. Para dados desbalanceados, os limites de decisões estabelecidos por padrão nos algoritmos tendem a ser enviesados em torno da classe majoritária. Portanto a classe minoritária tende a ser classificada incorretamente.
No cenário apresentado, um falso positivo é preferível a um falso negativo, pois as instituições financeiras sofrem mais prejuízos com transações indevidas realizadas que bloqueios preventivos. Para solucionar o problema, é necessário utilizar métricas que priorizem essa questão e tomar medidas para tratar o desbalanceamento dos dados. Uma maneira de corrigir o problema é utilizando técnicas de sampling ou amostragem, sendo divididas em under-sampling e over-sampling.
O under-sampling consiste em remover exemplos da classe majoritária para tornar a proporção entre as classes mais equilibrada. Já o over-sampling, por sua vez, consiste em gerar novos exemplos para a classe minoritária, de forma a aumentar sua representatividade no conjunto de dados.
Utilizaremos a técnica ClusterCentroids em under-sampling (Figura 4) e SMOTE em over-sampling (Figura 5). Também será utilizado os modelos de machine learning Decision Tree e Logistic Regression.
Treinamento dos Algoritmos de Machine Learning
Decision Tree
Uma árvore de decisão para classificação é um modelo de aprendizado de máquina que usa um conjunto de regras de decisão para classificar uma instância em uma ou mais classes pré-definidas. Cada nó interno da árvore representa uma pergunta sobre uma das características dos dados de entrada, enquanto cada folha representa uma classe de saída. Durante o treinamento, o algoritmo de aprendizado constrói a árvore fazendo perguntas sucessivas para dividir o conjunto de dados de treinamento em subconjuntos menores, e enfim classificar o dado na saída adequada.
Utilizei o algoritmo nos datasets balanceados pelo under-sampling e over-sampling respectivamente.
Foi realizado a previsão nos dados de validação, para under-sampling, obtivemos a seguinte matriz de confusão.
Já para over-sampling, obtivemos a matriz abaixo.
Logistic Regression
A regressão logística é um modelo estatístico utilizado para problemas de classificação binária, ou seja, em que o objetivo é prever a probabilidade de um exemplo pertencer a uma das duas classes possíveis (por exemplo, sim ou não, positivo ou negativo, verdadeiro ou falso). O modelo de regressão logística utiliza a função logística para transformar uma variável de entrada linear em uma probabilidade. A função logística é uma função sigmoide que retorna valores entre 0 e 1. Essa probabilidade é então comparada com um limiar para decidir em qual classe o exemplo deve ser classificado.
Utilizei o algoritmo nos datasets balanceados pelo under-sampling e over-sampling respectivamente. Contudo, para o algoritmo de Logistic Regression, obtivemos os mesmos resultados para ambos os balanceamentos.
Avaliação do Modelo Utilizando os Dados de Teste
De modo geral, obtivemos um resultado melhor no algoritmo de Logistic Regression no conjunto de validação. Agora, iremos realizar previsões no conjunto de teste, que foram separados previamente e não foram vistos pelo modelo. Esse conjunto representa uma fração de 15% do dado real.
As previsões foram feitas no algoritmo de Decision Tree (Figura 9) e Logistic Regression (Figura 10).
Para o Decision Tree, observamos um desempenho melhor no conjunto de teste em comparação ao de validação, embora ainda seja semelhante. No caso do balanceamento usando under-sampling, o modelo apresentou um recall de 0.92 para a classe minoritária (fraudes) e 0,83 para a classe majoritária
Já no balanceamento utilizando over-sampling, o modelo apresentou recall de 0.81 para a classe majoritária e 1 para a classe minoritária, semelhante aos resultados obtidos no conjunto de validação (0.71 e 1, respectivamente). Veremos abaixo o resulto com o algoritmo Logistic Regression.
No caso da Logistic Regression utilizando under-sampling, foram obtidas métricas semelhantes às anteriores, com exceção do AUC, que apresentou um aumento de 0,93 para 0,95, e o recall da classe minoritária que aumentou de 0.9 para 0.95. Semelhantemente, no caso do over-sampling, houve um aumento significativo no recall da classe minoritária, de 0,91 para 0,95, e no AUC, e na classe majoritária de 0.97 para 0.98.
Em geral, todos os modelos utilizando a regressão logística apresentaram um bom desempenho, com AUC acima de 0,9 e recall elevado para a classe minoritária, o que indica que o modelo é capaz de detectar com precisão as transações fraudulentas.
Conclusão
Com base nas análises realizadas, pode-se concluir que a escolha do modelo de classificação e da técnica de balanceamento de classes é fundamental para obter um bom desempenho na detecção de fraudes em transações financeiras. Foram avaliados dois tipos de técnicas de balanceamento de classes (under-sampling e over-sampling) em conjunto com dois modelos de classificação (Decision Tree e Logistic Regression). A regressão logística mostrou-se uma escolha adequada para o problema, apresentando desempenho superior em relação à Decision Tree, que obteve menor AUC e recall para a classe minoritária.
As técnicas de balanceamento de classes se mostraram eficazes na melhoria do desempenho dos modelos, especialmente o under-sampling, que apresentou o melhor desempenho geral em termos de recall para a classe minoritária e AUC. No entanto, o over-sampling também apresentou resultados promissores.
Os modelos que utilizaram Logistic Regression apresentaram um desempenho superior em termos de AUC, com valores próximos a 0,93. O modelo que utilizou under-sampling e Logistic Regression obteve um recall igual para a classe minoritária (fraudes) em comparação com o modelo que utilizou over-sampling e Logistic Regression, tanto nos dados de validação, como treinamento, o que indica ser um modelo eficiente.
Por outro lado, o modelo Decision Tree apresentou um desempenho inferior em relação aos modelos de Logistic Regression em validação, com AUC em torno de 0,76 e 0.85 (under e over) e recall de apenas 0,71 para a classe minoritária com over-sampling. Contudo, nos dados de teste, o desempenho de ambos foi superior, chegando a 0.92 e 0.81 de recall para a classe minoritária.
Em resumo, a escolha cuidadosa do modelo de classificação e da técnica de balanceamento de classes é crucial para obter um bom desempenho na detecção de fraudes em transações financeiras. A regressão logística mostrou ser uma boa escolha para esse problema, e o balanceamento das classes pode ajudar a melhorar o desempenho do modelo na detecção de fraudes.