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

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

賃金構造基本調査のデータ分析 8 - tidymodelsのkknnエンジンでk-NN法による回帰分析。線形モデルよりも良い結果に。

www.crosshyou.info

の続きです。前回は線形モデルでglmnetのエンジンでsaralyを推測しました。結果はlmエンジンでの推測よりも少し悪い結果でした。線形モデルでの予測は難しそうなので、別のモデルでやってみようと思います。

k-NN法を使ってみます。

まず、kknnパッケージを読み込みます。

モデルを定義します。

レシピを定義します。

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

クロスバリデーションの設定をします。

ハイパーパラメータのグリッドを作成します。

チューニングを実行します。

最適パラメータの選択

最終モデルを生成します。

predict()関数で、df_testのデータを使ってsaralyの予測をします。

実際の値と比べてみます。

グラフを描いてみましょう。

k-NN法での予測でも、実際のsaralyが大きいところは上手く予測できていないようです。

RMSEはどのくらいでしょうか?

RMSEは50.0と線形モデルをlmエンジンで予測したものよりも小さな値となりました。

今回は以上です。

はじめから読むには、

www.crosshyou.info

です。

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

#
# 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