の続きです。前回は線形モデルでglmnetのエンジンでsaralyを推測しました。結果はlmエンジンでの推測よりも少し悪い結果でした。線形モデルでの予測は難しそうなので、別のモデルでやってみようと思います。
k-NN法を使ってみます。
まず、kknnパッケージを読み込みます。
モデルを定義します。
レシピを定義します。
ワークフローを作成します。
クロスバリデーションの設定をします。
ハイパーパラメータのグリッドを作成します。
チューニングを実行します。
最適パラメータの選択
最終モデルを生成します。
predict()関数で、df_testのデータを使ってsaralyの予測をします。
実際の値と比べてみます。
グラフを描いてみましょう。
k-NN法での予測でも、実際のsaralyが大きいところは上手く予測できていないようです。
RMSEはどのくらいでしょうか?
RMSEは50.0と線形モデルをlmエンジンで予測したものよりも小さな値となりました。
今回は以上です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# 1. kknnパッケージを読み込む
library(kknn)
#
# 2. モデルを定義
kknn_model <- nearest_neighbor(mode = "regression",
neighbors = tune(),
weight_func = "rectangular") |>
set_engine("kknn")
kknn_model
#
# 3. レシピ定義(標準化など)
kknn_rec <- recipe(saraly ~ ., data = df_training) |>
step_normalize(all_numeric_predictors())
kknn_rec
#
# 4. ワークフロー作成
kknn_wf <- workflow() |>
add_model(kknn_model) |>
add_recipe(kknn_rec)
kknn_wf
#
# 5. クロスバリデーションの設定
set.seed(333)
kknn_folds <- vfold_cv(df_training, v = 5)
kknn_folds
#
#
# 6. グリッドの作成
kknn_grid_vals <- tibble(neighbors = seq(1, 31, by = 2))
kknn_grid_vals
#
# 7. チューニング実行
set.seed(951)
kknn_tuned <- tune_grid(
kknn_wf,
resamples = kknn_folds,
grid = kknn_grid_vals,
metrics = metric_set(rmse)
)
kknn_tuned
#
# 8. 最適パラメータの選択
kknn_best_params <- select_best(kknn_tuned, "rmse")
kknn_best_params
#
# 9. 最終モデルの作成と学習
set.seed(360)
kknn_final_wf <- finalize_workflow(kknn_wf, kknn_best_params)
kknn_final_fit <- fit(kknn_final_wf, data = df_training)
kknn_final_fit
#
# 11. df_testのデータで予測
predict(kknn_final_fit, new_data = df_test)
#
# 12. df_test の saraly と結合
df_test |> select(saraly) |>
bind_cols(predict(kknn_final_fit, new_data = df_test))
#
# 13. グラフ
df_test |> select(saraly) |>
bind_cols(predict(kknn_final_fit, new_data = df_test)) |>
ggplot(aes(x = saraly, y = .pred)) +
geom_point() +
geom_abline(intercept = 0, slope = 1, color = "red") +
coord_cartesian(xlim = c(100, 800), ylim = c(100, 800))
#
# 14. RMSEの計算
df_test |> select(saraly) |>
bind_cols(predict(kknn_final_fit, new_data = df_test)) |>
summarize(RMSE = sqrt(mean*1 |>
summarize(RMSE = sqrt(mean((saraly - .pred)^2)))
#
(冒頭の画像は Bing Image Creator で生成しました。プロンプトは "Closeup of blue and purple Cornflowers, background is blue sky, photograph" です。)
*1:saraly - .pred)^2)))
#
df_test |> select(saraly) |>
bind_cols(predict(lm_fit, new_data = df_test