ML Atlas

Machine learning desde cero · Lección 2.3 · 10 de 33 lecciones listas · 12 min

Umbral, ROC y PR: todos los umbrales a la vez

En pocas palabras

Las curvas ROC y PR muestran todos los umbrales a la vez. Con una clase rara, el ROC AUC casi no cambia y el AP cae: las falsas alarmas se comen la precisión.

Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
De la lección 2.2: Evaluar un clasificador: más allá de la exactitud Un modelo de cribado pierde muchos cánceres, pero casi nunca da una falsa alarma. ¿Qué número es bajo?

Ver la respuesta

Respuesta correcta: El recall, que mide cuántos de los cánceres reales detecta el modelo

El recall es la proporción de positivos reales que se detectaron, así que muchos casos perdidos significan un recall bajo.

De la lección 2.1: Clasificación: trazar una frontera Subes el umbral de 0,5 a 0,8. ¿Qué le pasa a la frontera?

Ver la respuesta

Respuesta correcta: Se desplaza en paralelo y menos pingüinos pasan a la clase de probabilidad alta

Cada umbral corresponde a una recta con la misma dirección; un umbral más estricto la desplaza para que solo pasen los casos seguros.

En la lección 2.2 movías un umbral y veías cambiar la matriz de confusión. Cada umbral es una decisión distinta, aunque las puntuaciones del modelo sean las mismas. Hoy verás todos los umbrales a la vez, en dos curvas: ROC y precisión–sensibilidad (PR). Comprobarás también cuál de ellas dice la verdad cuando hay pocos enfermos. El modelo es débil a propósito: una regresión logística que solo ve una medida, la textura media del tumor, para que las curvas no se peguen a las esquinas.

Predice y comprueba El mismo modelo puntúa las mismas 357 biopsias benignas. Primero hay 212 malignas (37 % de los datos), luego solo 19 (5 %). ¿Qué pasa con el ROC AUC (el área bajo la curva ROC) y qué con el AP, el área bajo la curva PR?
¿Qué tan seguro estás?

Experimento interactivo

Este experimento interactivo funciona en un navegador con JavaScript activado. El texto que lo rodea describe lo que muestra.

Ver la respuesta

Respuesta correcta: El ROC AUC casi no cambia (unos 0,77), y el AP cae hasta unos 0,14

El ROC AUC es 0,773 con todas las malignas y de media 0,772 con 19 (en 200 sorteos de qué malignas se quedan). El AP cae de 0,591 a 0,137 de media. El modelo no olvidó nada; solo cambiaron las proporciones de las clases. La ROC no lo ve, la curva PR sí.

Prueba esto

  • Empieza con 212 malignas y umbral 0,5. Lee la sensibilidad y la FPR, y luego mueve el umbral a 0,3. ¿Hacia dónde va el punto en las dos curvas?
  • Cambia a 19 malignas con umbral 0,3. Hay tantas falsas alarmas como hace un momento. ¿Qué le pasó a la precisión?
  • Compara el ROC AUC y el AP con 212, 40 y 19 malignas.

Cuando lo hayas comprobado en el lab, pongamos nombre a lo que ves.

La idea en pocas palabras

El modelo no dice «maligno» o «benigno». Da una puntuación de 0 a 1, y la decisión la toma un umbral. Cada umbral da un par de números distinto: cuántas malignas se detectaron (sensibilidad) y cuántas benignas recibieron una falsa alarma. La curva ROC dibuja esos pares para todos los umbrales a la vez: en horizontal, la proporción de falsas alarmas entre las benignas (FPR); en vertical, la sensibilidad. Un umbral alto es la esquina inferior izquierda (pocas alarmas); uno bajo, la superior derecha (alarma en cada biopsia).

La curva precisión–sensibilidad (PR) muestra los mismos umbrales de otra forma: en horizontal, la sensibilidad; en vertical, la precisión, es decir, qué parte de las alarmas es correcta. El área bajo la curva ROC es el ROC AUC; el área bajo la curva PR, el AP (average precision). Cada uno resume todos los umbrales a la vez, así que no depende del umbral que elijas.

Con las 569 biopsias el modelo tiene un ROC AUC de 0,773 y un AP de 0,591. Adivinar al azar daría un ROC AUC de 0,5 y un AP igual a la proporción de malignas, 0,373. El modelo es claramente mejor que adivinar, pero está lejos del ideal, que es 1.

Jak to policzono
  • Biopsias: Breast Cancer Wisconsin (Diagnostic), UCI, licencia CC BY 4.0. 569 biopsias (357 benignas, 212 malignas). El modelo ve una medida: la textura media del tumor.
  • Puntuaciones de validación cruzada en 5 partes (StratifiedKFold(5) en scikit-learn): cada biopsia la puntúa un modelo que nunca la vio.
  • Clase más rara: se quedan las 357 benignas y 40 o 19 malignas elegidas al azar. El gráfico muestra un sorteo; las medias son de 200 sorteos.
  • Modelo: estandarización y regresión logística (C = 1).

