--
Com o avanço do acesso a Internet e a popularização dos smartphones, cada vez mais as pessoas utilizam seus cartões de crédito para realizar compras em lojas online, aplicativos e afins.
Em um cenário como este, é de se esperar que, infelizmente, algumas pessoas mal-intencionadas busquem meios para fraudar cartões de crédito e realizar compras no nome - e com o dinheiro - de outras pessoas.
Para evitar que clientes sejam cobrados por compras que não foram feitas por eles, é muito importante que bancos e empresas de cartão de crédito sejam capazes de reconhecer quando determinada transação é fruto de fraude ou não.
Neste projeto, utilizarei algoritmos de machine learning para treinar um modelo preditivo que seja capaz de aprender e detectar quando uma transação for fraudulenta ou não. Utilizarei os classificadores Decision Tree, Random Forest, Ada Boost e Gradient Boosting da biblioteca Scikit-Learn para identificar qual dentre estes quatro algoritmos se encaixa melhor em nosso conjunto de dados e produz os melhores resultados de acordo com as métricas de avaliação dos modelos.
Para desenvolver nosso modelo preditivo, utilizei Scikit-Learn, biblioteca open-source de machine learning para Python, e testei o funcionamento dos algoritmos de classificação Random Forest,Decision Tree, Ada Boost e Gradient Boosting para observar qual dos dois atingiria a melhor performance diante de nosso conjunto de dados, observando as métricas de avaliação de classificação, como o recall, precision, f1 score, matriz de confusão,etc...
Também utilizei pandas, numpy, matplotlib, seaborn e plotly para explorar, manipular e visualizar características relevantes do dataset.
O conjunto de dados utilizado foi o Credit Card Fraud Detection postado no Kaggle e que contém transações de cartões de crédito realizadas em Setembro de 2013 por clientes europeus durante dois dias. O dataset possui as variáveis time, que registra os segundos que se passaram entre cada transação e a primeira transação do dataset, enquanto amount registra o valor em Euros da transação e, por fim, a variável class, que registra se aquela transação é fraudulenta ou não, onde 1 = fraude e 0 = genuína. As variáveis V1,V2,V3...V28 sofreram transformações de análise de componentes principais e não tiveram seu conteúdo informado, devida a alta confidencialidade de suas informações.
Durante o desenvolvimento, utilizamos métodos do Sklearn, como o StandardScaler, para alterar a escala de valores das transações, evitando que a discrepância de valores nesta variável afetasse a performance de nosso modelo, e o SMOTE da biblioteca imblearn para lidar com o desbalanceamento dos dados de transações genuínas e fraudulentas.
Para auxiliar no entendimento de como os algoritmos performaram diante do dataset utilizado, é preciso entender como funcionam as métricas de avaliação dos modelos que utilizamos.
Uma forma muito simples de visualizar a performance do modelo é a matriz de confusão, organizada da seguinte forma:
A matriz de confusão consegue nos mostrar as classificações corretas e incorretas de cada classe e nos indica se o modelo está favorecendo uma classe em detrimento da outra ou não.
Além da matriz de confusão, temos as seguintes métricas de avaliação do modelo:
Nos diz o quanto o modelo classificou corretamente, independente da classe dos exemplos. É definida pela seguinte fórmula:
Onde: TP = Verdadeiro Positivo;
TN = Verdadeiro Negativo;
FP = Falso Positivo e
FN = Falso Negativo.
É a razão entre o número de exemplos positivos classificados corretamente e o total de exemplos classificados como positivos, incluindo os falsos positivos, e busca responder qual a proporção de classificações positivas foi realmente correta. É definida pela seguinte fórmula:
Pode ser definida como a taxa de verdadeiro positivo e busca responder o quão bem o modelo prevê a classe que queremos prever. É definida pela seguinte fórmula:
O F1 Score é o balanço entre a precisão e o recall e é definida pela seguinte fórmula:
Quando trabalhamos com um modelo de machine learning, devemos sempre saber de fato o que é que queremos extrair daquele modelo e qual resultado queremos atingir.
Neste projeto, nosso objetivo era criar um modelo que fosse capaz de detectar transações fraudulentas quando elas ocorressem e o modelo que melhor performou esta tarefa foi o Ada Boost, com um recall de 90,60%, corretamente identificando 145 transações fraudulentas em um conjunto de dados que tinha 160 destas transações. Entretanto, é possível perceber que o Ada Boost também identificou, dentre os demais algoritmos, o maior número de falsos positivos, ou seja, 1.307 transações genuínas (cerca de 1,53% do total de transações genuínas) foram incorretamente identificadas como sendo fruto de fraude.
Uma transação genuína sendo classificada como fraude pode impactar em problemas ao cliente!
Neste cenário, é importante entender o modelo de negócio e fazer alguns questionamentos, como:
- O quão caro nos custariam os falsos positivos?
- Devemos manter o algoritmo Ada Boost, que teve a melhor performance de identificação de transações fraudulentas, enquanto também teve diversos falsos positivos, ou mudamos para o Random Forest, que também atingiu boas métricas de performance (recall de 83,12%) e classificou apenas 0,02% das transações genuínas como fraudulentas? Mas isto também implicaria em um número maior de fraudes que não seriam identificadas...
Essas questões, junto com um bom entendimento do negócio e de como queremos abordar as soluções de machine learning para lidarmos com problemas são fundamentais para ajudar no processo de tomada de decisão para escolhermos se estamos dispostos ou não a lidar com um número maior de falsos positivos se isso resultar em um modelo capaz de identificar o maior número de fraudes possível.
Para acessar este projeto em Inglês no Kaggle, clique aqui.
To see this project in English on Kaggle, click here.
Entendendo o que é Matriz de Confusão com Python
Métricas de Avaliação em Machine Learning: Classificação
Luís Fernando Torres