4 · Regresión polinómica y sobreajuste
Agrega x², x³, ... como variables y el modelo lineal puede ajustar curvas — pero a mayor grado, más memoriza ruido.
Agrega x², x³, ... como nuevas variables y tu modelo LINEAL puede ajustar curvas — pero a mayor grado, más sobreajusta.
Sin esto:
Sin ver el sobreajuste de primera mano, el intercambio sesgo-varianza permanece abstracto.
Hasta ahora nuestro modelo está restringido a rectas. El mundo real es curvo. La solución — expansión de variables polinómicas — es una forma de feature engineering: crear nuevas variables x², x³, ..., xᵈ a partir de la x original, luego ajustar una regresión lineal en el conjunto de variables expandido.
La clave es que el modelo sigue siendo lineal en las variables expandidas. No estamos cambiando el algoritmo de aprendizaje — estamos cambiando lo que le alimentamos. PolynomialFeatures(degree=d) de sklearn automatiza esta transformación.
Para una expansión de grado 3 en una sola variable x:
[x] → [1, x, x², x³]
Una regresión lineal en estas cuatro columnas ajusta un polinomio cúbico — pero sigue siendo LinearRegression, sigue minimizando MSE, sigue usando OLS internamente.
El inconveniente: a medida que el grado crece, el modelo gana enorme flexibilidad. Con grado 15 en 50 puntos de entrenamiento, el modelo puede pasar por (o cerca de) cada punto de entrenamiento — un MSE de entrenamiento perfecto. Pero en datos nuevos, esas oscilaciones salvajes producen predicciones terribles. Esto es sobreajuste: aprender el ruido, no la señal.
La descomposición sesgo-varianza formaliza el intercambio:
Error total = Sesgo² + Varianza + Ruido irreducible
- Sesgo = qué tan equivocado está el modelo en promedio (alto para grado 1 en datos curvos).
- Varianza = cuánto cambian las predicciones con diferentes conjuntos de entrenamiento (alta para grado 15).
- El punto óptimo es un grado donde ambos sean aceptablemente pequeños.
Python (in browser)
`PolynomialFeatures(degree=d)` expande x en [x, x², ..., xᵈ] — el LinearRegression no cambia. Grado 1 pierde la curva; grado 15 oscila caóticamente.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
El MSE de entrenamiento cae monótonamente. El MSE de prueba sigue una curva en U — toca fondo cerca del grado 3 y luego sube abruptamente. Esta curva en U es el intercambio sesgo-varianza hecho visible.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Sesgo alto = modelo demasiado simple para los datos. Varianza alta = modelo demasiado sensible al ruido de entrenamiento. Toda sesión de ajuste de ML es navegar este intercambio.
Si el MSE de entrenamiento es 0.01 y el MSE de prueba es 2.0, tu modelo está:
- `PolynomialFeatures(degree=d)` expande x a [x, x², ..., xᵈ]. El modelo posterior sigue siendo `LinearRegression` — la no linealidad viene de las variables, no del algoritmo.
- Grado demasiado bajo → subajuste (sesgo alto). Grado demasiado alto → sobreajuste (varianza alta). Usa el MSE de test/validación para encontrar el punto óptimo.
- Diagnóstico: si train_MSE ≈ test_MSE (ambos grandes) → subajuste; si train_MSE << test_MSE → sobreajuste.
- Error total = Sesgo² + Varianza + Ruido irreducible. Ningún modelo elimina el ruido irreducible — redúcelo recopilando mejores datos, no agregando complejidad.
Los métodos kernel (SVM con RBF) son regresión polinómica de grado infinito implícita. Los splines y GAMs son ajustes polinómicos con restricciones. Los árboles de decisión logran no linealidad mediante particionamiento en lugar de expansión de variables.
Si lo quitas: No puedes modelar ninguna relación no lineal — y casi todas las señales del mundo real son no lineales.