Publicacion_lasso_ridge

11 minute read

Regresion Ridge VS Lasso

Regresión con regularización Lasso y Ridge

Cuando realizamos regresión lineal podemos en algunos casos querer ver la manera de regularizar nuestro modelo a manera de que nuestro modelo no sobreajuste o también con la finalidad de mejorar nuestra predicción en conjuntos de prueba

Otro de los puntos que también se toca es la seleccion de variables que formara nuestro modelo, existen varios metodos:

  • Stepwise Forward Regression
  • Stepwise Backward Regression
  • Backward-Forward Regresion (la mezcla de las 2 previas)
  • Exhastive Variable Selection

Para la seleccion del subconjunto de variables que mejor funciona podemos aplicar la regularizacion con penalizacion L1 también llamado Regularización Lasso, este método permite hacer la selección de variables reduciendo a cero las variables de poca importancia para el modelo y ademas funciona con mayor velocidad que los metodos previamente descritos

En cuanto al otro metodo de regularización Ridge (Penalizacion L2) no podemos categorizarlo como un metodo de selección de variables dado que aun y que hace que ciertas variables se encojan en su peso, no garantiza llevarla a ceros, por lo cual, siempre que se aplica el modelo resultante es un modelo con el mismo numero de variables de inicio, pero en el cual las variables que no aportan al modelo de regresión se encogen en su coeficiente

Las 2 formulaciones teoricas de las regresiones con penalizacion L1 y L2 (Lasso y Ridge) son las siguientes:

  • Lasso \(\sum_{i=1}^{n}(y_i-\beta_0-\sum_{j=1}^{p}\beta_jx_{ij})^2 + \lambda\sum_{j=1}^{p}|\beta_j| = RSS + \lambda\sum_{j=1}^{p}|\beta_j|\)

  • Ridge \(\sum_{i=1}^{n}(y_i-\beta_0-\sum_{j=1}^{p}\beta_jx_{ij})^2 + \lambda\sum_{j=1}^{p}\beta_j^2 = RSS + \lambda\sum_{j=1}^{p}(\beta_j)^2\)

Cuando hacer uso de un metodo de selección de variables o de regualarización

Dependiendo el objetivo del procedimiento que vayamos a realizar se podría sugerir un metodo con repecto a otro, y también dependiendo del tiempo que tengamos, dado que hay metodos muy costosos computacionalmente hablando

Si nuestro objetivo es realizar un forecasting quizas la mejor opcion sea probar varios metodos realizar validación cruzada y quedarnos con el que menor valor reporté en la funcion de perdida que elijamos (MSE,RMSE,etc…)

Si nuestro objetivo es interpretación de entrada quizas no sea buena opcción el metodo Ridge, dado que si tenemos un problema con muchas variables al finalizar nuestro modelo tendremos el mismo numero y será dificil de poder interpretar, aqui serías mas conveniente ver alguno de los metodos de selección de variables, aunque si es un problema con muchas variables no será buena opción usar el metodo exhaustivo (Revisar todos los modelos de subconjuntos posibles de variables \(2^n\) modelos posibles) quizas viendolo en tiempo y con la finalidad de interpretación se optaria por Lasso

El problema a analizar

Para revisar los 2 metodos de regularización Lasso y Ridge checare como funciona sobre un conjunto de datos, quizas no es posible con solo un conjunto de datos decir que uno le ganaa al otro pero la idea es ver como funcionan

Los datos a revisar es el conjunto de datos Carseats de la librería ISLR, como nota esta librería pertenece a un excelente libro Introduction to Statical Learning with R el cual recomiendo ampliamente

Vamos a explorar un poco el conjunto de datos que analizaremos

library(ISLR)
library(leaps)
library(glmnet)
## Loading required package: Matrix
## Loading required package: foreach
## Loaded glmnet 2.0-16
data("Carseats")
##Que variables tenemos
colnames(Carseats)
##  [1] "Sales"       "CompPrice"   "Income"      "Advertising" "Population" 
##  [6] "Price"       "ShelveLoc"   "Age"         "Education"   "Urban"      
## [11] "US"
## tipos de datos de las variables
sapply(Carseats, class)
##       Sales   CompPrice      Income Advertising  Population       Price 
##   "numeric"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric" 
##   ShelveLoc         Age   Education       Urban          US 
##    "factor"   "numeric"   "numeric"    "factor"    "factor"
tipos_variables <-sapply(Carseats, class) 
variables_numericas <- names(tipos_variables[tipos_variables=="numeric"])

