Aprendizado supervisionado aplicado à detecção de fraudes em cartões de crédito

Gabriel Ribeiro Ferreira Lopes
20 min readMay 22, 2023

--

Resumo — Este artigo mostra os resultados do projeto de aprendizado supervisionado feito com o objetivo de detectar fraudes em cartões de crédito. O conjunto de dados foi separado entre treino e teste, e dois modelos de classificação foram construídos: regressão logística e árvore de decisão. Os modelos foram antes validados no conjunto de treino e, então, tiveram seus desempenhos comparados no conjunto de teste, com novas observações. A partir disto, decidiu-se que o modelo de regressão logística é o que fornece as melhores previsões, do ponto de vista do contexto de dados e do problema de negócios em questão.

Contexto do estudo

Na era digital em que vivemos, fraudes em cartões de crédito se tornaram uma preocupação importante para instituições financeiras, empresas e, claro, para os consumidores. De acordo com estudos recentes, as fraudes representam bilhões de dólares em perdas anualmente, e o problema continua a crescer à medida que os fraudadores se tornam mais sofisticados em suas táticas.

Para combater esse problema, muitas instituições financeiras e negócios estão recorrendo a modelos de aprendizado de máquina para ajudar a detectar e prevenir transações fraudulentas nos cartões. Para isso, essas empresas vêm investindo na aquisição e mineração de uma grande quantidade de dados, para que profissionais possam implementar modelos de algoritmos avançados, capazes de analisar vastas quantidades de dados, além de identificar padrões e anomalias que possam indicar atividade fraudulenta.

Ao criar modelos de aprendizado de máquina para detectar fraudes em cartões de crédito, as empresas não somente salvaguardam suas reputações, como também garantem a integridade dos dados dos clientes, protegendo-os de perdas financeiras e danos de reputação. Com a detecção em tempo real de transações fraudulentas e legítimas, torna-se possível tomar ações imediatas frente a esse problema.

Graças à capacidade dos modelos de se adaptarem a novos dados, e aprenderem novos padrões continuamente, o investimento nessa tecnologia — sobretudo em cientistas de dados profissionais capazes de implementá-la — torna-se essencial e até mesmo obrigatório.

À medida que a economia digital cresce, por vezes mais rapidamente do que preveem as projeções, a necessidade de ferramentas eficazes na detecção e prevenção de fraudes se tornará ainda mais crítica, e os modelos de aprendizado de máquina desempenharão um papel crucial na abordagem desse problema.

Este artigo tem como objetivo, portanto, caminhar o leitor pelo processo de construção de modelos de Machine Learning do zero — visando a detecção fraudes em cartões de crédito através do aprendizado supervisionado.

Sobre o conjunto de dados

O conjunto de dados utilizado neste projeto consiste de transações realizadas na Europa em setembro de 2013, correspondendo a dois dias de coleta de dados e um total de 284 mil exemplos.

Dimensões do conjunto original

  • Entradas: 284807
  • Variáveis: 31

Para a construção dos modelos, os dados foram divididos entre conjuntos de treino e teste, numa proporção de 80:20, ou seja, 80% do conjunto original se destinou ao treino, enquanto 20% ficou reservado para testes.

As dimensões dos conjuntos de treino e teste são as seguintes:

Treino (80%)

  • Entradas: 227846
  • Variáveis: 31

Teste (20%)

  • Entradas: 56961
  • Variáveis: 31

O conjunto de treino servirá não somente para construir o modelo, como também para validá-lo com observações que não fizeram parte do ajuste. Dessa forma, garantimos que o modelo terá um potencial de generalização maior quando se deparar com dados novos. Sendo assim, dividimos o conjunto de treino em subconjuntos de ajuste e validação, na mesma proporção 80:20.

A Figura 1.1 abaixo ilustra como ficaram as divisões dos dados para este projeto.

Figura 1.1 — Divisão dos dados do conjunto original entre treino e teste.

Dicionário de variáveis

  • Time - Tempo transcorrido desde o início da coleta de dados;
  • Amount - Valores das transações;
  • Class - Variável-alvo que define se uma transação foi fraudulenta ou não: Normal = 0, Fraude = 1;
  • (V1, V2, …, V28) - Valores que caracterizam as transações, obtidos a partir da transformação PCA, uma técnica de redução de dimensionalidade que visa, nesse contexto, preserva a confidencialidade de dados dos clientes.

