Machine learning desde cero · Lección 3.1 · 14 de 33 lecciones listas · 10 min
Sobreajuste: cuando un modelo memoriza
En pocas palabras
Un modelo flexible puede acertar en todo su entrenamiento y fallar con datos nuevos. Al subir el grado de un polinomio, los dos errores se separan.
Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
Dos estudiantes preparan un examen de matemáticas. Una trabaja las ideas que hay detrás de los problemas. La otra memoriza palabra por palabra las respuestas de todos los exámenes anteriores. Con los exámenes anteriores, la segunda es impecable. Luego llega el examen real, con números nuevos. ¿Por quién apostarías? Los modelos se enfrentan exactamente a esta elección y, si los dejas solos, un modelo flexible se convertirá encantado en la segunda estudiante. Pruébalo tú mismo antes de leer la explicación.
Elige una respuesta y tu grado de seguridad.
Responde para desbloquear el experimento.
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: Grado 1 (una recta sencilla)
El mejor es el grado 1: error de prueba de 64,1. El grado 3 tiene 65,2, el grado 6 tiene 70,3 y el grado 10 llega a 132,6, aunque el error de entrenamiento baja de 60,2 (grado 1) a 51,1 (grado 10). Más flexibilidad reduce el error de entrenamiento, no el de prueba.
Prueba esto
- Empieza en el grado 1 y anota los dos errores. Luego sube el control del grado de uno en uno y observa cómo baja el error de entrenamiento.
- Sigue subiendo y fíjate en el error de prueba. Encuentra el grado en el que es más bajo: ese es el punto óptimo para esta muestra.
- Lleva el control del grado al máximo. Mira la curva entre los puntos: ¿sigue pareciendo una descripción sensata de la relación entre el IMC y la progresión?
- Compara la diferencia entre el error de entrenamiento y el de prueba en el grado más bajo y en el más alto. Una diferencia que crece es la huella dactilar del sobreajuste.
La idea en pocas palabras
En la lección 3 ajustamos una recta. Una recta es rígida: no puede doblarse para seguir una curva, aunque los datos se curven claramente. Un polinomio es una familia de curvas más flexible:
ŷ = w₀ + w₁x + w₂x² + … + w_d·x^d
El grado d controla la flexibilidad. El grado 1 es la recta; el grado 2 puede hacer una curva; los grados más altos pueden ondular cada vez más. Con el grado suficiente, un polinomio puede pasar por cada uno de los puntos de entrenamiento.
Suena a éxito, pero los datos reales contienen ruido: variación aleatoria que ninguna característica explica. Dos pacientes con el mismo IMC no progresan igual. Un modelo lo bastante flexible para tocar cada punto no solo aprende la tendencia; también aprende el ruido, los accidentes de esta muestra concreta. Eso es el sobreajuste (overfitting): el modelo se ajusta cada vez mejor a los datos de entrenamiento mientras sus predicciones para datos nuevos empeoran. El fallo opuesto, un modelo demasiado rígido para captar el patrón real, es el subajuste (underfitting).
Por qué funciona
Tomemos una pequeña muestra aleatoria de los pacientes con diabetes de la lección 3 y dividámosla en puntos de entrenamiento y de prueba. Una muestra pequeña hace que el efecto se vea con facilidad, porque unos pocos puntos raros pueden arrastrar muy lejos una curva flexible.
Sigamos lo que les pasa a los dos errores cuando sube el grado. El error de entrenamiento no deja de bajar: una curva más flexible siempre puede hacerlo al menos igual de bien con los puntos a los que se ajusta, porque puede imitar cualquier curva más simple. El error de prueba se comporta de otra forma. Al principio también baja, porque la flexibilidad extra capta estructura real. Luego, a partir de cierto grado, empieza a subir, porque la curva se dobla para perseguir puntos de entrenamiento concretos, y esas curvas están mal para todos los demás. El resultado es la famosa forma de U del error de prueba.
La razón tiene nombre: el compromiso sesgo-varianza. Un modelo rígido tiene un sesgo alto: se equivoca de forma sistemática, vea la muestra que vea. Un modelo muy flexible tiene una varianza alta: toma una muestra un poco distinta y obtendrás una curva completamente diferente. El mejor modelo está en medio, lo bastante flexible para seguir la señal y lo bastante rígido para ignorar el ruido. Dónde está ese punto depende de cuántos datos tengas: con más datos, el ruido se promedia y más flexibilidad se vuelve segura.
Error frecuente
El error fundamental es elegir la complejidad del modelo por el error de entrenamiento. El error de entrenamiento siempre premia la flexibilidad, así que siempre votará por el modelo más complejo: la estudiante que memoriza. El segundo error es creer que el sobreajuste es raro o exótico. Es el comportamiento por defecto de cualquier modelo flexible con datos limitados, lo que incluye árboles de decisión, redes neuronales y casi todo lo que vas a construir. La solución no es evitar los modelos flexibles, sino controlarlos: modelos más simples, más datos o regularización, que penaliza los pesos extremos.
En este razonamiento hay una trampa escondida: elegimos el mejor grado mirando el error de prueba, justo lo que la lección 2 advertía que no hiciéramos. En la próxima lección aprendemos a elegir ajustes de forma honesta, con validación y validación cruzada.
Atrapa el error de la IA
Así respondió un chatbot. Una frase es incorrecta. ¿Cuál?
Pregunta: Ajusté polinomios de grado 1 a 10 a 30 pacientes, IMC frente a progresión de la enfermedad. ¿Qué grado debo elegir?
Mostrar la frase incorrecta
La frase incorrecta: Por tanto, el grado con el menor error de entrenamiento, aquí el grado 10, es también el que mejor predecirá a pacientes nuevos.
El error de entrenamiento siempre premia la flexibilidad, así que no sirve para elegir el grado. En la lección el grado 10 tiene el menor error de entrenamiento (51,1 frente a 60,2 del grado 1), pero su error de prueba es 132,6, más del doble de los 64,1 de la recta.
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.
Ideas clave
- El sobreajuste significa ajustarse al ruido de los datos de entrenamiento, de modo que el rendimiento en prueba empeora.
- El error de entrenamiento siempre premia la flexibilidad; solo los datos de los que el modelo no aprendió revelan el sobreajuste.
- El error de prueba suele formar una U al crecer la complejidad: subajuste a un lado, sobreajuste al otro.
- Más datos, modelos más simples y regularización reducen el sobreajuste.
Más a fondo: fórmula, código, práctica
Las matemáticas
Un polinomio de grado d tiene d + 1 pesos: ŷ = w₀ + w₁x + … + w_d·x^d. Ajustar por mínimos cuadrados minimiza el error de entrenamiento. Todo polinomio de grado d − 1 es también un polinomio de grado d (con w_d = 0), así que el mejor error de entrenamiento solo puede mantenerse o bajar al aumentar d. Con n puntos que tienen todos una x distinta, el grado n − 1 pasa por cada punto y el error de entrenamiento es 0.
El error de prueba se divide en tres partes: E[(y − ŷ)²] = bias² + variance + σ². El sesgo es el fallo sistemático de un modelo demasiado rígido. La varianza es cuánto cambia la curva ajustada entre muestras. σ² es el ruido que nadie puede eliminar. Un grado mayor reduce el sesgo y aumenta la varianza, lo que da la forma de U.
El lab informa el RMSE, √MSE, en las unidades de la variable objetivo.
En código (Python)
Treinta pacientes de diabetes elegidos al azar como conjunto de entrenamiento, y los demás pacientes (dentro del rango de IMC del entrenamiento) como conjunto de prueba. Es el mismo tipo de experimento que el del lab, pero con otra muestra aleatoria, así que los números difieren de los del lab:
import numpy as np
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True, as_frame=True, scaled=False)
x, y = X["bmi"].to_numpy(), y.to_numpy()
perm = np.random.default_rng(0).permutation(len(x))
tr, te = perm[:30], perm[30:]
te = te[(x[te] >= x[tr].min()) & (x[te] <= x[tr].max())] # quedarse dentro del rango de entrenamiento
rmse = lambda i, p: np.sqrt(np.mean((y[i] - p(x[i])) ** 2))
for deg in (1, 3, 10):
p = np.polynomial.Polynomial.fit(x[tr], y[tr], deg) # ajusta sobre una x reescalada, así que el grado 10 es estable
print(f"degree {deg:2d}: train RMSE {rmse(tr, p):6.1f}, test RMSE {rmse(te, p):6.1f}")
Resultado
degree 1: train RMSE 61.6, test RMSE 63.5
degree 3: train RMSE 60.9, test RMSE 63.8
degree 10: train RMSE 54.7, test RMSE 199.5
El error de entrenamiento sigue bajando con el grado. El error de prueba del grado 10 es más de tres veces el del grado 1.
Descargar el notebook (.ipynb). Ábrelo en Jupyter o súbelo a Google Colab; descarga por sí solo los datos que falten.
Para profesionales
- Nunca elijas el grado, ni ningún otro ajuste de flexibilidad, por el error de entrenamiento. Siempre vota por el modelo más flexible.
- Mira la brecha entre el error de entrenamiento y el de prueba. Un error de entrenamiento pequeño con un error de prueba grande indica sobreajuste. Los dos errores altos indican subajuste.
- Los polinomios de grado alto se disparan fuera del rango de los datos de entrenamiento. No los uses para extrapolar.
- Con una sola muestra pequeña la imagen es ruidosa. Repite la partición con varias semillas antes de confiar en un «mejor grado».
- Para mantener a raya a un modelo flexible, prueba con más datos, un modelo más simple o regularización (ridge, lasso) antes de renunciar por completo a la flexibilidad.
¿Te ha sido útil?
¡Gracias! Nos ayuda a mejorar.
Profundiza en el Atlas
Entradas de la enciclopedia sobre las ideas de esta lección: