Desenvolvimento de modelo de Machine Learning para detecção de fraudes em cartões.
Autor
Luiz Felipe P. Figueiredo
Data de Publicação
03/12/2023
Objetivo
Este projeto tem como objetivo, desenvolver um modelo de aprendizado de maquina a fim de detectar transações fraudulentas envolvendo cartões de crédito. Isso será alcançado por meio da exploração e aplicação de vários algoritmos de aprendizado de máquina, seguidos pela avaliação e comparação de métricas de desempenho com o objetivo de selecionar o modelo mais eficaz.
Descrição dos Dados
Os dados que serão utilizado neste projeto, foram retirados do kaggle. Trata-se de uma base de dados que contém transações feitas por cartões de créditos europeus em setembro de 2013. Além disso a base de dados contém 28 variáveis ou colunas que foram anonimizadas a fim de proteger a sigilosidade dos dados em questão.
Descrição das variáveis
Time - Segundos que se passaram entre cada transação e a primeira transação no dataset;
V1 a V28 - Variáveis anonimizadas devido a confidencialidade dos dados, essa variáveis foram transformadas utilizando Análise de Componentes Principais;
Amount - Valor de cada transação;
Class - Variável resposta, onde 1 equivale a uma compra fraudulenta e 0 com não fraudulenta.
Código
# bibliotecas utilizadasimport numpy as npimport pandas as pdimport plotly.io as piopio.renderers.default ="notebook_connected"import plotly.colors as colorsimport plotly.express as pximport plotly.graph_objects as gofrom plotly.subplots import make_subplotsfrom sklearn.preprocessing import RobustScalerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, average_precision_score, roc_curve, precision_recall_curvefrom sklearn.linear_model import LogisticRegressiontry:from imblearn.over_sampling import SMOTEexceptException: SMOTE =None
Verificação dos Dados
Código
# preview do datasetdf = pd.read_csv("C:/Users/luisf/Desktop/DATACAMP/Portfolio/datasets/credit_card_fraud/creditcard.csv")df.head()
Time
V1
V2
V3
V4
V5
V6
V7
V8
V9
...
V21
V22
V23
V24
V25
V26
V27
V28
Amount
Class
0
0.0
-1.359807
-0.072781
2.536347
1.378155
-0.338321
0.462388
0.239599
0.098698
0.363787
...
-0.018307
0.277838
-0.110474
0.066928
0.128539
-0.189115
0.133558
-0.021053
149.62
0
1
0.0
1.191857
0.266151
0.166480
0.448154
0.060018
-0.082361
-0.078803
0.085102
-0.255425
...
-0.225775
-0.638672
0.101288
-0.339846
0.167170
0.125895
-0.008983
0.014724
2.69
0
2
1.0
-1.358354
-1.340163
1.773209
0.379780
-0.503198
1.800499
0.791461
0.247676
-1.514654
...
0.247998
0.771679
0.909412
-0.689281
-0.327642
-0.139097
-0.055353
-0.059752
378.66
0
3
1.0
-0.966272
-0.185226
1.792993
-0.863291
-0.010309
1.247203
0.237609
0.377436
-1.387024
...
-0.108300
0.005274
-0.190321
-1.175575
0.647376
-0.221929
0.062723
0.061458
123.50
0
4
2.0
-1.158233
0.877737
1.548718
0.403034
-0.407193
0.095921
0.592941
-0.270533
0.817739
...
-0.009431
0.798278
-0.137458
0.141267
-0.206010
0.502292
0.219422
0.215153
69.99
0
5 rows × 31 columns
Verificação de Valores Faltantes e dados desbalanceados.
Código
# Verificação de valores faltantesn_valores_faltantes =int(df[df.columns[df.isnull().any()]].isnull().sum().sum())print(f'Existe um total de {n_valores_faltantes} valores faltantes nesta base de dados')
Existe um total de 0 valores faltantes nesta base de dados
Acima, pode-se se verificar que não existem valores faltantes neste dataset, além disso, estes dados são extremamente desbalanceados, a variável resposta Class contem 284.315 compras legitimas e somente 492 compras fraudulentas, deste modo, será necessário implementar técnicas para tratar este desbalanceamento, pois, implementar um modelo de aprendizado de maquina seria um problema e com certeza geraria um modelo com desempenho ruim.
Tratamento De Dados
Como as variáveis Time e Amount não foram dimensionadas, é preciso realizar a transformação dessas variáveis, utilizando o sklearn.preprocessing.RobustScaler já que esse “scaler” é robusto para outliers [1].
Código
# Dimensionamento das variáveis Time e Amountrobust_scaler = RobustScaler()features_df = df.copy()features_df[['Scaled_Amount', 'Scaled_Time']] = robust_scaler.fit_transform(df[['Amount', 'Time']])features_df = features_df.drop(['Amount', 'Time'], axis=1)
Código
# Definição de variáveis preditoras (X) e alvo (y)X = features_df.drop('Class', axis=1)y = features_df['Class']
Código
# Divisão treino/teste estratificadaX_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.20, random_state=42, stratify=y)# Balanceamento com SMOTE (apenas nos dados de treino)if SMOTE isNone:raiseImportError("imblearn não está instalado. Instale com: pip install imbalanced-learn")smote = SMOTE(random_state=42)X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
---------------------------------------------------------------------------ImportError Traceback (most recent call last)
Cell In[7], line 8 6# Balanceamento com SMOTE (apenas nos dados de treino) 7if SMOTE isNone:
----> 8raiseImportError("imblearn não está instalado. Instale com: pip install imbalanced-learn")
9 smote = SMOTE(random_state=42)
10 X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
ImportError: imblearn não está instalado. Instale com: pip install imbalanced-learn
Tratando dados desbalanceados
Utilizamos SMOTE (Synthetic Minority Over-sampling Technique) para gerar amostras sintéticas da classe minoritária (Class = 1, Fraude) apenas no conjunto de treino, evitando vazamento de informação. Isso ajuda os modelos a aprender melhor os padrões raros de fraude [2,3].
# Reestruturando os dados para o formato "long" para usar com Plotly Expressteste_melted = teste.melt(id_vars=["ANO ", "LOJA"], var_name="Mês", value_name="Vendas")# Criando o gráfico de linhas com Plotly Expressfig = px.line(teste_melted[teste_melted['ANO ']==2018], x="Mês", y="Vendas", color="LOJA", title='Vendas Mensais por Loja', markers=True)# Mostrando o gráficofig.show()
Código
help(pd.melt)
ADASYN TOMEK Links SMOTE Under e Oversampling
Hibridos
Código
240-200
40
Código
40/20
2.0
Modelagem
Treinaremos uma Regressão Logística com regularização padrão como baseline, avaliando em dados de teste originais (não balanceados) e reportando métricas apropriadas para classes desbalanceadas (ROC-AUC e PR-AUC).