Objetivos do projeto

Neste projeto, buscamos analisar os dados das transações para construir modelos de Machine Learning que sejam capazes de prever fraudes para novos dados de forma efetiva.

Para isso, é necessário que:

  • Seja feita uma análise exploratória visando conhecer a distribuição e características gerais dos dados;
  • Avaliar se o conjunto de dados precisa ser balanceado, de modo que o modelo resultante saiba identificar corretamente os padrões que representam transações normais e fraudulentas;
  • O modelo seja treinado utilizando métodos de classificação e otimização que garantam o equilíbrio com relação a sobreajustes e à generalização para novos dados, de modo a manter a complexidade em um grau aceitável.

Em resumo, iremos:

  • Entender as distribuições e padrões que os dados oferecem;
  • Balancear as classes meio a meio (50:50), com a mesma proporção de exemplos de transações legítimas e fraudulentas;
  • Determinar os modelos de classificadores que serão utilizados;
  • Ajustar os dados de treino para construção do modelo, e testá-lo com dados novos do conjunto de testes;
  • Comparar o desempenho de cada modelo.

Análise Exploratória dos Dados

A análise exploratória tem como objetivo investigar as distribuições dos dados e visualizar padrões visíveis nas variáveis. Assim, é possível obter uma noção melhorada do contexto dos dados, além de definir os atributos mais informativos para a construção do modelo.

Dados desbalanceados

Numa análise inicial, foi observado que o dataset, constituído apenas de variáveis numéricas, não possui nenhum valor ausente para as 31 variáveis. Contudo, os exemplos que definem cada classe são altamente desbalanceados, como se pode ver na Figura 1.2.

Figura 1.2 — Desbalanceamento dos dados.

A classe majoritária, que descreve as transações legítimas, constitui 227455 entradas, ou 99,83% do dataset. A classe minoritária, que corresponde às transações fraudulentas, possui 391 exemplos, ou 0,17% do conjunto.

Assim, nota-se que os dados necessitam de balanceamento antes de iniciar a construção de modelo. Se isto não acontecer, o modelo não será capaz de identificar razoavelmente os padrões que se referem à classe minoritária. Isto acarreta uma performance baixa por parte do classificador para detectar fraudes, uma vez que ele irá identificar a maioria dos exemplos como sendo da classe majoritária. Um modelo construído assim tende a sofrer com sobreajuste em excesso, memorizando as respostas e com baixa capacidade de generalização para novos dados.

Análise da Variável ‘Time’

Em seguida, analisamos a distribuição das classes ao longo do tempo, com relação à frequência das transações. A ideia aqui é de identificar padrões no tempo que diferenciem as ocorrências normais daquelas que caracterizam fraude. A Figura 1.3 mostra essa distribuição durante o período de 48 horas.

Figura 1.3 — Frequência de transações para cada classe ao longo do tempo.

Note que a classe normal (em azul) segue um padrão no tempo, com acúmulo de transações ocorrendo em momentos específicos do dia, provavelmente relacionados ao horário comercial. Em contrapartida, as fraudes (em vermelho) ocorrem em tempos aleatórios, indicando um comportamento anormal e imprevisível.

A Figura 1.4 ilustra mais essa diferença observada, através do ajuste do estimador gaussiano sobre os dados.

O estimador de densidade gaussiano é uma técnica estatística de ajuste sobre dados cuja distribuição é desconhecida. Para isso, o estimador tenta ajustar uma curva de probabilidade gaussiana sobre cada observação e, depois, soma as contribuições individuais para obter uma estimativa da distribuição de densidade total.

Figura 1.4 — Frequência das transações utilizando o estimador gaussiano para ajustar as distribuições.

Para ver detalhes da construção desse gráfico, utilizando as bibliotecas Matplotlib e Scipy, clique aqui.

Com o estimador gaussiano, fica mais claro como as distribuições dos dados de transações se diferem no tempo. A função tem muito mais facilidade de lidar com a variabilidade dos dados na classe Normal, se comparado com a classe de Fraude.

