El problema
Detectar transacciones fraudulentas en un flujo donde solo el 0.17% de los casos son positivos, con un costo muy asimétrico: dejar pasar un fraude cuesta mucho más que revisar de más una transacción legítima.
Los datos
El dataset público creditcard.csv (Kaggle): 284,807 transacciones con 28
componentes PCA anonimizados, monto y tiempo. 492 casos positivos.
Balanceo
SMOTE a razón 1:5 aplicado solo dentro de cada fold de entrenamiento, nunca sobre el conjunto completo, para no contaminar la validación con vecinos sintéticos de casos de prueba.
Modelo
XGBoost con búsqueda de hiperparámetros vía Optuna, optimizando recall con precisión mínima aceptable como restricción.
Evaluación
AUC-ROC 0.94 y recall 0.88 al umbral 0.5. La curva precision-recall es la que manda aquí: con 0.17% de positivos, la exactitud (accuracy) es inútil.
Despliegue
Servicio FastAPI en Docker, con el modelo serializado y validación de esquema en la entrada. 40 ms en el percentil 95.
Resultados
| Métrica | Valor |
|---|---|
| AUC-ROC | 0.94 |
| Recall | 0.88 |
| Latencia | 40 ms p95 |