
の続きです。今回からはいよいよ実際の分類をしていきます。今回は、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% でした。
今回は以上です。
次回は
です。
はじめから読むには、
です。
今回のコードは以下のとおりです。
#
# 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 です。)