Detecção de Fraude em Cartão de Crédito com Machine Learning

André Almeida
LatinXinAI
Published in
9 min readSep 9, 2022
Photo by Nahel Abdul Hadi on Unsplash

Entendimento do problema

Apenas no Brasil, de janeiro a julho de 2022, foram mais de 5 milhões de tentativas de crimes digitais na internet, contra 2,5 milhões registradas no ano de 2021 — um aumento de 97%. Traduzindo em valores, os golpes financeiros devem alcançar a marca de R$2,5 bilhões em 2022.

Dentra essas fraudes, aquelas envolvendo cartões de crédito são de grande relevância uma vez que a sua não-detecção acaretará em prejuízos consideráveis, tanto para o consumidor quanto para a instituição financeira.

Existe uma grande variedade de cenários que podem levar um fraudador a realizar com sucesso pagamentos fraudulentos com cartão de crédito. Atualmente, não há uma taxonomia definida sobre os tipos de fraude de cartão de crédito, embora se saiba que certos padrões ocorrem com mais frequência do que outros.

É um jogo de gato e rato, onde os padrões fraudulentos mudam ao longo do tempo.

Um outro fator a ser considerado é a quantidade de falsos positivos, ou seja, aquelas vezes em que você tentou fazer uma compra e teve seu cartão bloqueado preventivamente — o que provavelmente gerou estresse e constrangimento.

Por todos esses motivos, o investimento na área de detecção de fraudes por meio de Inteligência Artificial vem crescendo a cada ano, representando uma grande oportunidade em Data Science.

Dispondo de grandes volumes de dados como base histórica, um algoritmo de machine learning apenas um pouco melhor que os anteriores já representa uma economia de milhões de Reais. E esse é o desafio, aprimorar cada vez mais o uso de algoritmos visando inibir ou evitar transações fraudulentas.

Neste artigo, iremos abordar o problema das fraudes em cartões de crédito, uma das principais preocupações das instituições financeiras como bancos e fintechs.

Este projeto seguiu o fluxo de desenvolvimento do CRISP-DM começando no entendimento do problema e indo até a etapa de avaliação.

Todo o código do projeto está disponível aqui.

Entendimento dos dados

Os dados usados neste projeto foram disponibilizados por algumas empresas européias de cartão de crédito. O dataset representa as operações financeiras que aconteceram em um 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). Assim, os nomes das colunas são representados por [V1,V2,V3…,V28]

Na página original dos dados, também é informado que as variáveis passaram por uma transformação conhecida como Análise de Componentes Principais (Principal Component Analysis — PCA).

A técnica de PCA permite a redução da dimensionalidade enquanto mantém o maior número possível de informações. Para conseguir isso, o algoritmo encontra um conjunto novo de recursos — os chamados componentes.

Esses componentes são em número menor or igual às variáveis originais. No caso deste projeto, os componentes achados pela transformação da PCA são as próprias colunas [V1,V2,V3…,V28].

O dicionário dos dados é apresentado abaixo:

Time: Número de segundos decorridos entre a transação do registro atual e a primeira transação no conjunto de dados;

V1 — V28: Pode ser resultado de uma redução de dimensionalidade do PCA para proteger identidades de usuários e recursos confidenciais;

Amount: Valor da transação;

Class: 1 para transações fraudulentas, 0 caso contrário.

Vamos para as análises!

Como descrito acima os valores de V1-V28 foram transformados com PCA, por isso não há como saber o que cada coluna realmente representa.

Com a análise da correlação dos dados foi visto que não há correlações fortes entre os atributos e nosso target. E há uma correlação média entre o atributo Amount e os atributos V2, V5, V7 e V20.

Os dados estão muito desbalanceados. Existem 284315 registros de transações normais e apenas 492 registros de fraudes, o que dá menos de 1% dos dados.

Quantas transações ocorrem no período?

Com o histograma de transações no tempo, pode ser visto um padrão bem interessante nos dados:

A tendência de acontecer mais ou menos fraudes acompanha o fluxo de transações normais no dia. Claro que nas suas devidas proporções.

Olhando para a distribuição do valor das transações vemos que a maioria das fraudes são de baixo valor. Foi verificado que 75% das fraudes tem valor abaixo de 105.89€

