Entender que la precisión no lo es todo. Aprender a elegir, calcular e interpretar métricas apropiadas basadas en el problema—especialmente en contextos desbalanceados como la detección de fraude.
Imagina un conjunto de datos de fraude:
Un modelo que siempre predice "NO FRAUDE" tendrá 99% de precisión... ¡pero es inútil! Detecta CERO fraudes.
La matriz de confusión muestra:
from sklearn.metrics import confusion_matrix
import seaborn as sns
y_pred = modelo.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['Legítimo', 'Fraude'],
yticklabels=['Legítimo', 'Fraude'])
plt.title("Matriz de Confusión")
plt.ylabel("Real")
plt.xlabel("Predicho")
plt.show()
De todas las transacciones que marqué como fraude, ¿cuántas eran realmente fraude?
Precisión = TP / (TP + FP)
✅ Importante cuando el costo de falsos positivos es alto (ej., bloquear una tarjeta legítima).
De todos los fraudes reales, ¿cuántos detecté?
Exhaustividad = TP / (TP + FN)
✅ CRÍTICA en detección de fraude. Quieres minimizar FN (fraudes no detectados).
Media armónica de precisión y exhaustividad. Útil cuando buscas equilibrio.
F1 = 2 * (Precisión * Exhaustividad) / (Precisión + Exhaustividad)
from sklearn.metrics import precision_score, recall_score, f1_score
print("Precisión:", precision_score(y_test, y_pred))
print("Exhaustividad: ", recall_score(y_test, y_pred))
print("Puntuación F1: ", f1_score(y_test, y_pred))
La curva ROC muestra el equilibrio entre Tasa de Verdaderos Positivos (Exhaustividad) y Tasa de Falsos Positivos en varios umbrales de decisión.
AUC (Área Bajo la Curva) es un número entre 0 y 1:
from sklearn.metrics import roc_auc_score, roc_curve
y_proba = modelo.predict_proba(X_test)[:, 1] # probabilidad de clase positiva
auc = roc_auc_score(y_test, y_proba)
print("AUC-ROC:", auc)
# Graficar curva
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
plt.plot(fpr, tpr, label=f'Curva ROC (AUC = {auc:.2f})')
plt.plot([0,1], [0,1], 'k--', label='Clasificador Aleatorio')
plt.xlabel('Tasa de Falsos Positivos')
plt.ylabel('Tasa de Verdaderos Positivos')
plt.title('Curva ROC')
plt.legend()
plt.grid()
plt.show()
✅ Ventaja de AUC: Invariante al desbalance de clases. Perfecto para fraude.
Scikit-learn proporciona un resumen profesional:
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred,
target_names=['Legítimo', 'Fraude']))
Salida típica:
precision recall f1-score support
Legítimo 0.99 1.00 0.99 19800
Fraude 0.85 0.50 0.63 200
accuracy 0.99 20000
macro avg 0.92 0.75 0.81 20000
weighted avg 0.99 0.99 0.99 20000
Conjunto de datos: fraud_preprocessed.csv (preprocesado del módulo anterior)
Tareas:
predict_proba y un umbral de 0.3.precision_recall_curve para graficar el equilibrio precisión-exhaustividad (útil cuando los negativos son la mayoría).