Com essa análise, podemos constatar que a variação dos dados para cada classe com relação ao tempo é um ótimo atributo informativo para a construção do modelo.

Análise da Variável ‘Amount’

A variável Amount nos informa com relação ao valor das transações realizadas no período. A Figura 1.5 compara as distribuições dos valores das transações entre as classes que representam as transações legítimas (Normal) e fraudulentas (Fraude).

Figura 1.5 — Distribuição dos valores das transações, em escala absoluta, para as classes de transações normais e fraudulentas.

As escalas dos gráficos foram mantidas no mesmo intervalo para melhor comparação. Note que as transações normais se concentram em valores baixos, assim como as ilegítimas. Contudo, há maior ocorrência de transações no intervalo que varia de aproximadamente €250 até €1000 no caso das fraudes, além de que, entre €1000 e €1500, existem mais transações fraudulentas que não ocorrem na classe normal.

Para avaliar as diferenças estatísticas entre as duas classes com relação à variável Amount, a Figura 1.6 mostra os respectivos boxplots.

Figura 1.6 — Boxplots para a variável Amount

Os boxplots acima mostram algumas diferenças estatísticas entre as classes com relação à variável Amount. Note que as transações normais apresentam média menor com relação aos casos de fraude (€88,6 contra €125,6). A média no gráfico é representada pelo triângulo acima do limite superior de cada boxplot.

Além disso, quando comparado com a classe de Fraude, o intervalo entre quartis (IQR) para a classe Normal é menor, assim como o valor máximo do limite superior do IQR.

Por fim, o fato de haver muitos outliers para ambas as classes significa que devemos fazer algum tipo de padronização sensível a outliers para esses dados, antes de implementarmos o modelo. A normalização é importante por alguns motivos. Dentre eles, destacamos três:

  1. Outliers podem influenciar desproporcionalmente os dados — Como os valores extremos desviam muito do intervalo padrão dos dados, sua presença no treinamento do modelo pode levar ao enviesamento dos resultados;
  2. A padronização facilita a comparação entre atributos — Os modelos muitas vezes combinam atributos para fazer uma previsão. Se cada atributo individual se encontra numa escala, fica difícil para o modelo medir a importância relativa entre eles;
  3. Melhorar a performance do modelo — Ao garantir escalas consistentes e reduzir o impacto que os outliers têm sobre o viés do modelo, é possível obter melhores performances, com um treinamento mais efetivo e maior convergência dos resultados.

Com esse tipo de cuidado, o modelo será capaz de aprender mais eficientemente e realizar melhores predições.

Em suma, a variável Amount apresenta padrões nos dados que distinguem as duas classes, sendo um atributo informativo relevante para a construção do modelo.

Correlação entre as componentes principais

Agora vamos explorar as correlações existentes entre as componentes principais, que carregam a maior parte das informações estatísticas sobre as transações.

Para realizar essa visualização, utilizamos a Estimativa de Densidade Kernel (KDE) para as duas classes da variável-alvo.

A Estimativa de Densidade Kernel é uma maneira não-paramétrica de estimar a função densidade de probabilidade de uma variável aleatória. No contexto de detecção de anomalias no uso cartões de crédito, a KDE é útil para visualizar e comparar a distribuição de diferentes variáveis, em diferentes períodos de tempo ou grupo de transações, como é o nosso caso.

Ao sobrepor os plots da KDE, é possível identificar rapidamente variações na distribuição de probabilidades subjacente que pode ser indicativo de uma mudança nos padrões ou no comportamento.

Aplicada às componentes principais, podemos estimar, portanto, a distribuição de probabilidade do conjunto de dados em um espaço de menor dimensão. Por exemplo, podemos identificar regiões de alta densidade da classe que determina fraude e que distoa da distribuição para a classe normal. Isto pode ser indicativo de que aquele atributo é mais informativo para previsão de fraudes do que outros.

A Figura 1.7 mostra a correlação entre as componentes principais.

Figura 1.7 — Correlação entre as componentes principais V1, V2, …, V28.

A partir da análise dos gráficos acima, podemos distinguir aquelas variáveis em que as classes tem uma maior correspondência, daquelas em que as classes distoam o suficiente para sugerir uma atividade incomum.