# un summary de las variables numericas para ver sus rangos medias etc...
summary(Carseats)
##      Sales          CompPrice       Income        Advertising    
##  Min.   : 0.000   Min.   : 77   Min.   : 21.00   Min.   : 0.000  
##  1st Qu.: 5.390   1st Qu.:115   1st Qu.: 42.75   1st Qu.: 0.000  
##  Median : 7.490   Median :125   Median : 69.00   Median : 5.000  
##  Mean   : 7.496   Mean   :125   Mean   : 68.66   Mean   : 6.635  
##  3rd Qu.: 9.320   3rd Qu.:135   3rd Qu.: 91.00   3rd Qu.:12.000  
##  Max.   :16.270   Max.   :175   Max.   :120.00   Max.   :29.000  
##    Population        Price        ShelveLoc        Age       
##  Min.   : 10.0   Min.   : 24.0   Bad   : 96   Min.   :25.00  
##  1st Qu.:139.0   1st Qu.:100.0   Good  : 85   1st Qu.:39.75  
##  Median :272.0   Median :117.0   Medium:219   Median :54.50  
##  Mean   :264.8   Mean   :115.8                Mean   :53.32  
##  3rd Qu.:398.5   3rd Qu.:131.0                3rd Qu.:66.00  
##  Max.   :509.0   Max.   :191.0                Max.   :80.00  
##    Education    Urban       US     
##  Min.   :10.0   No :118   No :142  
##  1st Qu.:12.0   Yes:282   Yes:258  
##  Median :14.0                      
##  Mean   :13.9                      
##  3rd Qu.:16.0                      
##  Max.   :18.0
#Ver si existen relaciones cercanamente lineales
pairs(Carseats[variables_numericas])

Primero usando mejor subconjunto (Exahustivo)

Dado que tenemos pocas variables, podemos darnos el lujo de realizar la seleccion del mejor subconjunto de variables, checando los \(2^p\) submodelos posibles

library(ISLR)
library(leaps)
library(glmnet)

data("Carseats")

x<-model.matrix(Sales~.,data = Carseats)[,-1]

# CReamos un nuevo data frame con las variables categoricas convertidas a dummies
Carseats_new<-data.frame(Sales=Carseats$Sales,x)
colnames(Carseats_new)
##  [1] "Sales"           "CompPrice"       "Income"         
##  [4] "Advertising"     "Population"      "Price"          
##  [7] "ShelveLocGood"   "ShelveLocMedium" "Age"            
## [10] "Education"       "UrbanYes"        "USYes"
## tomar 80% para entrenamiento y 20 para test (Los porcentajes mas comunes 80-20 o 70-30)
set.seed(123)
train<-sample(nrow(Carseats_new),nrow(Carseats_new)*.8)
#train

####  Mejor subconjunto

mejores_modelos_ex<-regsubsets(Sales~.,data =Carseats_new,subset=train,nvmax = 11,method =  "exhaustive",nbest = 1)
summ_ex<-summary(mejores_modelos_ex)
summ_ex$adjr2
##  [1] 0.2292493 0.4664869 0.6056609 0.6940840 0.7722060 0.8459569 0.8697723
##  [8] 0.8699916 0.8698297 0.8695204 0.8691000
summ_ex$cp
##  [1] 1556.412034  978.006512  639.956946  426.161481  238.427109
##  [6]   62.338356    6.397615    6.881785    8.271981   10.007667
## [11]   12.000000
summ_ex$bic
##  [1]  -72.79295 -185.75456 -277.72445 -354.21863 -443.82585 -564.26520
##  [7] -613.26419 -609.06242 -603.92648 -598.43264 -592.67229
#summ_ex$which
MSE_trainning<-summ_ex$rss/nrow(Carseats_new[train,])

best_modelo<-which.min(summ_ex$bic)
which.min(summ_ex$cp)
## [1] 7
which.max(summ_ex$adjr2)
## [1] 8
## el mejor submodelo considerando bic seria de 7 variables predictoras

library(ggplot2)
p <- ggplot(data = data.frame(n_predictores = 1:11,
                              bic_ex = summ_ex$bic[1:11]),
            aes(x = n_predictores, y = bic_ex)) +
  geom_line(color="green") +
  geom_point(color="green")+
  xlab("# Predictores")+
  ylab("Valor BIC")
p