Regresión lineal y regularización
El modelo más simple que existe sigue siendo el más usado, y entenderlo bien da la mitad del resto: función de costo, solución cerrada, y qué hacen exactamente las penalizaciones L1 y L2.
Para este tema conviene tener claro:Cuadrados mínimos: la mejor solución de un sistema imposibleRegresión lineal simple
Trazar la recta que mejor pasa entre unos puntos es de las primeras cosas que uno aprende, y sigue siendo el modelo más usado en producción. No por nostalgia: es rápido, se explica, y su estructura reaparece adentro de casi todos los modelos más complejos.
El modelo y qué se minimiza
El modelo predice una combinación lineal de los atributos: . Los pesos se eligen minimizando la suma de los errores al cuadrado.
Elevar al cuadrado no es arbitrario: hace la función diferenciable, penaliza más los errores grandes y corresponde a suponer ruido gaussiano. También trae la contra: un solo valor atípico puede torcer la recta entera, porque su error cuenta al cuadrado.
Antes de seguir, predecí
Hay solución cerrada, y por qué igual no se usa
Hay solución cerrada. El costo es una función cuadrática y convexa de los pesos, así que tiene un único mínimo que se obtiene resolviendo un sistema de ecuaciones.
Eso significa que no hace falta optimización iterativa ni hiperparámetros para entrenarlo. La limitación aparece con muchos atributos, porque resolver el sistema implica invertir una matriz grande; ahí conviene descenso por gradiente. Y si dos atributos están muy correlacionados, el sistema queda mal condicionado y los pesos se vuelven enormes y opuestos.
Penalizar el tamaño de los pesos
Ese es el problema que ataca la regularización: agregar al costo una penalización por el tamaño de los pesos, para que el modelo prefiera soluciones más chicas.
Ridge penaliza la suma de los cuadrados. Achica todos los pesos hacia cero de forma suave y estabiliza el caso de atributos correlacionados, repartiendo el peso entre ellos en vez de dárselo todo a uno.
Lasso lleva coeficientes a cero: selecciona
Lasso penaliza la suma de los valores absolutos, y la diferencia no es cosmética: lleva coeficientes exactamente a cero. Es decir, selecciona atributos.
La razón geométrica es la forma de la restricción: la región del valor absoluto tiene vértices sobre los ejes, y el óptimo tiende a caer en un vértice, donde alguna coordenada es cero. La región de ridge es una esfera, sin vértices, y por eso achica sin anular. Elastic net combina las dos.
Sin estandarizar, la penalización es arbitraria
Un detalle que arruina resultados: la regularización penaliza el tamaño del peso, y ese tamaño depende de las unidades del atributo. Un atributo medido en metros y otro en kilómetros reciben penalizaciones incomparables.
Por eso hay que estandarizar los atributos antes de regularizar. Y el término independiente no se penaliza: no mide sensibilidad a ningún atributo, sólo dónde está centrada la respuesta.
Lineal es en los pesos, no en los datos
“Lineal” se refiere a los pesos, no a los datos. Se pueden agregar potencias, logaritmos o productos entre atributos y el modelo sigue siendo lineal en sus parámetros, con toda su matemática intacta. Eso lo vuelve mucho más flexible de lo que su nombre sugiere.
Lo que sigue exigiendo cuidado es la interpretación. Un coeficiente dice cuánto cambia la predicción al mover ese atributo manteniendo los otros fijos, que puede ser una situación que en los datos nunca ocurre. Y sigue siendo correlación: no autoriza a afirmar qué pasaría si se interviniera.
Ridge, lasso y el paso que no se puede saltear
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import RidgeCV, LassoCV
# Estandarizar es obligatorio: la penalización castiga el tamaño del coeficiente,
# y el tamaño depende de las unidades del atributo
ridge = Pipeline([
("escalar", StandardScaler()),
("modelo", RidgeCV(alphas=[0.01, 0.1, 1, 10, 100])), # elige alpha por validación cruzada
])
lasso = Pipeline([
("escalar", StandardScaler()),
("modelo", LassoCV(cv=5)),
])
lasso.fit(X_train, y_train)
coeficientes = lasso.named_steps["modelo"].coef_
usados = (coeficientes != 0).sum() # lasso pone en cero: selecciona atributosSin el escalador, un atributo medido en metros y otro en kilómetros reciben penalizaciones que difieren por un factor de mil, y el modelo va a achicar el que tiene números grandes por una razón que no tiene nada que ver con su importancia.
El último renglón es la diferencia práctica entre los dos: lasso deja coeficientes exactamente en cero, así que el modelo dice cuáles atributos usa. Ridge los achica todos y no descarta ninguno.
Por qué sigue siendo el primer modelo
| Lineal | Árboles | Red neuronal | |
|---|---|---|---|
| Se explica a alguien de negocio | sí, coeficiente por coeficiente | con esfuerzo | no |
| Funciona con pocos datos | sí | sí | no |
| Necesita escalar los atributos | sí, si hay regularización | no | sí |
| Captura no linealidades solo | no | sí | sí |
| Extrapola fuera del rango visto | sí, con cuidado | no: devuelve el borde | impredecible |
| Tiempo de entrenamiento | segundos | minutos | horas |
Cierre
Mínimos cuadrados con solución cerrada, convexa y sensible a atípicos. Ridge achica los pesos y estabiliza correlaciones; lasso los lleva a cero y selecciona. Hay que estandarizar antes de penalizar, y lineal en los parámetros permite atributos no lineales.
Autoevaluación
¿Lo entendiste?
Práctica