Conforme explicado anteriormente, quanto maior for essa discrepância entre as probabilidades subjacentes, maiores são as chances daqueles atributos serem bons preditores de fraudes para o modelo de aprendizagem de máquina.

Note que as componentes mais discrepantes são a V3, V4, V10, V11, V12, V14, V16, V17 e V18. Ao observarmos essas variáveis, nota-se que as curvas das duas classes dificilmente se sobrepõem, estando ou deslocadas entre si ou espalhadas com relação à média.

Por outro lado, as que mais estão coincidentes são a V6, V13, V15, V22, V25, V26 e V28. Para essas variáveis, temos que as duas curvas são correspondentes até certo grau.

Resumo da Análise Exploratória

O conjunto de dados é composto de variáveis numéricas que caratacterizam transações de cartões de crédito. Os atributos passaram por uma redução de dimensionalidade através da técnica do PCA (Principal Component Analysis), com o intuito de manter o sigilo de dados e a confidencialidade dos compradores.

Apenas as variáveis Time, Amount e Class não foram transformadas pelo PCA, mantendo suas características originais. A variável-alvo é Class e classifica as transações entre normais (0) e fraudulentas (1).

  • O conjunto de dados não possui valores nulos;
  • O conjunto é altamente desbalanceado, com 99,83% de transações normais e 0,17% de fraudes;
  • As variáveis Time e Amount apresentam outliers que deverão ser tratados para a construção do modelo;
  • Destacou-se alguns atributos mais informativos para a construção do modelo.

Preparação dos dados

Nesta etapa, iremos realizar três procedimentos de preparação de dados:

  1. Padronizar as variáveis Time e Amount, para que sejam robustas a outliers;
  2. Dividir os dados do conjunto de treino entre ajuste e validação;
  3. Balancear em meio a meio os exemplos das duas classes.

Padronização das variáveis

Como vimos anteriormente, as duas variáveis apresentam outliers que não queremos que influenciem na construção do modelo, enviesando qualquer tipo de identificação de padrões e posterior classificação. Por esta razão, iremos utilizar uma técnica de normalização robusta a outliers.

Iremos utilizar o RobustScaler da biblioteca Scikit-Learn. O RobustScaler usa a mediana e o IQR para normalizar os dados, lidando com os valores extremos. Com isto, espera-se que o modelo tenha uma performance melhorada, já que todas as variáveis estaram numa escala comparável e não enviesada.

Abaixo, o código em Python para implementar o RobustScaler:

from sklearn.preprocessing import RobustScaler

# Criando uma cópia do DataFrame limpo
df_clean = df.copy()

# Criando o objeto a partir da classe RobustScaler
rob_scaler = RobustScaler()

# Ajustar os dados de Time e Amount para a normalização robusta a outliers
df_clean['norm_time'] = rob_scaler.fit_transform(df_clean['Time'].values.reshape(-1, 1))
df_clean['norm_amount'] = rob_scaler.fit_transform(df_clean['Amount'].values.reshape(-1, 1))

# Excluindo as duas colunas não normalizadas
df_clean.drop(['Time', 'Amount'], axis = 1, inplace = True)

# Reposicionar as colunas das variáveis normalizadas, para as primeiras posições do DataFrame
norm_time = df_clean['norm_time']
norm_amount = df_clean['norm_amount']

df_clean.drop(['norm_time', 'norm_amount'], axis = 1, inplace = True)

# Posicionando as colunas nas primeiras posições do dataframe
df_clean.insert(0, 'Norm_Time', norm_time)
df_clean.insert(1, 'Norm_Amount', norm_amount)

df_clean.head()

A Figura 1.8 abaixo mostra o resultado antes (a) e depois (b) da transformação para as 5 primeiras entradas.

Figura 1.8 — Resultado da padronização das variáveis Time e Amount através do RobustScaler. (a) Antes; (b) depois.

Divisão dos dados para ajuste e validação

Em seguida, foram divididos os dados do conjunto de treino de modo a definir as variáveis que serão utilizadas no ajuste e na validação dos modelos de classificação. Para isso, utilizou-se a função train_test_split do módulo sklearn.model_selection.

Todas as variáveis X representam a matriz de atributos (ou feature matrix), enquanto as variáveis y representam o alvo, com a classe determinada para os respectivos exemplos. O código abaixo mostra a divisão.

