Detecção de Fraudes em Cartão de Crédito: Construindo Modelos de Machine Learning

Neste artigo, irei discorrer sobre as principais ideias e resultados obtidos através do meu projeto de Detecção de Fraudes em Cartão de Crédito. Caso tenha interesse em visualizar o projeto completo (Jupyter Notebook), com um conteúdo mais técnico, você pode acessá-lo aqui.

O estudo deste problema é de grande relevância, uma vez que a não-detecção de fraudes acarretará em prejuízos consideráveis, tanto para o consumidor, quanto para a instituição financeira.

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.

O grande desafio é: Aprimorar cada vez mais o uso de algoritmos de Machine Learning, visando inibir ou evitar transações fraudulentas.

Importação dos Dados

Conforme bem observado nas informações do Dataset original obtido do Kaggle, nosso conjunto de dados contém transações por emissoras europeias, tendo sido obtidos em Setembro de 2013. As transações ocorreram em dois dias, totalizando 492 fraudes de um total de 284.807 transações.

A seguir, mostrarei que se trata de um dataset extremamente desbalanceado, sendo que as fraudes representam 0,17% do total.

As features passaram por uma transformação conhecida como Análise de Componentes Principais - Principal Component Analysis (PCA) - que permite a redução da dimensionalidade enquanto mantém o maior número possível de informações.

O produto dessa transformação são as variáveis [V1, V2, …, V28].

Bibliotecas Utilizadas

Neste projeto foram utilizadas as seguintes bibliotecas:

  • Pandas: Manipulação e Análise de dados
  • Numpy: Processamento de Arranjos multi-dimensionais e Matrizes, além de funções matemáticas
  • Matplotlib: Visualização de dados e criação de gráficos
  • Seaborn: Similar ao Matplotlib, mas com opções mais interessantes de personalização de gráficos
  • Scikit-plot: Visualização de dados. Imprescindível para a criação de Matrizes de Confusão. Se você não sabe o que é uma Matriz de Confusão, fique tranquilo, chegaremos lá.
  • Scikit-learn: Coração do projeto, pois nela estão contidos os modelos de Machine Learning que serão treinados para a detecção de fraudes.
  • Missingno: Ferramenta interessante que conheci recentemente, que facilita a visualização de dados ausentes.
  • Imbalanced Learn: Utilizada em datasets com dados desbalanceados, pois permite a utilização da técnica de sampling, que será explicada mais adiante.

Divisão do dataset em conjunto de treino, validação e teste

Se você já tem uma experiência com Machine Learning, entenderá que é de vital importância a divisão do conjunto de dados em dados de treino, validação e teste.

O fluxograma a seguir mostra bem como a divisão deve ser feita:

O motivo principal para a divisão é evitar que ocorra vazamento de dados ou overfitting.

Análise Exploratória

A Análise Exploratória é um primeiro contato com o dataset no qual estamos trabalhando. Para isso, faz-se necessário verificar como os dados estão dispostos, além de buscar possíveis tratamentos que devam ser feitos.

Ao verificar o conjunto de dados, podemos observar que as variáveis V1, … V28 sofreram padronização. No entanto, o mesmo não ocorreu com Time e Amount.

Além disso, estamos lidando com um conjunto cujas variáveis são exclusivamente numéricas, sendo a variável Class o nosso Target Vector, que se encontra em formato binário. As transações fraudulentas estão representadas na variável Class por meio do valor 1, enquanto as transações normais são representadas pelo valor 0.

Balanceamento dos Dados

Como já foi observado e citado anteriormente, trata-se de um conjunto extremamente desbalanceado, com 0.17% de fraudes no dataset.

Outro ponto a ser observado é a inexistência de valores ausentes no conjunto, fato este que permite um aproveitamento excelente dos dados em nossa análise.

Histograma Time versus Class

A observação do histograma Time vs. Class não nos traz informação de grande valor para o nosso modelo de Machine Learning.

As transações válidas ocorrem de maneira praticamente uniforme, com exceção de um período em que há menor volume de transações. A conversão do tempo em segundos para horas e sabendo que o período dos dados compreende dois dias, 172.800 segundos, sabemos que o período de menor número de transações válidas é o período da madrugada, totalmente de acordo.

No entanto, para as transações fraudulentas, podemos observar dois comportamentos distintos, representados pelos picos localizados em 90.000s, aproximadamente e aproximadamente 42.500s

  • Grande número de transações fraudulentas no horário comercial, provavelmente uma tentativa de passar despercebido em meio ao grande volume de transações válidas
  • Número elevado de transações fraudulentas durante a madrugada, ou seja, no período em que não há grande quantidade de transações válidas.

Amount versus Class

