ラッソ回帰

Rによる次元削減

Matt Pickard

Owner, Pickard Predictives, LLC

ラッソ回帰の概要

  • 教師ありの特徴選択
  • L1正則化
  • 回帰係数に罰則を課す
  • 係数を縮小
  • 重要度の低い係数は0へ縮小
  • 自然に特徴選択を行う
linear_reg(engine = "glmnet", penalty = 0.001 , mixture = 1)
Rによる次元削減

データを標準化

  • 先に標準化し、罰則が特徴量間で等しく効くようにする
  • 目的変数には scale() を使用
    • 行列を返すため、as.vector() でベクトル化
  • 説明変数には step_normalize() を使用

# 目的変数をスケール
df <- df %>% mutate(target = as.vector(scale(target))) 
... 
# 説明変数をスケール
recipe() %>% step_normalize(all_numeric_predictors()) 
Rによる次元削減

罰則値の選び方

  • 罰則は最適化すべきハイパーパラメータ
  • 最適な罰則値を探索
  • tidymodelstune() を使用
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...