Detectando Fraudes Financeiras com Machine Learning
Como construir um modelo de detecção de fraudes usando Python, Scikit-learn e técnicas de balanceamento de classes.
Detecção de fraudes é um dos problemas clássicos de machine learning com impacto real e imediato. Neste artigo, vou mostrar como construir um pipeline completo — da exploração dos dados até a avaliação do modelo em produção.
O Problema
Datasets de fraude são naturalmente desbalanceados: transações fraudulentas representam menos de 1% do total. Isso cria um desafio: um modelo que prevê “não fraude” para tudo acerta 99% das vezes, mas é completamente inútil.
Dataset
Usaremos o Credit Card Fraud Detection do Kaggle — 284.807 transações, com apenas 492 fraudes (0,17%).
Pipeline
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import classification_report, roc_auc_score
from imblearn.over_sampling import SMOTE
df = pd.read_csv('creditcard.csv')
X = df.drop('Class', axis=1)
y = df['Class']
# Balanceamento com SMOTE
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X, y)
# Treinamento
model = RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1)
model.fit(X_res, y_res)
Métricas que Importam
Para problemas desbalanceados, acurácia é enganosa. Prefira:
- Precision / Recall: quantas fraudes detectadas são realmente fraude? Quantas fraudes você perdeu?
- F1-Score: média harmônica entre precision e recall
- AUC-ROC: capacidade geral de discriminação do modelo
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred, target_names=['Legítima', 'Fraude']))
Técnicas de Balanceamento
| Técnica | Quando usar |
|---|---|
| SMOTE | Oversampling sintético — bom ponto de partida |
| ADASYN | Foca nos exemplos mais difíceis |
| Undersampling | Dados abundantes, risco de perder padrões |
| Pesos de classe | Simples, direto, sem gerar dados sintéticos |
Resultados
Com Random Forest + SMOTE, conseguimos:
- Precision (Fraude): 94%
- Recall (Fraude): 91%
- AUC-ROC: 0.987
Próximos Passos
Para produção, considere:
- Monitoramento de drift — o comportamento de fraudes muda com o tempo
- Threshold tuning — ajuste o ponto de corte conforme o custo de cada tipo de erro
- Explicabilidade — use SHAP para entender por que o modelo marcou uma transação como fraude
O código completo está disponível no meu GitHub. Qualquer dúvida, manda mensagem!