from sklearn.model_selection import train_test_split

# Separar os dados entre a matriz de atributos e a variável-alvo
X = df_clean.drop('Class', axis = 1)
y = df_clean['Class']

# Instanciar a função que divide os dados entre os conjunto de treino e teste,
# armazenando-os nas respectivas variáveis
X_train, X_val, y_train, y_val = train_test_split(X, y,
test_size = 0.2,
shuffle = True, stratify = y)

Com os argumentos ‘shuffle’ e ‘stratify’, nosso objetivo é, respectivamente, embaralhar randomicamente os dados antes da divisão e manter a proporção da variável-alvo em ambos os conjuntos de ajuste e validação.

As dimensões dos conjuntos de ajuste e validação são as seguintes:

Ajuste:

  • X_train: (182276, 30)
  • y_train: (182276, )

Validação:

  • X_val: (45570, 30)
  • y_val: (45570, )

Balanceamento dos dados

Por fim, precisamos balancear o conjunto de treino para que o modelo seja capaz de detectar padrões e tomar decisões sem ser afetado por problemas de sobreajuste, enviesando os resultados para a classe majoritária.

Em vista disso, iremos utilizar uma técnica de undersampling aleatório, ou seja, de redução da amostragem da classe majoritária, até que tenhamos um número equivalente de exemplos de transações normais e fraudulentas.

Abaixo, importamos a função RandomUnderSampler a partir do módulo imblearn.under_sampling. O RandomUnderSampler remove exemplos existentes da classe majoritária, de modo que cada ponto tenha a mesma probabilidade de ser removido. O trade-off dessa abordagem é a perda de informação por redução da amostragem na classe majoritária.


from imblearn.under_sampling import RandomUnderSampler

# Definindo o objeto RandomUnderSampler()
rus = RandomUnderSampler()

# Aplicando o undersampling nos conjuntos de treino da matriz de atributos e da variável-alvo
X_rus, y_rus = rus.fit_resample(X_train, y_train)

print('Dimensões do conjunto de treino após o Undersampling:',
'\nX_rus:\t', X_rus.shape,
'\ny_rus:\t', y_rus.shape)

As dimensões do conjunto de ajuste após o Undersampling:

  • X_rus: (626, 30)
  • y_rus: (626, )

Na Figura 1.9, é possível comparar as mudanças nos dados com relação às classes. Utilizamos duas componentes principais (V13 e V15) que se mostraram fortemente correlacionadas, visualizando a proporção das duas classes da variável-alvo.

Figura 1.9 — Comparando o efeito da redução de dimensionalidade nas proporções de exemplos para cada classe (Normal = 0, Fraude = 1)

Fica evidente que, antes, a maioria dos pontos correspondiam à classe Normal, e depois os dados ficaram balanceados, com os pontos em vermelho (Fraude) ficando mais evidentes.

A Figura 1.10 coloca esses resultados num gráfico de barras que mostra claramente o balanceamento meio a meio.

Figura 1.10 — Balanceamento entre as classes Normal (0) e Fraude (1), numa proporção meio a meio para o conjunto de dados de ajuste.

Matrizes de correlação

Para finalizar esta seção, vamos comparar as matrizes de correlação antes, com dados desbalanceados, e depois, com os dados balanceados.

Figura 1.11 — Matrizes de correação para dados desbalanceados (à esquerda) e para dados balanceados (à direita). Note a grande diferença na detecção de correlações entre as componentes principais.

A diferença entre as duas matrizes é muito grande. À esquerda, para dados desbalanceados, vemos que é muito difícil identificar qualquer correlação entre as componentes principais, que fornecem de fato os dados necessários para a detecção de fraudes.

Na matriz para dados balanceados, nota-se que a resolução para identificação de padrões melhorou grandemente. É possível distinguir as componentes principais correlacionadas positiva e negativamente. Do ponto de vista da construção do modelo de aprendizado de máquina, essa distinção será crucial para uma boa performance, sem excesso de complexidade e sobreajuste.

Construção do modelo de Regressão Logística

Agora que já temos uma visão geral do conjunto, com os dados preparados e balanceados, podemos prosseguir para a construção dos modelos. O primeiro será o de regressão logística.