Os gráficos acima nos mostram que a mediana dos valores de transações fraudulentas é menor do que as transações válidas. Ou seja: os criminosos utilizam valores menores, de forma a não serem detectados. No entanto, há tentativas de fraude com valores acima de $1.000,00.

Gráfico de Densidade

O gráfico de densidade possui uma utilidade enorme para compararmos as distribuições de cada variável. Sendo assim, torna-se possível ver quais são as variáveis mais importantes para a detecção de anomalias.

Conforme a documentação oficial da biblioteca de visualização de dados Seaborn:

A kernel density estimate (KDE) plot is a method for visualizing the distribution of observations in a dataset, analagous to a histogram. KDE represents the data using a continuous probability density curve in one or more dimensions.

Tendo o gráfico de densidade da variável-alvo, iremos buscar distribuições que diferem uma da outra, permitindo identificar fraudes com mais facilidade.

A visualização acima nos permite concluir que as variáveis V3, V4, V10, V11 e, ainda, V17 possuem um comportamento bem distinto, e irão representar um ganho de informação maior na distinção entre transações normais e fraudulentas.

Sob essa mesma ótica, as variáveis V13 e V15 possuem comportamento aproximadamente igual, não nos dando qualquer indício sobre qual classe a transação pertence.

Preparação dos Dados

Normalização dos Dados

A biblioteca utilizada por mim para a criação dos modelos de Machine Learning (Scikit-Learn) é sustentada por três pilares fundamentais: Estimator, Predictor e Transformer APIs.

A API Estimator é a que fará o treinamento do modelo escolhido. Para a predição de dados novos, utilizamos a API Predictor. E finalmente, para a transformação dos dados, a API utilizada é a Transformer.

A normalização dos dados foi realizada com o apoio do método fit_transform do objeto StandardScaler do Scikit-learn.

O procedimento adotado foi:

  1. Realizamos uma cópia do dataframe
  2. Instanciamos um novo objeto StandardScaler para a normalização dos dados
  3. Foram criadas duas colunas novas no dataset, contendo os dados já normalizados

Balanceamento dos Dados

Conforme observamos acima, os dados estão extremamente desbalanceados, sendo 0.17% dos dados representantes de fraude. Para obtermos uma maior acurácia no treinamento de nosso modelo, precisamos fazer um balanceamento.

Para a abordagem “sampling” de balanceamento, podemos nos valer de duas técnicas:

  • Under-sampling, onde dados da classe majoritária serão desprezados
  • Over-sampling, dados da classe minoritária serão reproduzidos em maior quantidade, de forma a equilibrar o dataset.

A abordagem utilizada foi a ‘under-sampling’, que se mostrou satisfatória em termos de custo-benefício.

Para isso, utilizamos a lib Imbalanced Learn, que foi responsável por fazer a amostragem.

Matriz de Correlação - Desbalanceado versus Balanceado

A matriz de correlação dos dados desbalanceados não nos permite extrair grandes insights sobre os dados. Não conseguimos visualizar fortes correlações entre os dados utilizando este dataset.

Para isso, faremos uma nova matriz de correlação utilizando o conjunto balanceado:

Veja como o nosso cenário muda completamente, apenas com a utilização dos dados balanceados.Com os dados balanceados, fica muito mais fácil identificar a correlação entre as variáveis. Vejamos a correlação de V11 com V12: -0.91. Uma forte correlação negativa.

Com os dados desbalanceados, neste mesmo caso, teríamos encontrado uma correlação de 0.0, nos levando a concluir, erroneamente, na descorrelação entre as variáveis.

Como ficou fácil de perceber, a utilização de dados balanceados para a plotagem da matriz de correlação nos trouxe informações muito valiosas, em oposição aos dados desbalanceados, onde boa parte dos dados apresentados não teria correlação com as outras variáveis.

Modelo de Machine Learning

Antes de efetivamente colocarmos a mão na massa, aliás, no código, precisamos definir o tipo de problema que precisamos resolver: É uma previsão de dados numéricos? Caso sim, seria um problema de regressão.

No entanto, este não é o caso. Nosso problema é determinar a probabilidade de uma determinada transação pertencer ou a classe 0, ou a classe 1.

Nas palavras de Gonzalez (2018), a regressão logística é uma técnica estatística que tem como objetivo produzir, a partir de um conjunto de observações, um modelo que permita a predição de valores tomados por uma variável categórica, frequentemente binária, em função de uma ou mais variáveis independentes contínuas e/ou binárias.

Apesar do nome “Regressão Logística”, Provost e Fawcett (2016) nos ensinam que este é um nome um tanto equivocado, e esta não faz exatamente o que chamamos de Regressão, que é a estimativa de um valor alvo numérico. A regressão logística aplica modelos lineares para estimar a probabilidade da classe.

