Introducción
La evaluación precisa de los modelos de clasificación supervisada es un pilar fundamental del Machine Learning. Estos modelos, diseñados para predecir categorías (spam/no spam, fraude/no fraude, enfermo/sano), requieren métricas específicas que capturen no solo el porcentaje de aciertos, sino también aspectos críticos como el equilibrio entre errores de tipo I y tipo II.
Un detalle crucial: ninguna métrica de rendimiento funciona de manera aislada. Una combinación equilibrada y una comprensión integral de múltiples métricas son esenciales para evaluar con precisión los modelos de clasificación.
Tema 1: La Matriz de Confusión
1.1. ¿Qué es la Matriz de Confusión?
La matriz de confusión es una tabla que permite visualizar y entender cómo un modelo de clasificación ha realizado sus predicciones y dónde ha cometido errores. Compara las etiquetas reales de los datos (valores verdaderos) con las predicciones realizadas por el modelo (valores predichos).
Clasificación binaria (2 clases)
En el caso más simple, la matriz de confusión tiene 4 componentes:
| Predicción: Positivo | Predicción: Negativo | |
|---|---|---|
| Real: Positivo | TP (Verdadero Positivo) | FN (Falso Negativo) |
| Real: Negativo | FP (Falso Positivo) | TN (Verdadero Negativo) |
- TP (Verdaderos Positivos): Casos donde el modelo predijo correctamente la clase positiva.
- FP (Falsos Positivos): Casos donde el modelo predijo incorrectamente la clase positiva (en realidad es negativa). Error tipo I.
- TN (Verdaderos Negativos): Casos donde el modelo predijo correctamente la clase negativa.
- FN (Falsos Negativos): Casos donde el modelo predijo incorrectamente la clase negativa (en realidad es positiva). Error tipo II.
Clasificación multiclase
Para más de dos clases, la matriz de confusión se extiende a n×n (donde n es el número de clases). La diagonal de la tabla representa las instancias correctamente identificadas.
En problemas de clasificación con múltiples clases, se puede evaluar de dos formas:
- 1-vs-1 (OvO): Mide la capacidad de discriminar entre instancias de dos clases específicas. Genera una matriz 2×2 para cada par de clases.
- 1-vs-All (OvA): Mide la capacidad de discriminar entre instancias de una clase vs todas las demás. También genera matrices 2×2.
Tema 2: Métricas de Clasificación
2.1. Tabla de Métricas Principales
| Métrica | Abrev. | Definición | Fórmula |
|---|---|---|---|
| Error del Modelo | ERR | Suma de predicciones incorrectas sobre el total | (FP + FN) / (FP + FN + TP + TN) |
| Accuracy | ACC | Número de predicciones correctas sobre el total | (TP + TN) / (FP + FN + TP + TN) = 1 − ERR |
| Precisión | PRE / PPV | Proporción de predicciones positivas correctas | TP / (TP + FP) |
| Recall / Sensibilidad | REC / SEN | Proporción de casos positivos reales correctamente identificados | TP / (FN + TP) |
| Especificidad | SPE / ESP | Proporción de verdaderos negativos sobre el total de negativos reales | TN / (TN + FP) = 1 − FPR |
| F1 Score | F1 | Media armónica de Precisión y Recall; equilibrio entre ambas | 2 × (PRE × REC) / (PRE + REC) |
| Tasa de Verdaderos Positivos | TPR | Igual que Recall; muy relacionada con la curva ROC | TP / (FN + TP) |
| Tasa de Falsos Positivos | FPR | Proporción de negativos reales incorrectamente clasificados como positivos | FP / (FP + TN) |
2.2. Interpretación práctica de cada métrica
Accuracy
Métrica más intuitiva pero peligrosa con clases desbalanceadas. Un modelo que siempre predice "no fraude" obtiene 99.83% accuracy en el dataset de tarjetas de crédito, pero detecta 0 fraudes.
Precisión
Responde a: "De todos los casos que el modelo predijo como positivos, ¿cuántos son realmente positivos?" Importante cuando el coste de un falso positivo es alto (e.g., marcar correos legítimos como spam).
Recall (Sensibilidad)
Responde a: "De todos los casos positivos reales, ¿cuántos detectó el modelo?" Crucial cuando el coste de un falso negativo es alto (e.g., no detectar una enfermedad grave, no detectar un fraude).
F1 Score
Equilibrio entre Precisión y Recall. Ideal cuando ambos tipos de error tienen importancia similar y las clases están desbalanceadas. Un F1 bajo indica que el modelo falla en uno o en ambos aspectos.
Tema 3: Limitaciones y Consideraciones
3.1. Desbalance de Clases
El desbalance de clases ocurre cuando las proporciones de clases en el dataset no están igualmente representadas. Un modelo entrenado con datos desequilibrados tiende a predecir mejor la clase mayoritaria, ignorando la minoritaria.
Recomendaciones para datasets desbalanceados:
- Evitar Accuracy ya que puede ser engañosa
- Usar Recall, Precisión y F1-Score: El recall es crucial para identificar instancias de la clase minoritaria
- Considerar AUC-ROC: Insensible al desbalance de clases y proporciona una medida del rendimiento a diferentes umbrales
- Técnicas de rebalanceo: SMOTE (sobremuestreo), NearMiss (submuestreo), ajuste de class_weight
3.2. Sesgo de Confirmación y Sobreajuste
El sesgo de confirmación se refiere al sobreajuste: el modelo aprende los detalles y ruido de los datos de entrenamiento en lugar de las tendencias generales. Las métricas comunes como la precisión y el F1-score pueden indicar alto rendimiento en entrenamiento, ocultando la incapacidad del modelo para generalizar.
Para mitigar este riesgo: usar validación cruzada robusta y evaluar siempre sobre datos no vistos.
3.3. Elección de Métricas Basada en el Contexto
No existe una "talla única" en métricas de rendimiento. La elección debe adaptarse al problema:
- Diagnóstico médico: Recall alto (minimizar falsos negativos — no perder casos positivos)
- Detección de spam: Precisión alta (no marcar correos legítimos como spam)
- Detección de fraude: F1 y AUC-ROC (equilibrio entre detectar fraudes y no generar falsas alarmas)
- Marketing dirigido: Precisión (maximizar relevancia de los impactos positivos)
Tema 4: AUC-ROC y Curvas de Análisis
4.1. La Curva ROC (Receiver Operating Characteristic)
La curva ROC es una gráfica que muestra la relación entre la Tasa de Verdaderos Positivos (TPR) y la Tasa de Falsos Positivos (FPR) a varios umbrales de decisión. Proporciona una visión clara de cómo el modelo equilibra la detección de casos positivos (sensibilidad) con la evitación de falsos positivos.
4.2. AUC (Área Bajo la Curva)
El AUC es una medida cuantitativa que resume la información de la curva ROC:
- AUC = 1.0: Modelo perfecto (separa perfectamente las clases)
- AUC = 0.5: Modelo aleatorio (no mejor que el azar — curva diagonal)
- AUC > 0.7: Modelo aceptable
- AUC > 0.9: Modelo excelente
El AUC es especialmente valioso porque es insensible al desbalance de clases y permite comparar modelos independientemente del umbral de decisión elegido.
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt
# Calcular AUC-ROC
y_prob = clf.predict_proba(X_test)[:, 1]
auc = roc_auc_score(y_test, y_prob)
print(f"AUC-ROC: {auc:.4f}")
# Trazar curva ROC
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr, label=f'ROC (AUC = {auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--', label='Aleatorio')
plt.xlabel('Tasa de Falsos Positivos')
plt.ylabel('Tasa de Verdaderos Positivos')
plt.title('Curva ROC')
plt.legend()
plt.show()4.3. Curva de Ganancia y Curva Lift
Dos herramientas analíticas utilizadas principalmente en marketing y negocios:
- Curva de Ganancia: Muestra el porcentaje de casos positivos totales capturados al considerar diferentes proporciones de la población.
Ejemplo en marketing: podría mostrar cuántos clientes respondieron a una campaña en función de diferentes segmentos de la base de clientes. - Curva Lift: Mide cuánto mejor es el modelo comparado con una selección aleatoria. Un Lift de 3 en el primer decil significa que el modelo es 3 veces mejor que seleccionar aleatoriamente.
A diferencia de la curva ROC (que compara modelos), las curvas de Ganancia y Lift se usan para explotar el modelo en producción, determinando qué proporción de la población contactar para maximizar el retorno.
Resumen de Métricas y Casos de Uso
from sklearn.metrics import (
accuracy_score, precision_score, recall_score,
f1_score, roc_auc_score, classification_report,
confusion_matrix
)
# Evaluación completa
y_pred = clf.predict(X_test)
y_prob = clf.predict_proba(X_test)[:, 1]
print("Accuracy: ", accuracy_score(y_test, y_pred))
print("Precisión: ", precision_score(y_test, y_pred))
print("Recall: ", recall_score(y_test, y_pred))
print("F1-Score: ", f1_score(y_test, y_pred))
print("AUC-ROC: ", roc_auc_score(y_test, y_prob))
print()
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))