Como os dados estão bem desbalanceados e quero detectar as fraudes, não irei excluir os dados que podem ser considerados como outliers. Manterei todos os dados de fraude para a etapa de modelagem.

Indo um pouco mais a fundo nos detalhes, é possível ver que há uma intensidade muito maior de transações normais entre 8h e 21h.

e há dois momentos do dia em que as transações fraudulentas ocorrem com mais intensidade, 2h e 11h.

Esta é uma informação interessante. Ela será usada no processo de modelagem!

Preparação dos dados

Etapa de preparação dos dados para o treino, validação e teste, evitando data leakage.

Aqui, os dados foram separados de forma estratificada da seguinte forma:

  • 70% treino
  • 15% validação
  • 15% teste

Como os dados de valor e hora da transação não estão formatados, eles foram padronizados com o StandScaler do sklearn, após a separação dos conjuntos treino, validação e teste.

Tratando o desbalanceamento

Como a diferença entre as classes é muito grande, suponho que fazer um tratamento com under sampling pode não ser uma boa opção, pois haverá muita perda de dados.

Logo, para fins de comparação usei duas técnicas de balanceamento:

Modelagem

Para iniciar a modelagem, defini um baseline com os dados desbalanceados e o modelo do dummy classifier, um classificador burro.

As métricas definidas para observação dos dados de validação foram: Acurácia, Precisão, Recall, Precisão Média, F1-Score, Matriz de confusão e as Curvas de ROC_AUC e Precision x Recall.

Para este problema iremos olhar com mais atenção as métricas de Recall, F1-Score, curva ROC_AUC e curva Precision x Recall.

Modelo dummy:

Métricas do Modelo dummy:

Acurácia: 0.9982678308092039

Precisão: 0.0

Recall: 0.0

Precisão Média: 0.0017321691907960957

F1-Score: 0.9982678308092039

ROC-AUC: 0.5

Matriz de confusão normalizada pelo True Label.

Com a matriz de confusão vemos que o modelo acerta todas as predições da classe 0 e erra todas as predições da classe 1, e ainda assim possui acurácia de 99%. Isso é reflexo dos dados altamente desbalanceados.

O valor de 0.5 para a curva ROC indica que o modelo é a mesma coisa de um preditor aleatório, ou seja, chuta tudo 0 e vê o que acontece. Um modelo totalmente burro! 😠

Modelos propostos para avaliação:

Três modelos foram escolhidos para modelagem.

  • Gradiente Descendente
  • Gradient Boosting
  • Random Forest

São modelos que possuem vantagens com relação a capacidade de detecções corretas e são bons contra o overfitting.

A seguir um resumo dos resultados de validação…

Gradiente Descendente com balanceamento do tipo Random Under Sampling

Métricas do Modelo SGDC Under:

Acurácia: 0.9445705858945249

Precisão: 0.029532403609515995

Recall: 0.972972972972973

Precisão Média: 0.029593021226662002

F1-Score: 0.9445705858945249

ROC-AUC: 0.9594917801004982

Gradiente Descendente com balanceamento do tipo SMOTE

Métricas do Modelo SGDC SMOTE:

Acurácia: 0.973900423679221

Precisão
: 0.060016906170752324

Recall: 0.9594594594594594

Precisão Média: 0.2948468420471046

F1-Score: 0.973900423679221

ROC-AUC: 0.9921292901690115

Gradiente Boosting com balanceamento do tipo Random Under Sampling

Métricas do Modelo Gradient Boosting Under:

Acurácia: 0.9551274548816742

Precisão: 0.035768261964735516

Recall: 0.9594594594594594

Precisão Média: 0.6581426108060022

F1-Score: 0.9551274548816742

ROC-AUC: 0.9922276780027618

Gradiente Boosting com balanceamento do tipo SMOTE

Métricas do Modelo Gradient Boosting SMOTE:

Acurácia: 0.9835443926874371

Precisão: 0.09102730819245773

Recall: 0.9459459459459459

Precisão Média: 0.7633265633632431

F1-Score: 0.9835443926874371

ROC-AUC: 0.9914206125838831

Random Forest com balanceamento do tipo Random Under Sampling

Métricas do Modelo Random Forest Under:

Acurácia: 0.9726598160155427

Precisão: 0.05744336569579288

Recall: 0.9594594594594594

Precisão Média: 0.7861966803216005

F1-Score: 0.9726598160155427

ROC-AUC: 0.9943857145301561

