
の続きです。前回は glmnet で elastic-lasso でtypeを分類してみました。今回は kknn でk-NN で分類してみます。今回も tidymodels パッケージのワークフローで分類しますので、おおまかな流れは同じです。
まず、レシピ を作成します。

前処理は glmnet のときと同じです。step_zv()だけ追加しました。ゼロ・バリアンスの変数を削除するものですが、実際はゼロ・バリアンスの変数は無いのであってもなくてもおんなじです。
次はモデルを作ります。

nearest_neighbor()関数で、エンジンは kknn です。k の数などがチューニングのパラメータです。
次は、レシピとモデルを結合してワークフローを作ります。ほんとはレシピは前回のレシピがそのまま使えるので、今回のstep1は省いてもよかったですね。これがtidymodelsのいいところですね。

次はクロスバリデーションの設定です。前回のものを使います。ただし、名前だけ変えておきます。

チューニング・グリッドを作成します。今回は grid_regular()関数でなくて、crossing()で全ての組み合わせを試します。

tune_grid()関数でチューニングします。

最適なパラメータを確認します。

k = 8, triangular, 2 の組み合わせが最適なパラメータでした。
このパラメータで最終ワークフローを作ります。

fit()関数でモデルをフィットします。

predict()関数でテスト用のデータの予測をします。

予測結果をみてみましょう。混合行列を作ります。

正解率はどのくらいでしょうか?

前回と同じ92%の正解率でした。
今回は以上です。
次回は
です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# k-NNで分類する方法
# Step 1: レシピ作成
knn_rec <- recipe(type ~ date + amt + series, data = df_train) |>
step_dummy(all_nominal_predictors()) |>
step_zv(all_predictors()) |>
step_normalize(all_numeric_predictors())
#
# Step 2: モデル作成
knn_mod <- nearest_neighbor(
mode = "classification",
neighbors = tune(), # kをチューニング
weight_func = tune(), # 重み付けもチューニング
dist_power = tune() # 距離のpもチューニング
) |>
set_engine("kknn")
#
# Step 3: ワークフロー作成
knn_wf <- workflow() |>
add_recipe(knn_rec) |>
add_model(knn_mod)
#
# Step 4: クロスバリデーションの設定
knn_folds <- glmnet_folds # glmnetのものを使う
#
# Step 5: チューングリッド作成
knn_grid <- crossing(
neighbors = 3:25,
weight_func = c("rectangular", "triangular", "gaussian"),
dist_power = c(1, 2)
)
#
# Step 6: チューニング実行
knn_tuned <- tune_grid(
knn_wf,
resamples = knn_folds,
grid = knn_grid,
metrics = metric_set(accuracy, roc_auc)
)
#
# Step 7: ベストパラメータ
knn_params <- select_best(knn_tuned, metric = "accuracy")
knn_params
#
# Step 8: 最終ワークフロー
knn_final_wf <- finalize_workflow(knn_wf, knn_params)
#
# Step 9: 最終fit
knn_fit <- fit(knn_final_wf, data = df_train)
#
# Step 10: テスト用のデータで予測
knn_pred <- predict(knn_fit, new_data = df_test)
knn_pred
#
# Step 11: Confusion Matrix
knn_cm <- table(knn_pred$.pred_class, df_test$type)
knn_cm
#
# Step 12: 正解率
knn_accuracy <- sum(diag(knn_cm)) / sum(knn_cm)
knn_accuracy
glmnet_accuracy
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Amazing landscape of beautiful natural green grass field under the blue sky, there are a few high mountains far away, close up of cherry flowers tree. Photo です。)