Capítulo 4
Regresión Lineal (visión ML)
4.1 Regresión como MLE
Desde la perspectiva de ML, la regresión lineal es un modelo probabilístico:
La verosimilitud de los datos es:
Maximizar el log- likelihood equivale a minimizar el MSE:
Minimizar el MSE es lo mismo que MLE con ruido gaussiano.
4.2 Basis Functions
La linealidad es en los parámetros, no en las features. Podemos transformar X:
Gaussianas (RBF)
Sigmoide
4.3 Ridge como Máximo a Posteriori (MAP)
Ridge no es solo un truco numérico. Es equivalente a poner un prior Gaussiano sobre w:
El MAP queda:
import numpy as np
from sklearn.linear_model import RidgeCV
from sklearn.preprocessing import PolynomialFeatures
X = np.linspace(0, 2, 20)[:, None]
y_true = np.sin(2 * np.pi * X.ravel())
y = y_true + 0.2 * np.random.randn(20)
model = RidgeCV(alphas=np.logspace(-3, 3, 50))
pipe = make_pipeline(PolynomialFeatures(15), model)
pipe.fit(X, y)
print(f"Alpha óptimo: {model.alpha_:.3f}")4.4 LASSO y Selección de Variables
LASSO usa la penalización L1, que induce esparsidad — muchos coeficientes se vuelven exactamente cero. Equivale a un prior Laplace sobre w.
La geometría explica por qué L1 produce ceros: las esquinas de la región factible (rombos) caen en los ejes. L2 (círculos) no tiene esquinas.
from sklearn.linear_model import LassoCV
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=200, n_features=50,
n_informative=5, noise=0.5, random_state=42)
lasso = LassoCV(cv=5, alphas=np.logspace(-4, 1, 50))
lasso.fit(X, y)
n_cero = (lasso.coef_ == 0).sum()
print(f"Alpha: {lasso.alpha_:.4f}, Coefs cero: {n_cero}/50")4.5 Elastic Net
Combina L1 y L2 para lo mejor de ambos mundos:
Útil cuando hay grupos de features correlacionadas — LASSO tiende a elegir solo una del grupo, Elastic Net las selecciona en grupo.
from sklearn.linear_model import ElasticNetCV
en = ElasticNetCV(cv=5, l1_ratio=[.1, .5, .7, .9, .95, .99, 1])
en.fit(X, y)
print(f"l1_ratio óptimo: {en.l1_ratio_:.2f}")4.6 Evaluación
Métricas clave para regresión:
MSE
RMSE
MAE
R²
4.7 Ejemplo Completo
import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import RidgeCV, LassoCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X = np.linspace(0, 3, 150)[:, None]
y = np.sin(X.ravel()) + 0.3 * np.random.randn(150)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
pipe_ridge = make_pipeline(PolynomialFeatures(12), StandardScaler(),
RidgeCV(alphas=np.logspace(-3, 3, 50)))
pipe_lasso = make_pipeline(PolynomialFeatures(12), StandardScaler(),
LassoCV(alphas=np.logspace(-4, 1, 50)))
pipe_ridge.fit(X_train, y_train)
pipe_lasso.fit(X_train, y_train)
print(f"Ridge test MSE: {mean_squared_error(y_test, pipe_ridge.predict(X_test)):.4f}")
print(f"Lasso test MSE: {mean_squared_error(y_test, pipe_lasso.predict(X_test)):.4f}")