Ir al contenido

Matriz de confusión, F1 y ROC

En simple: lee esto primero

Acertar «en general» no basta: hay que mirar qué tipo de errores comete el modelo, porque no todos cuestan lo mismo.

Imagínalo así

Un detector de cáncer que dice «sano» a todos acierta el 99 % si casi nadie tiene cáncer… y es inútil. Por eso contamos por separado las falsas alarmas y los casos que se escaparon.

Lo que tienes que llevarte
  • Precision: de los que marqué como positivos, ¿cuántos lo eran? (pocas falsas alarmas).
  • Recall: de los positivos reales, ¿cuántos encontré? (que no se me escape ninguno).
  • F1 combina ambos; la curva ROC muestra qué pasa al mover el umbral.
Palabras raras de esta página
matriz de confusión
tabla de aciertos y errores: verdaderos/falsos positivos y negativos.
falso positivo
falsa alarma: dije «sí» y era «no».
falso negativo
se me escapó: dije «no» y era «sí».
AUC
el área bajo la curva ROC: 1 = perfecto, 0.5 = tirar una moneda.

Más abajo viene la versión completa, con fórmulas. Si una palabra aparece subrayada con puntos, pasa el mouse (o tócala) para ver qué significa.

accuracy=predicciones correctastodas las predicciones\text{accuracy} = \frac{\text{predicciones correctas}}{\text{todas las predicciones}}

Va de 0 a 1, más alto es mejor (ojo: no es «incorrectas / total», pregunta del banco). Tamizando a 10 000 personas por una enfermedad con 1% de prevalencia, un modelo acierta 9 680: 96.8%, suena excelente. Pero trata igual todos los errores y no dice de qué tipo son.

predice 0 (negativo)predice 1 (positivo)
real 0TN (verdadero negativo)FP (falsa alarma, «gritó lobo»)
real 1FN (se escapó)TP (verdadero positivo)

La diagonal son los aciertos (TN, TP); fuera de ella, los dos tipos de error. Con «positivo = tiene la enfermedad»: FN = enfermo declarado sano (el error peligroso en un tamizaje); FP = sano marcado como enfermo.

Ejemplo de la slide (10 000 personas, 1%): TN = 9 600, FP = 300, FN = 20, TP = 80.

precision=TPTP+FP    (de los que marqueˊ, ¿cuaˊntos eran?)recall=TPTP+FN    (de los reales, ¿cuaˊntos atrapeˊ?)\text{precision} = \frac{TP}{TP+FP}\;\;\text{(de los que marqué, ¿cuántos eran?)}\qquad \text{recall} = \frac{TP}{TP+FN}\;\;\text{(de los reales, ¿cuántos atrapé?)} F1=2PRP+R(media armoˊnica)F_1 = \frac{2PR}{P+R}\quad\text{(media armónica)}

En el ejemplo: precision =80/380=0.21=80/380 = 0.21, recall =80/100=0.80=80/100 = 0.80, F1=2(0.21)(0.80)1.01=0.33F_1 = \frac{2(0.21)(0.80)}{1.01} = 0.33. La media aritmética sería 0.51; la armónica se queda cerca del menor de los dos, así que no se puede «hacer trampa» sacando uno alto y el otro bajo. Un veredicto mucho más sobrio que 96.8%.

Se intercambian: bajar el umbral atrapa más enfermos (recall ↑, FN ↓) pero sube las falsas alarmas (precision ↓).

Calculadora de métricas: elige un escenario o escribe tu matriz

10 000 personas, 1% enfermas

predice negativo
predice positivo
real negativo
TN · verdadero negativo
FP · falsa alarma
real positivo
FN · se escapó
TP · verdadero positivo
accuracy96.8%
precision21.1%
recall (sensibilidad, TPR)80.0%
especificidad (TNR)97.0%
FPR = 1 − especificidad3.0%
F10.333
accuracy balanceada88.5%
prevalencia real1.0%
prec=8080+300=0.211,rec=8080+20=0.800,F1=2PRP+R=0.333\text{prec} = \tfrac{80}{80+300} = 0.211,\quad \text{rec} = \tfrac{80}{80+20} = 0.800,\quad F_1 = \tfrac{2PR}{P+R} = 0.333
Aquí un FN (enfermo que se escapa) es lo más caro: se prioriza el recall y los positivos se confirman con una segunda prueba.
Regla para elegir: si un FN es caro (enfermedad, fraude que se escapa) ⇒ prioriza recall y baja el umbral. Si un FP es caro (bloquear a un cliente legítimo, mandar un correo importante a spam) ⇒ prioriza precision y sube el umbral. F1 equilibra ambos cuando los dos importan.
MétricaFórmulaCuándo mirarla
Especificidad (TNR)TN/(TN+FP)TN/(TN+FP)cuántos sanos se descartan bien (pareja de la sensibilidad en medicina)
FPRFP/(FP+TN)=1−FP/(FP+TN) = 1- especificidadeje x de la ROC
Accuracy balanceada(TPR+TNR)/2(\text{TPR} + \text{TNR})/2clases desbalanceadas, alternativa honesta a la accuracy
FβF_\beta(1+β2)PRβ2P+R(1+\beta^2)\frac{PR}{\beta^2P + R}β>1\beta > 1 prioriza recall; β<1\beta < 1 prioriza precision
Curva PR / APprecision vs recall al mover el umbralpositivos muy raros (fraude): más informativa que la ROC

El 0.5 es solo una elección. Moviéndolo, TPR (= recall) y FPR =FPFP+TN=\frac{FP}{FP+TN} se intercambian. La ROC grafica ese trade-off para todos los umbrales; el AUC (área bajo la curva) resume la calidad del ranking: 1.0 perfecto, 0.5 azar. ROC/AUC juzgan los scores independientemente de dónde pongas el umbral; luego eliges el punto de operación que tu aplicación necesita.

El umbral es una perilla

El modelo produce un score (p. ej. la probabilidad). Todo lo que supera el umbral se declara positivo. Las curvas están escaladas por la prevalencia: con 1% de enfermos, la campana naranja es diminuta.

-4-20246score del modelopredice + →00.20.40.60.8100.20.40.60.81FPR = FP/(FP+TN)TPR = recall
sanos (negativos)enfermos (positivos)ROC · AUC = 0.973umbral actual
predice −
predice +
real −
9,602TN
298FP · falsa alarma
real +
20FN · se escapa
80TP
accuracy96.8%
precision TP/(TP+FP)21.2%
recall TP/(TP+FN)80.0%
F1 = 2PR/(P+R)0.335
Accuracy de 96.8% pero F1 de 0.33: con clases desbalanceadas la accuracy miente. «Siempre di sano» saca 99% y recall 0.

scikit-learn breast cancer: 569 casos, 30 features; logística estandarizada, partición estratificada 75/25. Accuracy 0.958, precision 0.967, recall 0.967, F1 0.967, ROC-AUC 0.995; confusión TN = 50, FP = 3, FN = 3, TP = 87: solo 3 malignos se escaparon.

TP = 40, FP = 10, FN = 60, TN = 890. Calcula accuracy, precision, recall y F1. ¿Qué harías con el umbral si esto es un tamizaje?

Ver solución
  • Accuracy =(40+890)/1000=0.93=(40+890)/1000 = 0.93.
  • Precision =40/50=0.80=40/50 = 0.80. Recall =40/100=0.40=40/100 = 0.40.
  • F1=2(0.8)(0.4)/1.2=0.533F_1 = 2(0.8)(0.4)/1.2 = 0.533.

En un tamizaje los FN (enfermos que se escapan) son lo más caro: bajar el umbral para subir el recall, aceptando más falsas alarmas que luego se confirman con otra prueba.

Autoevaluación

0/5 correctas · 0 respondidas
1. La accuracy es el nº de predicciones incorrectas dividido entre el total.
2. Con positivo = «tiene la enfermedad», ¿qué es VERDADERO?
3. ¿Qué es VERDADERO sobre F1?
4. Un AUC de 0.5 significa…
5. Subir el umbral de decisión normalmente…
from sklearn.metrics import (confusion_matrix, classification_report,
roc_auc_score, roc_curve, precision_recall_curve,
average_precision_score)
p = clf.predict_proba(X_test)[:, 1]
y_hat = (p >= 0.5).astype(int)
tn, fp, fn, tp = confusion_matrix(y_test, y_hat).ravel() # ¡orden de sklearn!
print(classification_report(y_test, y_hat)) # precision, recall, F1 por clase
print('ROC-AUC', roc_auc_score(y_test, p), '· AP', average_precision_score(y_test, p))
# elegir el umbral en VALIDACIÓN para un recall mínimo de 0.95
prec, rec, thr = precision_recall_curve(y_val, clf.predict_proba(X_val)[:, 1])
t = thr[(rec[:-1] >= 0.95)].max()

Fuente ·ML_Course_Logistic_Regression_and_Classification.pdf (slides 29–36) · ML_Course/session-04c-evaluation.ipynb · BANCO_DE_PREGUNTAS_ML_PART_1.pdf