Supuestos clave
- • Relación lineal entre X e Y
- • Errores independientes con media 0
- • Homocedasticidad (varianza constante)
- • No multicolinealidad perfecta
Capítulo 6
El caballo de batalla del data science: regresión lineal, el problema del overfitting, el trade-off sesgo-varianza y cómo la regularización lo controla.
La recta que mejor se ajusta
Buscamos que minimice el error cuadrático medio:
La solución tiene forma cerrada usando mínimos cuadrados ordinarios (OLS):
Proporción de varianza explicada por el modelo. Entre 0 y 1.
import numpy as np
from sklearn.linear_model import LinearRegression
# Datos
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 3.5, 3, 5, 4.5])
modelo = LinearRegression()
modelo.fit(X, y)
print(f"Pendiente: {modelo.coef_[0]:.3f}")
print(f"Intercepto: {modelo.intercept_:.3f}")
print(f"R²: {modelo.score(X, y):.3f}")
# Predecir
X_new = np.array([[6]])
print(f"Predicción para x=6: {modelo.predict(X_new)[0]:.3f}")Overfitting en acción
Ajusta el grado del polinomio y la cantidad de puntos. Observa cómo un grado alto (> 7) empieza a ajustar ruido en lugar de la señal verdadera (línea gris punteada).
Grado muy bajo (0-1). El modelo no captura la estructura de los datos. Alto sesgo.
Grado 3-4. Captura la señal sin ajustar ruido. Equilibrio sesgo-varianza.
Grado alto (8+). Pasa por todos los puntos pero generaliza mal. Alta varianza.
El dilema fundamental del aprendizaje
El error de prueba se descompone en tres componentes:
Error por asumir un modelo demasiado simple. Modelos con alto sesgo ignoran relaciones relevantes (underfitting).
Error por sensibilidad a las fluctuaciones de los datos de entrenamiento. Modelos complejos tienen alta varianza (overfitting).
Varianza inherente de los datos que ningún modelo puede eliminar.
Controlar la complejidad
Penaliza coeficientes grandes. Los encoge sin hacerlos cero. Sirve cuando hay multicolinealidad.
Penaliza la suma de valores absolutos. Lleva coeficientes a cero — hace selección de variables automática.
from sklearn.linear_model import Ridge, Lasso
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
# Ridge con polynomial features
modelo_ridge = make_pipeline(
PolynomialFeatures(degree=10),
Ridge(alpha=1.0)
)
modelo_ridge.fit(X, y)
# LASSO (selecciona variables automáticamente)
modelo_lasso = make_pipeline(
PolynomialFeatures(degree=10),
Lasso(alpha=0.1)
)
modelo_lasso.fit(X, y)
# alpha controla la fuerza de regularización
# alpha grande → más regularización → coeficientes más pequeños
# alpha pequeño → menos regularización → similar a OLS