Blog
DATA SCIENCE
06
Mai
2019
DETECTANDO FRAUDE EM CARTÕES DE CRÉDITO COM PYTHON

DETECTANDO FRAUDE EM CARTÕES DE CRÉDITO COM PYTHON

Um problema importantíssimo que Varejistas e outros negócios enfrentam hoje em dia é relacionado a fraudes no cartão de crédito. Inclusive eu mesmo já tendo sido vítima.

Podemos aplicar Machine Learning para ajudar a detectar fraudes com cartão de crédito, mas há um pequeno problema em que a grande maioria das transações é perfeitamente legítima, o que reduz a sensibilidade de um modelo típico a fraudes.

Como exemplo, considere um algoritmo logístico em execução no conjunto de dados Fraude de Cartão de Crédito publicado no Kaggle. Você pode baixá-lo aqui:

https://www.kaggle.com/mlg-ulb/creditcardfraud

Os conjuntos de dados contêm transações efetuadas por cartões de crédito em setembro de 2013 por portadores de cartões europeus. Este conjunto de dados apresenta transações que ocorreram em dois dias, onde temos 492 fraudes de 284.807 transações. O conjunto de dados é altamente desequilibrado, a classe positiva (fraudes) representa 0,172% de todas as transações.

Ele contém apenas variáveis numéricas de entrada que são o resultado de uma transformação do PCA. Infelizmente, devido a problemas de confidencialidade, não podemos fornecer os recursos originais e mais informações básicas sobre os dados. Os recursos V1, V2, ... V28 são os principais componentes obtidos com o PCA, os únicos recursos que não foram transformados com o PCA são 'Tempo' e 'Valor'. Recurso 'Tempo' contém os segundos decorridos entre cada transação e a primeira transação no conjunto de dados. O recurso 'Valor' é o Montante da transação, esse recurso pode ser usado para o aprendizado de custo-dependente dependente de exemplo. Recurso 'Classe' é a variável de resposta e leva valor 1 no caso de fraude e 0 caso contrário.

Para acompanhar, você precisará de uma instalação do Python com os seguintes pacotes:

Para começar, vamos começar com as importações necessárias.

image(30).png

Precisamos do NumPy para algumas funções matemáticas básicas e Pandas para ler no arquivo CSV e criar o quadro de dados. Vamos usar um número de sklearn.metrics para avaliar os resultados de nossos modelos.

Em seguida, precisamos criar algumas funções auxiliares. PrintStats irá compilar e exibir os resultados de um modelo. Aqui está o código:

image(31).png

O PrintStats toma como parâmetros uma matriz de confusão, rótulos de teste e rótulos de previsão e faz o seguinte:

  1. Separa a matriz de confusão em suas partes constituintes.
  2. Calcula as pontuações F1, Recall, Accuracy e Cohen Kappa.
  3. Imprime a matriz de confusão e todas as pontuações calculadas.

Também precisamos de uma função, chamada RunModel, para realmente treinar o modelo e gerar previsões em relação aos dados de teste. Aqui está o código:

image(32).png

A função RunModel toma como entrada o modelo não treinado junto com todos os dados de teste e treinamento, incluindo rótulos. Ele treina o modelo, executa a previsão usando os dados de teste e retorna a matriz de confusão juntamente com os rótulos previstos.

Com essas duas funções criadas, é hora de ver se podemos criar um modelo para fazer a detecção de fraudes. A detecção de fraudes é geralmente considerada um problema de duas classes. Em outras palavras, uma transação é:

Classe 1: Não Fraude

Ou

Classe 2: Fraude

Nosso objetivo é tentar determinar a qual classe uma transação específica pertence. O passo 1 é carregar os dados CSV e criar as classes. Este código irá fazer o truque:

image(33).png

image(34).png

Este é um conjunto de dados bastante típico. De quase 300.000 transações, 492 foram rotuladas como fraudulentas. Pode não parecer muito, mas cada transação representa uma despesa significativa. Juntas, todas essas transações fraudulentas podem representar bilhões de dólares de receita perdida a cada ano. Também representa um problema com a detecção. Uma porcentagem tão pequena das transações fraudulentas torna mais difícil eliminar os infratores do número esmagador de boas transações.

O passo 2 é definir os recursos que queremos usar. Normalmente, queremos aplicar alguma redução de dimensão e engenharia de recursos aos nossos dados, mas isso é outro artigo (ou dois). Em vez disso, usaremos todo o conjunto de dados aqui com o seguinte código:

image(35).png

Com o conjunto de dados definido, a etapa 3 é dividir os dados em conjuntos de treinamento e teste. Para fazer isso, precisamos importar outra função e executar o seguinte código:

image(36).png

A função train_test_split usa um randomizador para separar os dados em conjuntos de treinamento e teste. 70% dos dados são para treinamento e 30% para testes. A semente aleatória é inicialmente definida para garantir que os mesmos dados sejam usados em todas as execuções.

Para o passo 4, escolhemos uma técnica de aprendizado de máquina ou modelo. Talvez a técnica de aprendizado de máquina de duas classes mais comum seja a regressão logística. Vamos usar isso para este primeiro teste:

image(37).png

Você pode pensar inicialmente que o modelo fez um bom trabalho. Afinal, obteve 99,92% de suas previsões corretas. Isso é verdade, exceto se você olhar de perto para a matriz de confusão, você verá os seguintes resultados:

85293 transações foram classificadas como válidas que eram realmente válidas
15 transações foram classificadas como fraude que eram realmente válidas (erro tipo 1)
57 transações foram classificadas como válidas e eram fraude (erro tipo 2)
78 transações foram classificadas como fraude que eram realmente fraudes

Assim, embora a precisão fosse ótima, descobrimos que o algoritmo classificou erroneamente mais de 4 em 10 transações fraudulentas. De fato, se nosso algoritmo simplesmente classificasse tudo como válido, ele teria uma precisão melhor que 99,9%, mas seria totalmente inútil! Portanto, a precisão não é a medida confiável da eficácia de um modelo. Em vez disso, analisamos outras medidas como a pontuação de Cohen Kappa, Recall e F1. Em cada caso, queremos obter uma pontuação o mais próxima possível de 1.

Talvez outro modelo funcione. Que tal um classificador RandomForest? O código é semelhante à regressão logística:

image(38).png

Isso é um pouco melhor. Observe que a precisão aumentou ligeiramente, mas as outras pontuações também mostraram melhorias significativas. Assim, uma maneira de melhorar nossa detecção é experimentar modelos diferentes e ver como eles funcionam. Modelos claramente mutáveis ajudaram. Mas existem outras opções também. Um deles está super-amostrando a amostra de registros de fraude ou, inversamente, sub-amostrando a amostra de bons registros. Excesso de amostragem significa adicionar registros de fraude à nossa amostra de treinamento, aumentando assim a proporção geral de registros de fraude. Por outro lado, a subamostragem está removendo registros válidos da amostra, o que tem o mesmo efeito. Alterar a amostragem torna o algoritmo mais "sensível" às transações fraudulentas.

Voltando ao classificador de regressão logística, vamos ver como algumas subamostragens podem melhorar o desempenho geral do modelo. Existem técnicas específicas, como SMOTE e ADASYN, projetadas para amostrar estrategicamente conjuntos de dados desbalanceados. No nosso caso, vamos subexaminar para obter uma divisão uniforme entre fraudes e transações válidas. Isso tornará o conjunto de treinamento muito pequeno, mas o algoritmo não precisa de muitos dados para criar um bom classificador:

image(40).png

A precisão diminuiu, mas todas as outras pontuações aumentaram. Olhando para a matriz de confusão, você pode ver uma porcentagem muito maior de classificações corretas de dados fraudulentos.

Infelizmente, não há almoço grátis. Um número maior de classificações de fraude quase sempre significa um número correspondentemente maior de transações válidas, também classificadas como fraudulentas. Agora, tente o "novo" classificador de regressão logística em relação aos dados de teste originais:

image(41).png

O algoritmo foi muito melhor na captura de transações fraudulentas (57 erros de classificação para 9), mas muito pior na rotulagem incorreta de transações válidas (15 para 3559).

Como Cientista de Dados, nós poderíamos ter explorado de diversas formas mais as variáveis de entrada inclusive realizando Preprocessamentos de Dados e "Feature Engineering". É bom salientar que precisamos determinar em que ponto a troca vale a pena. Geralmente, os custos de perder uma transação fraudulenta são muitas vezes maiores do que classificar erroneamente uma boa transação como fraude. Seu trabalho é encontrar o ponto de equilíbrio no treinamento do seu modelo e proceder de acordo.

 

 

 

EVERTON DE PAULA

Comente essa publicação