• João Ataide

Detecção de fraudes em cartões de crédito


 

Uma das principais preocupações das instituições financeiras são as fraudes em cartão de crédito. No Brasil, certa de 12 milhões de pessoas já foram vítimas de fraude chegando a ultrapassar a casa dos R$ 1,8 bilhões de reais somente no ano de 2019.


No entanto, a não detecção das fraudes não devem ser somente uma preocupação para as instituições financeiras, pois este problema poderá acarretar um grande prejuízo atingindo as outras áreas financeiras e até os consumidores. Devido a isso, enumeras técnicas são atribuídas para efetuar essas detecções, ocorrendo preocupações a exemplo dos falsos positivos, os quais constrangem inúmeros usuários devido recusa e bloqueio do cartão quando efetuamos uma compra.


Existe um investimento crescente em aplicações de Inteligência Artificial, 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. Assim, como prática do curso Data Science da Prática do Carlos Melo, ficamos com o desafio de aprimorar cada vez mais o uso de algoritmos visando inibir ou evitar transações fraudulentas. Por se tratar de um desafio, o Carlos já nos disponibilizou os dados organizados e sem variáveis categóricas, com o intuito de destinar o presente trabalho para construir o melhor modelo possível.


Os dados aqui em questão foram disponibilizados por algumas empresas europeias de cartão de crédito, este representa as operações financeiras que aconteceram no período de dois dias , onde foram detectados 290 mil transações.


Uma boa coisa desses conjuntos é que suas features são todas numéricas, descaracterizadas (com a finalidade de assegurar os usuários). Assim, cada uma das colunas são representadas por V1, V2 ... V28, as outras camadas representam, o seguinte:

  • Time Número de segundos decorridos entre esta transação e a primeira transação no conjunto de dados;

  • Amount - Valor da transação;

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


Como podemos constatar nas cinco primeiras e últimas entradas.


Primeiras entradas

Últimas entradas


Os dados originais podem ser encontrados no Kaggle e estes sofrem transformações conhecidas como Análise de Componentes Principais (Principal Component Analysis - PCA). Essa técnica 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, estes que são um número menor ou igual às variáveis originais.


Com os dados importados para dentro de uma estrutura DataFrame e não havendo a necessidade de mais nenhum ajuste ou configuração nesta etapa, pude então ir direto a análise exploratória dos dados e por fim a montagem do modelo Machine Learning.


Iniciei então pelas análises das estatísticas básicas. Sendo esse uma parte importante do trabalho, onde veremos quais distribuições balanceamento de cada camada.


Entretanto, por se tratar de um dataset grande, a estatística básica não representa muita informação, a não ser que os dados em questão apresentam distribuições desbalanceadas, distribuições as quais veremos mais a frente.


Antes disso, o próximo passo verificou da qualidade do dataset, sendo essa um métrica importante, a qual indicará se podemos dar continuidade no projeto. Ao fazer o cálculo dos dados ausente, estes apresentaram-se inexistentes.


Então dei inicio a avaliação do balanceamento, os quais representam respectivamente 0 (Não Fraudulentos) 284315 e 1 (Fraudulentos) 492, foi possível notar que tanto graficamente quando percentualmente, que a quantidade de transações fraudulentas é muito menor que a normal, sendo de somente 0.17% de todo o dataset.


Em seguida criei os histogramas das duas camadas com escalas diferentes, em relação ao Time e as Classe dos dados.


Entretanto, não foi possível identificar nenhuma informação a partir das duas distribuições de frequência. Então, realizei os histogramas das classes em relação a Amount.


Para os dados em questão, a distribuição dos histogramas representam um desbalanceamento e uma presença grande de possíveis *outliers*. Assim, teremos de valiar estes pelo boxplot para realizar uma análise mais a fundo.

O box plot apresentou diversos outliers bloxplot e claramente um desbalanceamento muito alto, mostrando-se a sua média exata em 118,13 e mediana 9,21.


Realizado a avaliação do balanceamento, foi possível calcular a correlação, para este cálculo plotei um matriz de correlação, ocultando os cálculos da diagonal superior.

#Criando uma máscara da diagonal superior
mask = np.zeros_like(df.corr())
mask[np.triu_indices_from(mask)] = True
#Plotar matriz de correlação
plt.figure(figsize=(10,6))plt.title("Matriz de Correlação")sns.heatmap(df.corr(),mask=mask,cmap='Blues')plt.show()

A matriz em questão, mostrou-se pouca relação entre os dados causado pelo desbalanceamento destes.


Para alimentar o modelo de Regressão Logística que construiremos, nesta etapa de preparação iremos:

  • Padronizar as features Time e Amount, que estão em outra ordem de grandeza.

  • Dividir entre dados de treino e teste.

  • Balancear os dados de modo a evitar uma baixa desempenho para a classe 1 e overfitting.

Primeiro realizei a normalização dos dados, como já utilizei anteriormente aqui no blog link. Técnica que iguala a escala de todos os dado do modelo, neste caso utilizei o StandardScaler da biblioteca scikit learn.


#Nomalizar os dados
standert=StandardScaler()X.Time=standert.fit_transform(X.Time.values.reshape(-1,1))X.Amount=standert.fit_transform(X.Amount.values.reshape(-1,1))

Depois disso, realizei a divisão das bases de treino e teste e desta forma foi possível realizar o balanceamento dos dados utilizando o algorítimo RandomUnderSampler da biblioteca imblearn, ficando então com 369 entradas para cada classe.


#Balancear os dados
rUS = RandomUnderSampler()
X_rus, y_rus = rUS.fit_sample(X_train, y_train)

Após o balanceamento calculei a correlação novamente, onde se apresentou bem superior após o balanceamento, mostrando a importância do balanceamento dos dados na construção de um bom modelo.

#Criando uma mascara da diagonal superior
mask = np.zeros_like(X_new_df.corr())
mask[np.triu_indices_from(mask)] = True
#Plotar matriz de correlação
plt.figure(figsize = (10,6))
plt.title("Matriz de Correlação Balanceada")

sns.heatmap(X_new_df.corr(), mask= mask, cmap = 'Blues')
plt.show()


Com tudo pronto e uma boa análise exploratória realizada, facilmente podemos construir o modelo de Regressão Logística. Esse modelo de regressão utiliza-se do conceito de verossimilhança, este recurso permite estimar a probabilidade associada à ocorrência de determinados eventos em face de um conjunto de variáveis exploratórias.


#Construir modelo de regressão logistica
model = LogisticRegression()
model.fit(X_rus, y_rus)

Com modelo treinado e previsões efetuadas, pude então analisar o desempenho. Entretanto, para esse tipo de situação onde os dados estão desbalanceados não podemos utilizar a acurácia como métrica. Assim, será necessário criar uma matriz de confusão e o relatório de classificação.


Conseguimos obter resultados bem interessantes, com poucos falsos negativos e falsos positivos, tendo 96% para o verdadeiros negativos e 86% de verdadeiros positivos.


Note que esse projeto aqui não se trata de um problema comum, mesmo este estar sendo feito com dados limpos e bem tratados, disponibilizado pelo professor do curso, foi necessário realizar o balanceamento e normalização dos dados e a PAC, para então construir esse modelo, podendo então obter excelentes resultados para o objetivo em questão. No entanto, este projeto se trata de um projeto didático, o qual não possuía variáveis categóricas nem dados ausentes. Ficando então o gap para realizar a construção como todo o dataset do kaggle, você pode observar o projeto completo e todos os códigos no meu repositório.


Se gostou compartilhar ;)