Lasso-регрессия

Снижение размерности в R

Matt Pickard

Owner, Pickard Predictives, LLC

Обзор Lasso-регрессии

  • Отбор признаков с учителем
  • L1-регуляризация
  • Штрафует коэффициенты регрессии
  • Уменьшает коэффициенты
  • Менее важные коэффициенты обнуляются
  • Автоматически выполняет отбор признаков
linear_reg(engine = "glmnet", penalty = 0.001 , mixture = 1)
Снижение размерности в R

Стандартизация данных

  • Сначала стандартизируйте данные, чтобы штраф применялся равномерно ко всем признакам
  • Используйте scale() для целевой переменной
    • возвращает матрицу, поэтому преобразуйте в вектор с помощью as.vector()
  • Используйте step_normalize() для переменных-предикторов

Пример

# Scale target variable
df <- df %>% mutate(target = as.vector(scale(target))) 
... 
# Scale predictor variables
recipe() %>% step_normalize(all_numeric_predictors()) 
Снижение размерности в R

Выбор значения штрафа

  • Штраф — гиперпараметр, который нужно оптимизировать
  • Найдите наилучшее значение штрафа
  • Используйте tune() в tidymodels
linear_reg(engine = "glmnet", penalty = tune() , mixture = 1)
Снижение размерности в R

Подготовка данных

Масштабирование целевой переменной
house_sales_subset_df <- house_sales_subset_df %>% 
  mutate(price = as.vector(scale(price)))
Создание обучающей и тестовой выборок
split <- initial_split(house_sales_subset_df, prop = 0.8)
train <- split %>% training()
test <-  split %>% testing()
Снижение размерности в R

Создание рецепта

Создание рецепта
lasso_recipe <- 
  recipe(price ~ ., data = train) %>% 
  step_normalize(all_numeric_predictors()) 
Снижение размерности в R

Создание рабочего процесса

Создание спецификации модели
lasso_model <- linear_reg(penalty = 0.01, mixture = 1, engine = "glmnet")
Создание рабочего процесса
lasso_workflow <- workflow(preprocessor = lasso_recipe, spec =  lasso_model)
Снижение размерности в R

Обучение рабочего процесса

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
...              ...        ...
Снижение размерности в R

Создание настраиваемого рабочего процесса

Создание настраиваемой спецификации модели
lasso_model <- linear_reg(penalty = tune(), mixture = 1, engine = "glmnet")
lasso_workflow <- workflow(preprocessor = lasso_recipe, spec =  lasso_model)
Создание выборки для кросс-валидации
train_cv <- vfold_cv(train, v = 5)
Создание сетки значений штрафа
penalty_grid <- grid_regular(penalty(range = c(-3, -1)), levels = 20)
  • Диапазон штрафа от 0,001 до 0,1 задаётся как range = c(-3, -1)
Снижение размерности в R

Обучение сетки моделей

Создание сетки обученных моделей
lasso_grid <- tune_grid(
  lasso_workflow,
  resamples = train_cv,
  grid = penalty_grid)
Визуализация качества моделей
autoplot(lasso_grid, metric = "rmse")
Снижение размерности в R

График качества в зависимости от штрафа

график качества в зависимости от штрафа

Снижение размерности в R

Финализация модели

Получение значения штрафа для лучшей модели
best_rmse <- lasso_grid %>% select_best("rmse")
Повторное обучение лучшей модели
final_lasso <- 
  finalize_workflow(lasso_workflow, best_rmse) %>% 
  fit(train)
Отображение коэффициентов лучшей модели
tidy(final_lasso) %>% filter(estimate > 0)
Снижение размерности в R

Давайте потренируемся!

Снижение размерности в R

Preparing Video For Download...