
の続きです。
今回は、第7回目で試した、Elastic-Netモデルを少し発展させて、交差項と多項式項を加えてみます。
レシピに、step_interact()とstep_poly()を加えるだけです。

ワークフローを作成します。

モデルは同じglmnet_modを使うことができます。
チューングリッドも同じものを使ってチューニングします。

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

交差項と多項式項の無いモデルの最適なパラメータも表示してみました(glmnet_params)。penalty, mixture ともに正反対であるのが面白いですね。
最終ワークフローを作成します。

トレーニング用データで学習します。

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

実際の値と予測値を一つのデータフレームにします。

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

交差項と多項式項を加えて今回のモデルのほうが、RMSEは、18.4 >> 17.6と低下し、R-squareは0.476 >> 0.523と上昇し、MAEは16.0 >> 15.5と低下していて、今回のモデルのほうが良い予測結果が得られました。
モデル推計結果の係数を確認します。

交差項と多項式項を加えて、予測結果を向上させることができました。
今回は以上です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# Elastic-Netに交互作用項と多項式項を追加する
#
# レシピの作成(_rec)
glmnet2_rec <- recipe(microwave ~ year + l_mitsudo + conve + single + income,
data = train_data) |>
step_dummy(all_nominal_predictors()) |>
step_normalize(all_predictors()) |>
step_interact(terms = ~ l_mitsudo:conve) |>
step_poly(single, income, degree = 3)
glmnet2_rec
#
# ワークフローの作成(_wf)
glmnet2_wf <- workflow() |>
add_model(glmnet_mod) |>
add_recipe(glmnet2_rec)
#
# チューニングの実行(_tuned)
glmnet2_tuned <- tune_grid(
glmnet2_wf,
resamples = folds, # 全モデル共通のフォールドを使用
grid = glmnet_grid # glmnetと同じグリッドを使用
)
#
# 最適なパラメータ(_params)
glmnet2_params <- select_best(glmnet2_tuned, metric = "rmse")
glmnet2_params
glmnet_params
#
# 最終ワークフローを作成(_final_wf)
glmnet2_final_wf <- finalize_workflow(
glmnet2_wf,
glmnet2_params
)
#
# トレーニング用データで学習(_fit)
glmnet2_fit <- fit(glmnet2_final_wf, train_data)
#
# テスト用のデータで予測(_pred)
glmnet2_pred <- predict(glmnet2_fit, new_data = test_data)
#
# 実際の値と予測値(_result)
glmnet2_result <- test_data |>
select(microwave) |>
bind_cols(glmnet2_pred)
glmnet2_result
#
# 評価(_metric)
glmnet2_metric <- glmnet2_result |>
metrics(truth = microwave, .pred) |>
mutate(model = "Elastic-Net V2")
glmnet2_metric
glmnet_metric
#
#
# 係数の確認
extract_fit_parsnip(glmnet2_fit) |> tidy()
#
extract_fit_parsnip(glmnet_fit) |> tidy
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Looking up natural green field, red rose flowers and blue sky, photo です。