Para a construção do modelo de regressão logística, iremos utilizar o módulo sklearn.linear_model, selecionando a função LogisticRegression.

A Regressão Logística é baseada na função sigmoide, e aceita relações não-lineares entre as variáveis para prever um resultado de classificação binária, que reside entre 0 e 1. A função sigmoide é definida da seguinte forma:

em que z é uma combinação linear das variáveis independentes, com seus coeficientes ajustados pelo modelo. Todo valor que a função z assume é mapeado dentro do intervalo de probabilidades, entre 0 e 1, definido por p(x) para novas observações.

As bibliotecas utilizadas foram as seguintes:

# Importando as bibliotecas para ajuste do modelo e avaliação de desempenho
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score, log_loss
from sklearn.metrics import classification_report

Com as bibliotecas de regressão logística e as métricas para avaliar seu desempenho importadas, vamos prosseguir com a construção do modelo. Na seção anterior, já realizamos três passos importantes nesse procedimento, que foram (1) a padronização das variáveis Time e Amount, (2) a divisão dos dados para ajuste e validação e (3) o balanceamento dos subconjuntos.

# Instanciar o modelo
model_1 = LogisticRegression(random_state = 42)

# Realizar o fit do modelo nos dados de treinamento balanceados
model_1.fit(X_rus, y_rus)

# Utilizar o modelo para fazer previsões com os dados de validação
y_pred_1 = model_1.predict(X_val)

# Estimar probabilidade de classe
y_proba_1 = model_1.predict_proba(X_val)

Realizamos os seguintes passos no código acima: primeiro, instanciamos o modelo de regressão logística. Em seguida, fizemos o ajuste sobre os dados de treinamento balanceados (X_rus, y_rus) e, por fim, fizemos o modelo prever as classes dos novos exemplos (y_pred_1), bem como a probabilidade deles pertencerem à classe determinada (y_proba_1).

Para avaliar o desempenho do modelo de regressão logística, vamos visualizar a matriz de confusão, identificando a taxa de erros e acertos, de falsos positivos e falsos negativos. Essa fase é crucial, uma vez que iremos determinar a qualidade do modelo segundo nossos objetivos e a solução desejada para o problema de negócios específico.

A Figura 1.12 mostra a matriz de confusão para o modelo de regressão logística.

Figura 1.12 — Matriz de confusão para o modelo de regressão logística em dados balanceados. A taxa de acertos foi de 96%, enquanto a taxa de erros ficou em torno de 4% tanto para falsos positivos quanto para falsos negativos.

De modo geral, o modelo teve uma ótima taxa de acertos, prevendo corretamente 96% das transações fraudulentas. Na classe majoritária, ele também conseguiu prever 96% das transações legítimas, que é um ótimo sinal de que o modelo consegue distinguir muito bem entre as classes da variável-alvo.

No contexto de problemas de negócios, devemos nos atentar à taxa de Falsos Positivos (FP) e Falsos Negativos (FN).

  • Falsos Positivos (FP): 4%
  • Falsos Negativos (FN): 4%

Este modelo resultou na mesma proporção de FP e FN. Cada um desses erros tem implicações distintas que serão sentidas pela empresa. Se a taxa de FP é muito alta, haverá situações de muitos cartões sendo bloqueados sem haver fraude, ocasionando problemas de má experiência do usuário.

Por outro lado, se a taxa de FN for alta, teremos situações de fraudes identificadas como transações legítimas, que lesam os clientes e fazem a empresa perder confiabilidade, podendo levá-la até a processos judiciais.

Neste caso, o modelo performou muito bem em ambos os erros para os dados de validação.

Relatório de classificação do modelo de regressão logística

Além da análise de erros e acertos através da matriz de confusão, utilizamos também métricas de avaliação baseadas na acurácia, área sob a curva e perda logística do modelo. Aplicando as funções do módulo sklearn.metrics obtivemos:

  • Acurácia: 95,8%
  • AUC: 96,0%
  • Log Loss: 16,2%

O modelo teve um ótimo desempenho segundo as métricas.

A acurácia alta mostra que o modelo faz uma boa previsão das classes, detectando corretamente 95,8% das transações e, como os dados são balanceados, essa métrica é mais confiável como indicativo do desempenho do modelo.

