Published on

Una sola división de prueba no basta para comparar modelos

Authors

Casi todo el mundo aprende que una sola división train/test puede hacer que un modelo se vea mejor de lo que es. Esa es la mitad del problema. La mitad que se pasa por alto: la misma división, en el mismo experimento, puede simultáneamente hacer que un modelo competidor se vea peor de lo que es. Terminas con dos números equivocados apuntando en direcciones opuestas, y la brecha entre ellos parece un resultado contundente.

Así se ve con números reales, y cómo detectarlo.

El planteamiento

Clasificar dígitos manuscritos 5 y 6. 1,220 muestras, 256 valores de escala de grises cada una. Nueve modelos candidatos: una regresión lineal y KNN con k = 1, 3, 5, 7, 9, 11, 13, 15.

Empieza por el error de entrenamiento, y entiende por qué no responde tu pregunta

library(class)
kks <- c(1, 3, 5, 7, 9, 11, 13, 15)
for (kk in kks) {
  ypred <- knn(ziptrain56[,-1], ziptrain56[,-1], ziptrain56[,1], k=kk)
  print(mean(ypred != ziptrain56[,1]))
}

La regresión lineal queda en 0.49%. KNN con k=1 devuelve exactamente cero.

No leas ese cero como desempeño. Con un solo vecino, el punto más cercano a cualquier imagen de entrenamiento es ella misma, así que k=1 es estructuralmente incapaz de equivocarse con datos que ya vio. Vas a obtener 0% en cualquier conjunto de datos contra el que lo corras. Cuando una métrica está garantizada por la mecánica del algoritmo, no carga información sobre los datos.

Esta es la forma general del problema: el error de entrenamiento te dice qué tan bien memorizó un modelo. Tú quieres saber qué tan bien predice. Son preguntas distintas, y solo una importa.

Agrega un conjunto de prueba, y observa cómo produce una mentira convincente

ypred <- knn(ziptrain56[,-1], ziptest56[,-1], ziptrain56[,1], k=3)
mean(ypred != ziptest56[,1])
ModeloError de prueba
KNN k=30.30%
Regresión lineal4.85%

Una diferencia de 16x. La mayoría se detiene aquí, y la conclusión se escribe sola.

Antes de aceptarla, mira KNN k=3 en ambas tablas. Sacó 0.30% con datos que nunca vio y 0.49% con datos que memorizó. Un modelo no se vuelve más agudo con datos desconocidos. Cuando el error de prueba queda por debajo del error de entrenamiento, no estás viendo un modelo fuerte. Estás viendo un conjunto de prueba al que le tocó una mano fácil.

Esa es tu señal para dejar de confiar en el número y empezar a repetir el experimento.

Repite la división 100 veces

Validación cruzada Monte Carlo: reordenar qué filas son de entrenamiento y cuáles de prueba, reajustar cada modelo, registrar los errores, repetir.

zip56full <- rbind(ziptrain56, ziptest56)
n1 <- dim(ziptrain56)[1]; n <- dim(zip56full)[1]
set.seed(7406)

TEALL <- NULL
for (b in 1:100) {
  flag <- sort(sample(1:n, n1))
  train_b <- zip56full[flag, ]; test_b <- zip56full[-flag, ]

  regmod <- lm(V1 ~ ., data = train_b)
  te_lr <- mean((5 + (predict.lm(regmod, test_b[,-1]) >= 5.5)) != test_b[,1])

  te_knn <- sapply(kks, function(kk) {
    mean(knn(train_b[,-1], test_b[,-1], train_b[,1], k=kk) != test_b[,1])
  })
  TEALL <- rbind(TEALL, c(te_lr, te_knn))
}
apply(TEALL, 2, mean); apply(TEALL, 2, var)
ModeloError promedio, 100 corridasVarianza
KNN k=30.87%1.89e-05
KNN k=50.99%2.74e-05
KNN k=11.04%2.47e-05
Regresión lineal2.53%5.68e-05

Ambas estimaciones se movieron, en direcciones opuestas. KNN k=3 casi triplicó, de 0.30% a 0.87%. La regresión lineal cayó a la mitad, de 4.85% a 2.53%. Una división fue generosa con el primer modelo y dura con el segundo, que es exactamente cómo una diferencia de 3x termina reportada como 16x.

Nota que el ranking sobrevivió. KNN k=3 es genuinamente el mejor modelo aquí. Repetir el experimento no volteó la conclusión, corrigió la magnitud. Esa distinción importa cuando estás decidiendo cuánto invertir en una elección de modelo.

Ahora lee la columna de varianza, que casi todos se saltan. KNN k=3 tiene la dispersión más estrecha de los nueve, 1.89e-05, o sea que su error casi no se mueve sin importar cómo se particionen los datos. Ese es un hallazgo distinto de tener el error promedio más bajo, y en producción suele ser el más valioso. La consistencia es una característica. Un modelo que a veces es excelente y a veces malo es más difícil de construir encima que uno confiablemente bueno.

Las reglas que vale la pena llevarse

El error de entrenamiento y el de prueba responden preguntas distintas. A lo largo de las 100 corridas, el error de entrenamiento de la regresión lineal fue 0.53%, mejor que KNN con k=5 en adelante. Su error de prueba fue el peor de los nueve modelos. Ambas cifras son correctas. Solo una te dice qué pasa después.

Una métrica garantizada no es un descubrimiento. Que k=1 dé 0% de error de entrenamiento es una propiedad del algoritmo, no evidencia sobre los datos. Aprende a reconocer cuáles de tus métricas están estructuralmente determinadas antes de interpretarlas.

Ajusta tus conclusiones a la evidencia. KNN k=3 ganó con estos datos, contra estos nueve métodos. "KNN le gana a la regresión lineal" es una afirmación sustancialmente mayor que lo que el experimento respalda.

Trata los resultados débiles como diagnóstico. La regresión lineal no falló de forma arbitraria aquí. Los píxeles adyacentes en un dígito manuscrito tienen valores similares, así que las 256 variables están fuertemente correlacionadas, y la regresión lineal asume que no lo están. Eso es multicolinealidad, y apunta a un remedio específico: selección de variables o reducción de dimensionalidad. Descartar un mal resultado como "ese modelo no funciona" tira a la basura la información más útil que produjo el experimento.

Cuando un resultado se ve inusualmente limpio, córrelo de nuevo. Un número que te halaga es una hipótesis. Trátalo como tal hasta que el promedio deje de moverse.

Recibe el siguiente

Artículos sobre datos, analítica y las decisiones que deciden si un modelo se usa o se ignora.

CompartirLinkedInXReddit