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

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

都道府県別の電子レンジ所有数量のデータの分析9 - Elastic-Netモデルに交差項と多項式項をモデルを加える。

www.crosshyou.info

の続きです。

今回は、第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と低下していて、今回のモデルのほうが良い予測結果が得られました。

モデル推計結果の係数を確認します。

交差項と多項式項を加えて、予測結果を向上させることができました。

今回は以上です。

はじめから読むには、

 

www.crosshyou.info

です。

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

#
# 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 です。