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

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

UCI Machine Learning Repository の Obesity データの分析5 - k-NNによる分類。正解率は 87.6%

www.crosshyou.info

の続きです。今回からはいよいよ実際の分類をしていきます。今回は、k-NN で分類してみます。

tidymodelsパッケージのワークフローに沿って実行します。

まず、tidymodelsパッケージを読み込んでおきます。

次は、トレーニング用のデータとテスト用のデータを分けます。

strata = obesity としているので、obesity のタイプの比率はトレーニング用とテスト用のデータでだいたい同じになっているはずです。確認します。

トレーニング用とテスト用のデータで同じくらいの比率ですね。

次は、レシピの作成です。

step_dummy()で文字型の変数をダミー変数にしています。step_normaize()で標準化しています。step_zv()で分散ゼロの変数を除外しています。レシピは他のモデルでも使う共通レシピです。

モデルを作成します。

k-NN は nearest_neighbor() で エンジンを kknn にします。分類なので、mode = "classification" で分類にしています。

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

クロスバリデーションのためのフォールドを作成します。フォールドも全モデル共通です。

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

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

最良パラメータを取り出します。

最良パラメータで最良モデルを作ります。

最良モデルの学習をします。

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

上の結果を見ると、4, 5, 7, 10行目は正しく予測していますね。
混合行列を作成してみます。

少しわかりにくいので、正解のところは青枠で囲みました。なかなか正解しているのではないでしょうか?

正解率を計算します。

正解率は、87.6% でした。

今回は以上です。

次回は

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下のとおりです。

#
# tidymodelsの読み込み
library(tidymodels)
#
#
# トレーニング用とテスト用のデータに分ける
set.seed(123)
splits <- initial_split(df, prop = 0.7, strata = obesity)
df_train <- training(splits)
df_test <- testing(splits)
#
# df_train の obesityの比率
df_train |> 
  count(obesity) |> 
  mutate(prop = n / sum(n))
#
# df_test の obesity の比率
df_test |> 
  count(obesity) |> 
  mutate(prop = n / sum(n))
#
# 一つ目の推測方法 - k-NN法
# レシピの作成
rec <- recipe(obesity ~ ., data = df_train) |> 
  step_dummy(all_nominal_predictors()) |> 
  step_normalize(all_predictors()) |> 
  step_zv()
#
# モデルの作成
knn_mod <- nearest_neighbor(
  mode = "classification",
  neighbors = tune(),
  weight_func = "rectangular",
  dist_power = tune()
) |> 
  set_engine("kknn")
#
# ワークフローの作成
knn_wf <- workflow() |> 
  add_recipe(rec) |> 
  add_model(knn_mod)
#
# Cvのフォールドを作成
set.seed(12321)
folds <- vfold_cv(df_train, v = 5, strata = obesity) 
#
# チューニンググリッドの作成
knn_grid <- grid_regular(
  neighbors(range = c(1, 25)),
  dist_power(range = c(1, 3)),
  levels = 5
)
#
# チューニングの実行
set.seed(1)
knn_tuned <- tune_grid(
  knn_wf,
  resamples = folds,
  grid = knn_grid,
  metrics = metric_set(accuracy)
)
#
# 最良のパラメータ
knn_params <- select_best(knn_tuned, metric = "accuracy")
knn_params
#
# 最良モデル
knn_final_wf <- finalize_workflow(
  knn_wf,
  knn_params
)
#
# 最良モデルで学習
knn_fit <- fit(knn_final_wf, data = df_train)
#
# テスト用のデータで予測
knn_pred <- predict(knn_fit, new_data = df_test) |> 
  bind_cols(df_test |> select(obesity))
knn_pred
#
# 予測結果の混合行列
conf_mat(knn_pred, truth = obesity, estimate = .pred_class)
#
# 予測結果の正解率
accuracy(knn_pred, truth = obesity, estimate = .pred_class)
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Natural landscape of long distance high mountains, close up of a yellow Forsythia Golden bells flower, photo です。)