Regressione Lasso

Riduzione della dimensionalità in R

Matt Pickard

Owner, Pickard Predictives, LLC

Panoramica sulla Lasso regression

  • Selezione supervisionata delle feature
  • Regolarizzazione L1
  • Penalizza i coefficienti della regressione
  • Riduce i coefficienti
  • Quelli meno importanti si riducono a zero
  • Selezione delle feature “naturale”
linear_reg(engine = "glmnet", penalty = 0.001 , mixture = 1)
Riduzione della dimensionalità in R

Standardizza i dati

  • Standardizza prima i dati: la penalty si applica in modo uniforme
  • Usa scale() per la variabile target
    • restituisce una matrice: converti in vettore con as.vector()
  • Usa step_normalize() per le variabili predittive

Esempio

# Scala la variabile target
df <- df %>% mutate(target = as.vector(scale(target))) 
... 
# Scala le variabili predittive
recipe() %>% step_normalize(all_numeric_predictors()) 
Riduzione della dimensionalità in R

Scelta del valore di penalty

  • La penalty è un iperparametro da ottimizzare
  • Cerca il valore di penalty migliore
  • Usa tune() in tidymodels
linear_reg(engine = "glmnet", penalty = tune() , mixture = 1)
Riduzione della dimensionalità in R

Prepara i dati

Scala la variabile target
house_sales_subset_df <- house_sales_subset_df %>% 
  mutate(price = as.vector(scale(price)))
Crea training e test set
split <- initial_split(house_sales_subset_df, prop = 0.8)
train <- split %>% training()
test <-  split %>% testing()
Riduzione della dimensionalità in R

Crea una recipe

Crea una recipe
lasso_recipe <- 
  recipe(price ~ ., data = train) %>% 
  step_normalize(all_numeric_predictors()) 
Riduzione della dimensionalità in R

Crea il workflow

Crea la specifica del modello
lasso_model <- linear_reg(penalty = 0.01, mixture = 1, engine = "glmnet")
Crea il workflow
lasso_workflow <- workflow(preprocessor = lasso_recipe, spec =  lasso_model)
Riduzione della dimensionalità in R

Allena il workflow

tidy(lasso_workflow %>% fit(train)) %>% filter(estimate > 0)
# A tibble: 9 × 3
  term          estimate penalty
  <chr>            <dbl>   <dbl>
1 bathrooms      0.0477     0.01
2 sqft_living    0.434      0.01
3 floors         0.0262     0.01
4 waterfront     0.133      0.01
5 view           0.0510     0.01
6 condition      0.0319     0.01
...              ...        ...
Riduzione della dimensionalità in R

Crea un workflow sintonizzabile

Crea una specifica del modello sintonizzabile
lasso_model <- linear_reg(penalty = tune(), mixture = 1, engine = "glmnet")
lasso_workflow <- workflow(preprocessor = lasso_recipe, spec =  lasso_model)
Crea il campione di training CV
train_cv <- vfold_cv(train, v = 5)
Crea una griglia di valori di penalty
penalty_grid <- grid_regular(penalty(range = c(-3, -1)), levels = 20)
  • Un intervallo di penalty da 0.001 a 0.1 si indica con range = c(-3, -1)
Riduzione della dimensionalità in R

Allena una griglia di modelli

Crea la griglia di modelli allenati
lasso_grid <- tune_grid(
  lasso_workflow,
  resamples = train_cv,
  grid = penalty_grid)
Traccia le performance
autoplot(lasso_grid, metric = "rmse")
Riduzione della dimensionalità in R

Grafico performance vs penalty

grafico performance vs penalty

Riduzione della dimensionalità in R

Finalizza il modello

Recupera la penalty del modello migliore
best_rmse <- lasso_grid %>% select_best("rmse")
Rifitta il modello migliore
final_lasso <- 
  finalize_workflow(lasso_workflow, best_rmse) %>% 
  fit(train)
Mostra i coefficienti del modello migliore
tidy(final_lasso) %>% filter(estimate > 0)
Riduzione della dimensionalità in R

Passons à la pratique !

Riduzione della dimensionalità in R

Preparing Video For Download...