Ou seja, é o que precisamos. Desta forma, o treino de um modelo de Regressão Logística é o nosso objetivo.

Adicionalmente, o modelo SVM - Support Vector Machine - também é uma possibilidade para o nosso problema.

Matriz de Confusão

Ou seja: A matriz de confusão contem a acurácia para cada um dos tipos de erro a seguir.

  • TP - True Positive: Quando a transação é legítima e o modelo classifica como legítima.
  • FP - False Positive: Quando a transação é legítima e o modelo classifica como fraudulenta.
  • FN - False Negative: Quando a transação é fraudulenta e o modelo classifica como transação legítima.
  • TN - True Negative: Quando a transação é fraudulenta e o modelo classifica como transação fraudulenta

Regressão Logística

Utilizando Regressão Logística e os dados desbalanceados para o treinamento e previsão dos dados, chegamos ao seguinte resultado:

  • 99,81% de Acurácia Global

É um bom resultado, mas não podemos olhar isoladamente para este valor. Vimos na Matriz de Confusão que a capacidade do modelo de prever corretamente as fraudes é de apenas 57%, ou seja, trata-se de um modelo bastante ineficiente.

Vejamos o que acontece quando utilizamos um modelo de Regressão Logística utilizando dados balanceados com undersampling:

Uma considerável melhora na capacidade de prever as fraudes, mesmo com uma redução da acurácia global.

Através da observação dos resultados dos dois modelos de Regressão Logística, podemos concluir que:

  • O balanceamento de dados é extremamente conveniente. Apesar da redução da acurácia global, tivemos um precisão de 91% na previsão de fraudes, que é o nosso objetivo. Com o modelo utilizando dados desbalanceados, obtivemos uma precisão de 57% para a previsão.
  • Não podemos considerar apenas a acurácia global como medida de desempenho. Há de se observar o objetivo principal do modelo. No nosso caso, a capacidade de detecção de fraudes, o quarto quadrante da nossa matriz de confusão.

Support Vector Machine - SVM - com dados balanceados

Para o modelo SVM, optamos por utilizar apenas o dataset balanceado, pois já sabemos da sua capacidade de melhorar os resultados. Obtivemos os seguintes resultados com esta abordagem:

Com isso, nossa acurácia global:

  • 98,07%

A hora da verdade - Dados de Teste

O resultado obtido ao se utilizar os dados de teste foram:

  • 95,60%

Avaliação do desempenho do modelo

Através da construção de diversos modelos para a solução do nosso problema, optamos por prosseguir com a Regressão Logística, utilizando dados balanceados, o que nos trouxe os seguintes resultados para os dados de teste:

  • 95% de acurácia global
  • 89% de acurácia para a previsão de fraudes

Tal resultado é flagrantemente superior à utilização do mesmo modelo de Regressão Logística com dados desbalanceados (99,9% de acurácia global com 57% de acurácia para previsão de fraudes).

Em comparação com o modelo Support Vector Machine (SVM), houve uma ligeira diferença na capacidade de detecção de fraudes. O modelo SVC foi capaz de proporcionar uma acurácia global de 98,07%. No entanto, para o objetivo desde projeto, obtivemos 90% de acurácia na detecção de fraudes utilizando os dados de validação.

Conclusão

Os dados disponibilizados vieram bem tratados, tendo sido aplicada a técnica PCA de redução de dimensionalidade. Mesmo assim, ainda houve a necessidade de realizar o balanceamento dos dados, em virtude da característica das fraudes de cartão de crédito serem eventos que ocorrem com pouca frequência.

A criação de diversos modelos mostrou-se extremamente valorosa, por nos mostrar a importância do balanceamento de dados. A introdução de um modelo SVM também foi interessante, por ser uma alternativa à Regressão Logística.

Por fim, convido você a conhecer um pouco mais do meu trabalho sobre Data Science no Medium e Linkedin.

REFERÊNCIAS

GONZALEZ, Leandro de Azevedo. Regressão Logística e suas Aplicações. 2018. Trabalho de Conclusão de Curso (Bacharel em Ciência da Computação) - Universidade Federal do Maranhão, [S. l.], 2018. Disponível em: https://monografias.ufma.br/jspui/bitstream/123456789/3572/1/LEANDRO-GONZALEZ.pdf. Acesso em 29 de janeiro de 2022.

PROVOST, Foster; FAWCETT, Tom. Data Science para Negócios: O que você Precisa Saber Sobre Mineração e Pensamento Analítico de Dados. 1. ed. Rio de Janeiro: Alta Books, 2016. 408 p. v. 1. ISBN 978–85–7608–972–8.