A AUC (Area Under the Curve) mede a capacidade do modelo distinguir entre casos positivos e negativos. Ela varia de 0 a 1, sendo o valor máximo indicativo de um classificador perfeito. Neste caso, o valor de 96% indica que o modelo tem uma boa capacidade de diferenciar entre transações legítimas e fraudulentas.

Por último, o Log Loss (Perda logística) mostra o desempenho do modelo em termos das probabilidades de classe previstas. Quanto mais próximo de zero, melhor o desempenho do modelo e, neste caso, ele está relativamente baixo em 16,2%.

Por último, se avaliamos o intercepto ajustado pelo modelo, temos uma medida do viés, que indica a probabilidade-base de uma nova observação ser classificada como um caso positivo (Fraude), desconsiderando as outras variáveis.

Obtivemos, para este modelo, um intercepto de -3,24 que corresponde a uma probabilidade-base de 3,8%. Ou seja, dada uma nova observação, ela será classificada como Normal 96,2% das vezes, desconsiderando os pesos das outras variáveis.

Modelo de regressão logística em dados desbalanceados

Apenas para motivos de comparação, podemos verificar a matriz de confusão num modelo de regressão logística construído a partir dos dados desbalanceados. A Figura 1.13 mostra o resultado.

Figura 1.13 — Matriz de confusão do modelo de regressão logística para os dados desbalanceados. Note que o modelo sobreajustou os dados da classe majoritária, resultando em 100% de acertos. Já para a classe minoritária, ele obteve 56% dos acertos e uma taxa de falsos negativos de 44%.

Discutimos anteriormente que a necessidade da preparação dos dados, com seu balanceamento, se dava para evitar o sobreajuste na classe majoritária. Como a ocorrência de fraudes corresponde a uma proporção muito pequena das transações, é claro que o modelo ajustado sobre dados desbalanceados favoreceu a classificação da classe Normal.

Porém, isto não é sinal de que o modelo é bom, ou seja, capaz de obter a mesma taxa de acertos para novas observações. O excesso de exemplos e acertos para as transações legítimas se reflete num excesso de erros e falsos negativos para a classe minoritária. Sendo assim, um modelo como esse se mostraria incapaz de fazer generalizações e previsões confiáveis.

As métricas mostram claramente a tendência de sobreajuste e a baixa capacidade de generalização:

  • Acurácia: 99,9%
  • AUC: 78,2%
  • Log Loss: 0,4%

A AUC indica que esse modelo é pior ao distinguir entre as classes, dados novos exemplos. Calculando a probabilidade-base através do intercepto, poderemos constatar que a probabilidade de uma nova observação ser Fraude é de apenas 0,0176%, desconsiderando o peso das outras variáveis.

Isso demonstra empiricamente que os dados desbalanceados forçaram o viés do modelo para identificar a classe majoritária, resultando em um problema clássico de sobreajuste.

Construindo o modelo de árvore de decisão

Vamos construir um segundo modelo de classificação baseado no algoritmo da árvore de decisão.

No caso dos modelos de árvore de decisão, é necessário definir a profundidade máxima da árvore, para que o modelo não seja desnecessariamente complexo e sofra sobreajuste ao tentar subdividir os nós-folhas da árvore até que sejam puros.

Para decidir qual profundidade a árvore deve ter, vamos utilizar a técnica de validação cruzada.

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

depths = range(1, 11)
mean_scores = []

for depth in depths:
model_3 = DecisionTreeClassifier(criterion = 'entropy', max_depth = depth, random_state = 42)
scores = cross_val_score(model_3, X_rus, y_rus, cv = 5)
mean_score = np.mean(scores)
mean_scores.append(mean_score)

Com o código acima, podemos ter uma amostragem das acurácias do modelo testando diferentes profundidades. Para isto, avalia-se a média da pontuação obtida em cada dobra usada na validação cruzada.

A Figura 1.14 mostra o resultado dessa análise.

Figura 1.14 — Análise da profundidade da árvore de decisão, utilizando a média da pontuação obtida na validação cruzada. Para este modelo, utilizaremos a profundidade máxima igual a 4.