Random Forest com balanceamento do tipo SMOTE

Métricas do Modelo Random Forest SMOTE:

Acurácia: 0.9996722923152548

Precisão: 0.9054054054054054

Recall: 0.9054054054054054

Precisão Média: 0.9223510171307236

F1-Score: 0.9996722923152548

ROC-AUC: 0.9831897811005368

Análise sobre os modelos:

Os modelos de random Forest obtiveram recall acima de 90% porém a precisão foi melhor para o modelo treinado com os dados balanceados com SMOTE do que com Random Under Sampling. A precisão média ficou acima de 78%. Olhando as curvas roc-auc e precision-recall vemos uma relação muito mais equilibrada entre as métricas nos dois casos. O modelo treinado com SMOTE foi o que teve o melhor F1-score de todos com 99.97%. Precisão e Recall foram ambos de 90%.

Olhando para os resultados dos modelos, os de Random Forest parecem ser os mais interessantes. Logo, escolhi o modelo de Random Forest balanceado com Random Under Sampling como o mais adequado para ir para a última etapa de teste, pois ele tem o melhor recall e maior ROC AUC entre os dois. Com isso, busco detectar a maior quantidade de fraudes possível sem prejudicar a detecção das transações normais.

Avaliação final do modelo

Com o modelo selecionado na modelagem, os resultados para a detecção do conjunto de teste é apresentado a seguir:

Métricas do Modelo final com os dados de teste:

Acurácia: 0.9735967417255746

Precisão: 0.05489864864864865

Recall: 0.8783783783783784

F1-Score: 0.9735967417255746

Precisão Média: 0.7201919477344203

ROC-AUC: 0.9659405466242833

O resultado do teste final é próximos dos resultados de validação. Isso é um bom sinal! 😀

Para um problema no qual o dado já veio tratado e não há muito o que se fazer com o conjunto original, sem entender o que todos os atributos significam, esse é um resultado interessante.

Talvez, esse resultado possa até ser melhorado se ténicas mais avançadas forem utilizadas ou se melhorarmos o conjunto original de dados com mais registros.

Ok, chegamos ao final desse processo com um modelo onde podemos dizer que ele classifica corretamente 88% das fraudes realizadas em transações bancárias.

De volta ao problema de negócio…

Com modelos de Machine Learning como esses, sistemas antifraude podem ter mais uma opção, baseada em dados, para alertar os investigadores e detectar as fradues com mais precisão. Este é um Indicador Chave de Desempenho (KPI) desses sistemas e pode ser medido diariamente. Digamos que um investigador consiga analisar X alarmes de fraudes em um dia. Maximizar a quantidade de alarmes gerados que de fato são fraudes é o grande objetivo de um sistema como esse. Medir essa precisão pode ser um KPI interessante para determinar o valor que os modelos de Machine Learning trazem para o negócio!

Conclusões

  • Pode ser visto neste projeto que o problema de detecção de fraude não é tão simples e que modelos de Machine Learning podem ser bastante úteis no reconhecimento de padrões.
  • O modelo final obteve um resultado interessante. E, se comparado ao classificador burro, que chuta as predições tudo como classe 0, o modelo treinado é muito superior.
  • Avalio que melhores resultados podem ser alcançados, desde que técnicas mais avançadas sejam testadas, tais como cross-validation e grid-search na parametrização dos hiperparâmetros, ou algumas técnicas de Deep Learning também podem ajudar aqui.

Temos um modelo para entrar em ação! Em breve posto aqui, em um novo post, como fazer deploy deste mesmo modelo! 👌

Ahh, antes de fechar a página não se esqueça de olhar este outro projeto de análise de dados sobre o Airbnb. 😜

LatinX in AI (LXAI) logo

Do you identify as Latinx and are working in artificial intelligence or know someone who is Latinx and is working in artificial intelligence?

Get listed on our directory and become a member of our member’s forum: https://lxai.app/

Become a writer for the LatinX in AI Publication: http://bit.ly/LXAI-Volunteer

Learn more on our website: http://www.latinxinai.org/

Don’t forget to hit the 👏 below to help support our community — it means a lot! Thank you :)

--

--

André Almeida
LatinXinAI

Sou Engenheiro Eletricista que atualmente trabalha na área da Indústria 4.0 com Ciência de Dados e Inteligência Artificial.