Capítulo 6

Regresión

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.

6.1 Regresión Lineal

La recta que mejor se ajusta

Buscamos y=β0+β1xy = \beta_0 + \beta_1 x que minimice el error cuadrático medio:

minβ0,β11ni=1n(yi(β0+β1xi))2\min_{\beta_0, \beta_1} \frac{1}{n} \sum_{i=1}^n (y_i - (\beta_0 + \beta_1 x_i))^2

La solución tiene forma cerrada usando mínimos cuadrados ordinarios (OLS):

β^=(XTX)1XTy\hat{\boldsymbol{\beta}} = (X^T X)^{-1} X^T \mathbf{y}

Supuestos clave

  • • Relación lineal entre X e Y
  • • Errores independientes con media 0
  • • Homocedasticidad (varianza constante)
  • • No multicolinealidad perfecta

Métrica: R²

R2=1(yiy^i)2(yiyˉ)2R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}

Proporción de varianza explicada por el modelo. Entre 0 y 1.

python
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}")

6.2 Visualización Interactiva

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).

MSE: 0.7892
xy— Real— Ajuste

Underfitting

Grado muy bajo (0-1). El modelo no captura la estructura de los datos. Alto sesgo.

Ajuste óptimo

Grado 3-4. Captura la señal sin ajustar ruido. Equilibrio sesgo-varianza.

Overfitting

Grado alto (8+). Pasa por todos los puntos pero generaliza mal. Alta varianza.

6.3 Trade-off Sesgo-Varianza

El dilema fundamental del aprendizaje

El error de prueba se descompone en tres componentes:

E[(yf^(x))2]=Sesgo[f^(x)]2error por suposiciones+Var[f^(x)]error por sensibilidad a datos+σ2ruido irreducible\mathbb{E}[(y - \hat{f}(x))^2] = \underbrace{\text{Sesgo}[\hat{f}(x)]^2}_{\text{error por suposiciones}} + \underbrace{\text{Var}[\hat{f}(x)]}_{\text{error por sensibilidad a datos}} + \underbrace{\sigma^2}_{\text{ruido irreducible}}

Sesgo (Bias)

Error por asumir un modelo demasiado simple. Modelos con alto sesgo ignoran relaciones relevantes (underfitting).

Varianza

Error por sensibilidad a las fluctuaciones de los datos de entrenamiento. Modelos complejos tienen alta varianza (overfitting).

Ruido irreducible

Varianza inherente de los datos que ningún modelo puede eliminar.

6.4 Regularización

Controlar la complejidad

Ridge (L2)

minyXβ2+λβ22\min \|y - X\beta\|^2 + \lambda \|\beta\|_2^2

Penaliza coeficientes grandes. Los encoge sin hacerlos cero. Sirve cuando hay multicolinealidad.

LASSO (L1)

minyXβ2+λβ1\min \|y - X\beta\|^2 + \lambda \|\beta\|_1

Penaliza la suma de valores absolutos. Lleva coeficientes a cero — hace selección de variables automática.

python
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