Implementando o modelo nos dados de ajuste balanceados, utilizando como critério de decisão o grau de entropia dos nós, obtivemos a árvore mostrada na Figura 1.15.

Figura 1.15 — Árvore de decisão para a detecção de fraudes em cartões de crédito.

Como é possível notar, a árvore não é complexa demais, com excesso de galhos e decisões, nem sofre de sobreajuste, com nós-folhas puros demais. Certamente, se a profundidade da árvore fosse maior, a complexidade seria aumentada e, como pudemos ver, a acurácia diminuiria.

Em seguida, a Figura 1.16 mostra a matriz de confusão para este modelo.

Figura 1.16— Matriz de confusão para o modelo de árvore de decisão.

A árvore de decisão obteve uma taxa de 96% de acertos para transações legítimas e 90% para fraudes. A taxa de falsos positivos e falsos negativos ficou em 4% e 10%, respectivamente. O desempenho para detecção de fraudes e falsos negativos é pior que o modelo de regressão logística, que obteve 96% de acertos para transações fraudulentas.

Avaliando as métricas, obtemos:

  • Acurácia: 96,3%
  • AUC: 93,0%

Ou seja, apesar de ter mais acurácia que o modelo de regressão logística, a AUC mostra que a árvore é menos capaz de distinguir entre as classes, resultando numa taxa de erros maior para falsos negativos.

No contexto do problema de negócio que queremos solucionar, isto poderia reduzir as incidência de fraude, porém teríamos ainda 10% dos casos não sendo detectados, causando perdas aos clientes.

Avaliando os modelos no conjunto de testes

Agora que temos os dois modelos construídos e validados, podemos testá-los com novas observações, utilizando o conjunto de teste reservado desde o início do projeto.

Este conjunto passou pelos mesmos procedimentos de padronização das variáveis, de modo que os dados sejam coerentes. Além disso, os dados foram divididos da mesma forma entre a matriz de atributos (feature matrix) e a variável-alvo.

Para relembrar, o conjunto de teste representa 20% do conjunto original, com 57 mil novas observações para o modelo. A Figura 1.17 mostra as matrizes de confusão resultantes da implementação dos modelos sobre os dados novos.

Figura 1.17 — Matriz de confusão para os modelos de regressão linear (à esquerda) e árvore de decisão (à direita) sobre os dados de teste.

Fica claro que o modelo de regressão logística obteve maior sucesso, com uma taxa de acertos de 96% para transações normais e de 95% para fraudes. A taxa de falsos positivos e falsos negativos se mantiveram baixas, em 4% e 5% respectivamente.

A árvore de decisão obteve a mesma proporção de acertos para transações normais, de 96%. Porém, a taxa de falsos negativos aumentou para 11% nos dados de teste, e a detecção de fraudes foi acertada em 89% dos casos.

Avaliando as métricas de desempenho, obtivemos:

Regressão logística

  • Acurácia: 95,8%
  • AUC: 95,4%
  • Log Loss: 16,1%

Árvore de decisão

  • Acurácia: 96,4%
  • AUC: 92,8%

Através dessas métricas, fica claro que o primeiro modelo tem uma capacidade maior de especificar as classes e determinar corretamente se uma nova transação é fraude ou não, a partir dos padrões dos dados.

Apesar de haver maior acurácia na árvore de decisão, a AUC aponta para essa incapacidade de distinguir entre as classes, que se reflete na taxa de erros maior observada para esse modelo.

Conclusão

Neste projeto, avaliamos os dados de transações em cartões de crédito visando construir modelos de classificação capazes de detectar fraudes. Os modelos de regressão logística e árvore de classificação foram construídos a partir dos dados de treino e validados.

Em seguida, foram testados com novas observações, que correspondiam a 20% do conjunto de dados original. Com isso, fomos capazes de comparar os desempenhos de cada modelo, segundo métricas como matriz de confusão, acurácia, AUC e perda logística. Como resultado dessas análises, pudemos constatar a eficácia do modelo de regressão logística sobre o de árvore de decisão, uma vez que fomos capazes de ter maior taxa de acertos, minimizando a taxa de falsos positivos e negativos no primeiro.

Obrigado pela leitura!

Me acompanhe nas redes para mais artigos, insights e projetos.

--

--