Regressão Lasso

Redução de Dimensionalidade em R

Matt Pickard

Owner, Pickard Predictives, LLC

Visão geral da regressão Lasso

  • Seleção de variáveis supervisionada
  • Regularização L1
  • Penaliza os coeficientes da regressão
  • Encolhe coeficientes
  • Coeficientes menos importantes vão a zero
  • Faz seleção de variáveis naturalmente
linear_reg(engine = "glmnet", penalty = 0.001 , mixture = 1)
Redução de Dimensionalidade em R

Padronizar dados

  • Padronize os dados primeiro, assim a penalidade vale igualmente para todas as variáveis
  • Use scale() para a variável alvo
    • retorna matriz; converta para vetor com as.vector()
  • Use step_normalize() para as variáveis preditoras

Exemplo

# Escalar a variável alvo
df <- df %>% mutate(target = as.vector(scale(target))) 
... 
# Escalar as variáveis preditoras
recipe() %>% step_normalize(all_numeric_predictors()) 
Redução de Dimensionalidade em R

Escolhendo um valor de penalidade

  • A penalidade é um hiperparâmetro a otimizar
  • Busque o melhor valor de penalidade
  • Use tune() no tidymodels
linear_reg(engine = "glmnet", penalty = tune() , mixture = 1)
Redução de Dimensionalidade em R

Preparando os dados

Escale a variável alvo
house_sales_subset_df <- house_sales_subset_df %>% 
  mutate(price = as.vector(scale(price)))
Crie os conjuntos de treino e teste
split <- initial_split(house_sales_subset_df, prop = 0.8)
train <- split %>% training()
test <-  split %>% testing()
Redução de Dimensionalidade em R

Criar uma receita

Crie uma receita
lasso_recipe <- 
  recipe(price ~ ., data = train) %>% 
  step_normalize(all_numeric_predictors()) 
Redução de Dimensionalidade em R

Criar o workflow

Crie a especificação do modelo
lasso_model <- linear_reg(penalty = 0.01, mixture = 1, engine = "glmnet")
Crie o workflow
lasso_workflow <- workflow(preprocessor = lasso_recipe, spec =  lasso_model)
Redução de Dimensionalidade em R

Ajustar o 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
...              ...        ...
Redução de Dimensionalidade em R

Criar um workflow de modelo ajustável

Crie uma especificação de modelo ajustável
lasso_model <- linear_reg(penalty = tune(), mixture = 1, engine = "glmnet")
lasso_workflow <- workflow(preprocessor = lasso_recipe, spec =  lasso_model)
Crie a amostra de treino com validação cruzada
train_cv <- vfold_cv(train, v = 5)
Crie a grade de valores de penalidade
penalty_grid <- grid_regular(penalty(range = c(-3, -1)), levels = 20)
  • Um intervalo de penalidade de 0,001 a 0,1 é especificado como range = c(-3, -1)
Redução de Dimensionalidade em R

Ajustar uma grade de modelos

Crie uma grade de modelos ajustados
lasso_grid <- tune_grid(
  lasso_workflow,
  resamples = train_cv,
  grid = penalty_grid)
Plote o desempenho dos modelos
autoplot(lasso_grid, metric = "rmse")
Redução de Dimensionalidade em R

Gráfico de desempenho por penalidade

gráfico de desempenho por penalidade

Redução de Dimensionalidade em R

Finalizar o modelo

Obtenha o valor de penalidade do melhor modelo
best_rmse <- lasso_grid %>% select_best("rmse")
Reajuste o melhor modelo
final_lasso <- 
  finalize_workflow(lasso_workflow, best_rmse) %>% 
  fit(train)
Mostre os coeficientes do melhor modelo
tidy(final_lasso) %>% filter(estimate > 0)
Redução de Dimensionalidade em R

Vamos praticar!

Redução de Dimensionalidade em R

Preparing Video For Download...