Tema 06 - Selección y Regularización en Modelos Lineales

LASSO y Ridge Regression

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

Alberto Pérez

Conceptos Fundamentales

El problema: muchas variables

  • Escenario típico en economía/empresa: predecir una variables (ventas, salarios, abandono de clientes) con múltiples factores explicativos y/o interacciones y polinomios

  • Desafíos de MCO para estimar modelos con muchos regresores:

    • ¿Qué variables incluimos?
    • Con muchas variables, alta varianza
    • Modelo complejo, difícil de interpretar
    • Posible overfitting
  • ¿Solución? Tres enfoques complementarios:

    1. Selección de variables relevantes y estimar por MCO
    2. Regularización (penalizar coeficientes grandes) ← Este tema
    3. Reducción de dimensionalidad (usar un número menor de variables combinando las originales)

“Trade-off” Sesgo-Varianza (de nuevo)

  • El dilema fundamental del aprendizaje:

    • Modelos simples → alto sesgo

    • Modelos complejos → alta varianza

  • Objetivo: controlar este trade-off, calculando métricas de error para elegir el mejor modelo

  1. Validación cruzada: estima directamente el error de prueba, pero es costoso (computacionalmente, menor tamaño muestral)
  1. Métodos de ajuste: el error de entrenamiento siempre disminuye para modelos más complejos, pero puede ajustarse y estimar indirectamente el error de prueba mediante supuestos (erróneos?)

    • Criterio de Información de Akaike: \(\small AIC = \frac{1}{n}\left( SCR^{entrena} + 2 k \widehat{\sigma}^2 \right)\)

    • Criterio de Información Bayesiano: \(\small BIC = \frac{1}{n}\left( SCR^{entrena} + log(n) k \widehat{\sigma}^2 \right)\)

    • \(\small R^2-ajustado = 1- \frac{SCR^{entrena}/(n-k-1)}{SCT^{entrena}/(n-1)}\)

donde \(\small \widehat{\sigma}^2\) un estimación de la varianza del error y \(\small k\) es el número de parámetros

¿Qué es la regularización?

Idea central: Penalizar coeficientes grandes para reducir la varianza

  • En MCO minimizamos:

\[ min_{\beta} \quad SCR(\beta) = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 \]

  • Con regularización minimizamos:

\[ min_{\beta} \quad SCR(\beta) + \lambda \cdot \text{Penalización}(\beta) \]

donde \(\lambda \geq 0\) es el parámetro de regularización (hiperparámetro)

  • Castiga coeficientes grandes para forzar modelos más simples: mayor sesgo (peor ajuste), pero reduce la varianza (previene overfitting)

    • NOTA: NO se penaliza la constante (media de \(\small Y\)), solo el impacto de \(\small X\)
  • La regularización funciona mejor cuando MCO tiene alta varianza: intercambia un pequeño aumento de sesgo por una gran reducción de la varianza

Tipos de regularización

Dos formas principales de penalización:

Ridge Regression \[ \min_\beta \text{SCR} + \lambda \sum_{j=1}^{k}\beta_j^2 \]

  • Penaliza la suma de los cuadrados de \(\beta\)
  • Reduce los coeficientes hacia cero
  • Pero nunca exactamente cero
  • Todas las variables se mantienen

LASSO \[ \min_\beta \text{SCR} + \lambda \sum_{j=1}^{k}|\beta_j| \]

  • Penaliza la suma de los valores absolutos de \(\beta\)
  • Reduce coeficientes y fuerza algunos a cero
  • Realiza selección de variables
  • Modelo más interpretable

“Ridge Regression” y LASSO

  • ¿Cuál usar?

    • Ridge: cuando muchas variables son relevantes

    • LASSO: cuando solo pocas variables son importantes

    • Elastic Net: combina ambos

\[ \scriptsize \alpha \left(\sum_{j=1}^{k}|\beta_j|\right) + (1-\alpha)\left(\sum_{j=1}^{k}\beta_j^2\right) \]

  • Recordad que estos métodos están orientado a la predicción: NO usar para afirmaciones de causalidad (los coeficientes están sesgados)

  • LASSO (least absolute shrinkage and selection operator) es una alternativa a los contrastes de significatividad

    • sin formalización estadística
  • Se puede estimar por MCO la especificación de variables seleccionadas por LASSO

    • sí podemos usarlo para causalidad

IMPORTANTE: Estandarización

  • Antes de aplicar regularización, SIEMPRE estandarizar las variables explicativas

  • ¿Por qué?

    • MCO es equivariante a escala.

    • Con regularización, los coeficientes sí dependen de las unidades

      • Se recompensa a los coeficientes cercanos a cero

      • Deben tener la misma escala (misma “cercanía a cero”)

  • Estandarización:

    • Media = 0
    • Desviación estándar = 1
    • Todos los coeficientes en la misma escala

\[ \widetilde{x}_{ij} = \frac{x_{ij} - \bar{x}_j}{\text{sd}(x_j)} \]

Eligiendo \(\lambda\): el hiperparámetro

  • \(\lambda\) controla cuánta penalización aplicamos:

    • \(\lambda = 0\): MCO estándar
    • \(\lambda\) mayor, más regularización (\(\lambda \to \infty\), todos los \(\beta \to 0\))
  • ¿Cómo elegimos \(\lambda\)?

    1. Elegir un rango de valores para \(\small \lambda\)

    2. Para cada valor de \(\small \lambda\), calcular el error promedio mediante validación cruzada

    3. Seleccionar \(\lambda^*\) con menor error promedio (probar varios rangos para encontrar forma de U)

    4. Volver a ajustar el modelo completo con \(\lambda^*\) en toda la muestra de entrenamiento

      • Regla de parsimonia: si varios \(\lambda\) tienen errores similares (dentro de 1 error estándar), elegir el \(\lambda\) más grande (modelo más simple)
    5. Evaluar en muestra de prueba (nunca usada antes)

Implementación en R: glmnet

En regresión lineal

library(mosaicData)
library(glmnet)
  • Preparar datos y ajustar el modelo
# 1. Datos como matrices
x <- model.matrix(data = RailTrail, 
                  volume ~ cloudcover + weekday + precip + poly(hightemp, 6))
# 2. Modelo
fit.lmreg <- glmnet(x = x, y = RailTrail$volume, 
                    family="gaussian", 
                    alpha = .5,      # 1=LASSO, 0=Ridge
                    lambda = 2)      # 0, 2, 10
fit.lmreg$beta
  • Validación cruzada para elegir lambda
set.seed(1)  
cv_modelo <- cv.glmnet(x, RailTrail$volume, alpha = 1, nfolds = 10)
cv_modelo 
cv_modelo |> plot()

mejor_lambda <- cv_modelo$lambda.min  # o lambda.1se

En regresión logística

censo <- read_csv("data/census.csv") |>
  mutate(across(where(is.character), ~parse_factor(.x)),
         income = if_else(income == ">50K", 1,  0))
  • Preparar datos y ajustar el modelo
# 1. Preparar datos como matrices
x <- model.matrix(data = censo, 
        income ~ race + poly(age, 3) + log(hours_per_week)*sex + 
          education*race + occupation)
# 2. Modelo
fit.glmreg <- glmnet(x = x, y = censo$income, 
                     family = "binomial",
                     lambda=0.001, alpha=1)
fit.glmreg$beta
  • Validación cruzada para elegir lambda
set.seed(1)  
cv_modelo <- cv.glmnet(x, censo$income, alpha = 1, nfolds = 10)
cv_modelo 
cv_modelo |> plot()

mejor_lambda <- cv_modelo$lambda.min  # o lambda.1se