Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

都道府県別の電子レンジ所有数量のデータの分析7 - Elastic-Netのモデルで予測をする

www.crosshyou.info

の続きです。前回は普通の線形モデルで予測しました。今回はElastic-Net、正則化付きの線形モデルで予測してみましょう。

まず、recipe()関数でレシピを作成します。

Elastic-Netでは数値型の変数は標準化しておきます。

次にモデルを作成します。

penaltyとmixtureはあとからチューニングで最適なパラメータを決めるので、この段階では、tune()としておきます。

レシピとモデルを合わせてワークフローを作成します。

クロスバリデーションでチューニングをするので、そのためのバリデーションのデータ(folds)を作ります。

チューニング・グリッドの作成をします。

tune_grid()関数でチューニングします。

最適なパラメータを確認します。

最適なパラメータを使って、最終ワークフローを作成します。

この最終ワークフローを用いて、トレーニング用データで学習します。

テスト用のデータで予測します。

実際の電子レンジ所有数量と予測値を合わせて一つのデータフレームにします。

metrics()関数で、RMSEなどを算出します。

前回の単純な線形モデルとほとんど同じ評価指標ですね。

今回は以上です。

次回は、

www.crosshyou.info

です。

はじめから読むには、

 

www.crosshyou.info

です。

今回のコードは以下になります。

#
# Elastic-Net(正則化付きの線形回帰)
#
# レシピを作成(_rep)
glmnet_rec <- recipe(microwave ~ year + l_mitsudo + conve + single + income,
                     data = train_data) |> 
  step_dummy(all_nominal_predictors()) |> 
  step_normalize(all_predictors())
glmnet_rec
#
# モデルを作成(_mod)
glmnet_mod <- linear_reg(
  penalty = tune(), # lambda
  mixture = tune()  # alpha
) |> 
  set_engine("glmnet")
glmnet_mod
#
# ワークフローを作成(_wf)
glmnet_wf <- workflow() |> 
  add_recipe(glmnet_rec) |> 
  add_model(glmnet_mod)
glmnet_wf
#
# クロスバリデーションのfoldsを作成(全モデル共通)
set.seed(987)
folds <- vfold_cv(train_data, v = 5)
folds
#
# チューニンググリッドの作成(_grid)
glmnet_grid <- grid_regular(
  penalty(range = c(-4, 0)),
  mixture(range = c(0.001, 0.999)),
  levels = 10
)
glmnet_grid
#
# チューニングの実行(_tuned)
glmnet_tuned <- tune_grid(
  glmnet_wf,
  resamples = folds,
  grid = glmnet_grid
)
glmnet_tuned
#
# 最適パラメータ(_params)
glmnet_params <- select_best(glmnet_tuned, metric = "rmse")
glmnet_params
#
# 最終ワークフローを作成(_final_wf)
glmnet_final_wf <- finalize_workflow(
  glmnet_wf,
  glmnet_params

glmnet_final_wf
#
# トレーニング用データで学習(_fit)
glmnet_fit <- fit(glmnet_final_wf, train_data)
#
# テスト用のデータで予測(_pred)
glmnet_pred <- predict(glmnet_fit, new_data = test_data)
#
# 実際の値と予測値(_result)
glmnet_result <- test_data |> 
  select(microwave) |> 
  bind_cols(glmnet_pred)
glmnet_result
#
# 評価(_metric)
glmnet_metric <- glmnet_result |> 
  metrics(truth = microwave, .pred) |> 
  mutate(model = "Elastic_Net")
glmnet_metric
lm_metric
#

(冒頭の画像は、Bing Image Creatorで生成しました。プロンプトは、Lovley landscape of nature green grass field, close up of yellow Chrysanthemum flowers, there are high mountains in far away, photo です。)