Por qué funciona

La ROC cuenta las falsas alarmas frente a las benignas: la FPR es el número de falsas alarmas dividido entre 357. La sensibilidad cuenta los aciertos frente a las malignas. Cuando quitas malignas al azar, las dos fracciones siguen más o menos iguales, así que la curva ROC y su área casi no se mueven. Con umbral 0,3 el modelo da la alarma en 144 de las 357 benignas (FPR 40,3 %), haya 212 malignas o 19.

La precisión cuenta las falsas alarmas frente a todas las alarmas. Con 212 malignas y umbral 0,3 el modelo detecta 177, así que la precisión es del 55,1 %. Con 19 malignas detecta 17, y las 144 falsas alarmas se quedan: la precisión cae al 10,6 %, es decir, 8,5 falsas alarmas por cada correcta. La curva PR cae con la precisión, y el AP pasa de 0,591 a 0,137 de media. La línea de adivinar al azar en la PR también baja, hasta la proporción de malignas: 0,051.

No es suerte de un sorteo ni de una forma de partir los datos. Con 40 malignas (10 %) el ROC AUC es de media 0,773 y el AP 0,232. En el código de abajo, el mismo modelo con otras 20 particiones tiene, con 19 malignas, un AP por debajo de la mitad del obtenido con todos los datos, cada vez.

Error frecuente

Verdadero o falso: «un ROC AUC alto significa pocas falsas alarmas». Falso. El ROC AUC mide lo bien que el modelo ordena: la probabilidad de que una biopsia maligna al azar reciba una puntuación más alta que una benigna al azar. No dice cuántas alarmas serán falsas, porque eso depende de lo rara que sea la clase. En el lab, con 19 malignas el ROC AUC es de media 0,772, casi lo mismo que con 212, y con umbral 0,3 hay 8,5 falsas alarmas por cada correcta. Cuando la clase es rara, mira la curva PR y la precisión en el umbral que de verdad vas a usar.

Un aviso en sentido contrario: el AP tampoco es un número «solo del modelo». Depende de la proporción de la clase en los datos, así que el AP de dos conjuntos con proporciones distintas no se puede comparar directamente. Compáralo con la línea de adivinar al azar en los mismos datos.

Test

Tres preguntas para comprobar lo aprendido. Elige una respuesta o despliega la solución bajo cada pregunta. Con el teclado: las flechas eligen, Enter o Espacio confirma.

1. ¿Qué muestra la curva ROC?
Ver la respuesta

Respuesta correcta: La sensibilidad frente a la proporción de falsas alarmas, para todos los umbrales

Cada punto de la curva es un umbral. Un umbral alto es la esquina inferior izquierda; uno bajo, la superior derecha. El área bajo la curva, el ROC AUC, resume todos los umbrales en un número: aquí 0,773.

2. Las malignas son el 5 % en lugar del 37 %. El ROC AUC casi no se mueve. ¿Por qué cae el AP?
Ver la respuesta

Respuesta correcta: Porque las mismas falsas alarmas son ahora una parte mucho mayor del total

La FPR divide las falsas alarmas entre el número de benignas, que no cambia. La precisión las divide entre todas las alarmas. Con umbral 0,3 y 19 malignas hay 144 falsas alarmas por 17 correctas.

3. ¿Cuándo dice más la curva PR que la curva ROC?
Ver la respuesta

Respuesta correcta: Cuando la clase positiva es rara y lo que importa es cuántas alarmas aciertan

Con una clase rara la curva ROC se ve igual mientras la precisión cae. En el lab con 19 malignas el AP baja a 0,137 de media, aunque el ROC AUC casi no se mueve.

Ideas clave

  • La curva ROC y la curva PR muestran todos los umbrales a la vez; el umbral se elige después, según el coste de los errores.
  • El ROC AUC mide lo bien que el modelo ordena y casi no depende de las proporciones de las clases.
  • Cuando la clase positiva es rara, las mismas falsas alarmas se comen la precisión: mira la curva PR y el AP.
  • Compara el AP con la línea de adivinar al azar, la proporción de la clase positiva en los mismos datos.

Más a fondo: fórmula, código, práctica

Las matemáticas

Con el umbral t, el modelo dice «maligno» cuando su puntuación s ≥ t. Entonces sensibilidad = TP / (TP + FN), FPR = FP / (FP + TN), precisión = TP / (TP + FP).

La FPR solo tiene benignas en el denominador; la sensibilidad, solo malignas. Si quitas malignas al azar, ninguna de las dos fracciones cambia de forma sistemática, así que la curva ROC se queda. La precisión tiene los dos tipos de alarma en el denominador. Con umbral 0,3: 177 / (177 + 144) ≈ 0,551 con 212 malignas y 17 / (17 + 144) ≈ 0,106 con 19.

El ROC AUC es la probabilidad de que una maligna al azar reciba una puntuación mayor que una benigna al azar: AUC = P(s₊ > s₋), y los empates cuentan la mitad. El AP es la precisión media ponderada por los saltos de sensibilidad: AP = Σₖ (Rₖ − Rₖ₋₁) · Pₖ. Las puntuaciones al azar dan AUC 0,5 y un AP igual a la proporción de la clase positiva: 212 / 569 ≈ 0,373 o 19 / 376 ≈ 0,051.

En código (Python)

El mismo experimento en scikit-learn: puntuaciones de validación cruzada, ROC AUC y AP con 212, 40 y 19 malignas (medias de 1000 sorteos), y luego lo mismo con otras 20 particiones.

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import StratifiedKFold, cross_val_predict
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, average_precision_score

X, y = load_breast_cancer(return_X_y=True)
X, y = X[:, [1]], 1 - y  # solo la textura media, como en el lab; 1 = maligno
model = make_pipeline(StandardScaler(), LogisticRegression())
def scores(cv):  # puntuaciones de validación: cada biopsia la puntúa un modelo que nunca la vio
    return cross_val_predict(model, X, y, cv=cv, method="predict_proba")[:, 1]
ben, mal = np.flatnonzero(y == 0), np.flatnonzero(y == 1)
def rare(p, keep, draws, seed):  # las 357 benignas + `keep` malignas al azar, media de los sorteos
    rng = np.random.default_rng(seed)
    rows = [np.r_[ben, rng.choice(mal, keep, replace=False)] for _ in range(draws)]
    return np.mean([(roc_auc_score(y[i], p[i]), average_precision_score(y[i], p[i])) for i in rows], axis=0)
p = scores(StratifiedKFold(5))
print(f"212 malignant ({212 / 569:.0%}): ROC AUC {roc_auc_score(y, p):.3f}, AP {average_precision_score(y, p):.3f}")
for keep in (40, 19):
    auc, ap = rare(p, keep, 1000, 0)
    print(f"{keep} malignant ({keep / (357 + keep):.0%}), mean of 1000 draws: ROC AUC {auc:.3f}, AP {ap:.3f}")
r = []
for s in range(20):  # otras 20 formas de partir los datos en 5 partes
    q = scores(StratifiedKFold(5, shuffle=True, random_state=s))
    r.append([roc_auc_score(y, q), average_precision_score(y, q), *rare(q, 19, 200, s)])
r = np.array(r)
print(f"20 other fold splits, 212 -> 19 malignant: ROC AUC {r[:, 0].mean():.3f} -> {r[:, 2].mean():.3f}, AP {r[:, 1].mean():.3f} -> {r[:, 3].mean():.3f}; AP below half in {(r[:, 3] < r[:, 1] / 2).sum()} of 20")

Resultado

212 malignant (37%): ROC AUC 0.773, AP 0.591
40 malignant (10%), mean of 1000 draws: ROC AUC 0.773, AP 0.231
19 malignant (5%), mean of 1000 draws: ROC AUC 0.774, AP 0.140
20 other fold splits, 212 -> 19 malignant: ROC AUC 0.774 -> 0.775, AP 0.595 -> 0.140; AP below half in 20 of 20

Con todas las malignas los números son los mismos que en el lab. Con 40 y 19 el código sortea las malignas de otra forma que el lab y hace 1000 sorteos en lugar de 200, por eso las medias difieren en el tercer decimal: AP 0,140 en lugar de 0,137. Con otras 20 particiones el cuadro es el mismo: el ROC AUC se queda y el AP cae por debajo de la mitad cada vez.

Para profesionales
  • En scikit-learn los números salen de roc_auc_score y average_precision_score, y las curvas las dibujan RocCurveDisplay y PrecisionRecallDisplay. Calcúlalos con puntuaciones de validación (cross_val_predict(..., method="predict_proba")), no con los datos de aprendizaje.
  • Con una clase rara (fraudes, enfermedades raras, averías) informa del AP junto al ROC AUC, y junto al AP la línea de adivinar al azar, la proporción de la clase positiva.
  • Una curva es un menú de umbrales. Elige el umbral en validación según el coste de los errores, por ejemplo «sensibilidad de al menos el 90 % con la mayor precisión posible», y solo después compruébalo en el test.
  • El ROC AUC de dos conjuntos con proporciones distintas se puede comparar, pero no dirá cuántas alarmas serán falsas; el AP dice más de eso, pero compáralo solo con las mismas proporciones.

Profundiza en el Atlas

Entradas de la enciclopedia sobre las ideas de esta lección: