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

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

UCI Machine Learning Repository の Maternal Health Risk のデータの分析4 - ランダムフォレストによる分類

Bing Image Creator で生成: Close up of Helleborus argutifolius flowers, background is snow mountains and green woods, photo

www.crosshyou.info

の続きです。今回はランダムフォレストのモデルを作ります。

まず、コアの数を確認します。

私のラップトップは、コアの数は8個でした。

次は、ランダムフォレストのモデルを設定します。

ランダムフォレストには、mtry, trees, min_n という3つのパラメータがあります。このうち、trees だけ1000に決めて、他はチューニングでベストな値を決めます。

続いて、レシピの設定をします。

前回の LASSO回帰と同じく、変数は標準化しておきます。ランダムフォレストは本当はその必要な無いようですが、とりあえずやっておきます。

そして、ワークフローを設定します。

パラメータチューニングをします。

show_best() で最適なパラメータを確認します。

mtry = 6, min_n = 5 が mean が 0.986 と一番大きな値です。

autoplot() でグラフを描きます。

select_best() でベストモデルを特定します。

ROC カーブを描きます。

LASSO 回帰の ROC カーブよりもよさそうですね。

LASSO 回帰の ROC カーブと重ねて表示します。

ランダムフォレストのほうが優れています。

mtry = 6, min_n = 5 で最終モデルを設定します。

最終ワークフローを設定します。

レシピは同じなので、モデルだけを更新しています。

モデルをフィットさせます。

このモデルの評価指標をみてみます。

accuracy が 0.925 なので、かなり正確に予想できるようです。

どの変数が重要なのかみてみます。

ROC Curve を描いてみましょう。

df_other のデータでモデルをフィットさせて、df_test のデータの予測をします。

予測結果をみてみます。

正解率は0.9249です。LASSO 回帰は、0.806 でしたのでかなり優れています。

high risk だけの正解率は、

0.838 とこちらも LASSO 回帰の 0.382 と比べると大幅に向上しています。

さすが、ランダムフォレストですね。

今回は以上です。

初めから読むには、

www.crosshyou.info

です。

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

#
# コアの数を確認
cores <- parallel::detectCores()
cores
#
# Random Forest Model
rf_mod <-
  rand_forest(mtry = tune(),
              min_n = tune(),
              trees = 1000) |> 
  set_engine("ranger", num.threads = cores) |> 
  set_mode("classification")
rf_mod
#
# レシピの設定
rf_recipe <-
  recipe(RiskLevel ~ ., data = df_other) |> 
  step_normalize(all_predictors())
rf_recipe
#
# ワークフローの設定
rf_workflow <-
  workflow() |> 
  add_model(rf_mod) |> 
  add_recipe(rf_recipe)
rf_workflow
#
# パラメータチューニング
set.seed(111)
rf_res <-
  rf_workflow |> 
  tune_grid(val_set,
            grid = 25,
            control = control_grid(save_pred = TRUE),
            metrics = metric_set(roc_auc))
#
# トップモデル
rf_res |> 
  show_best(metric = "roc_auc")
#
# グラフ
autoplot(rf_res)
#
# ベストモデルを特定
rf_best <-
  rf_res |> 
  select_best(metric = "roc_auc")
rf_best
#
# ROC Curve
rf_auc <-
  rf_res |> 
  collect_predictions(parameters = rf_best) |> 
  roc_curve(RiskLevel, .pred_high_risk) |> 
  mutate(model = "Random Forest")
autoplot(rf_auc)
#
# Logistic Regression と Random Forest の ROC Curve
bind_rows(rf_auc, lr_auc) |> 
  ggplot(aes(x = 1 - specificity, y = sensitivity, col = model)) +
  geom_path(lwd = 1.5, alpha = 0.8) +
  geom_abline(lty = 3) +
  coord_equal() +
  scale_color_viridis_d(option = "plasma", end = 0.6)
##
# 最終モデル
last_rf_mod <-
  rand_forest(mtry = 6,
              min_n = 5,
              trees = 1000) |> 
  set_engine("ranger",
             num.threads = cores,
             importance = "impurity") |> 
  set_mode("classification")
#
# 最終ワークフロー
last_rf_workflow <-
  rf_workflow |> 
  update_model(last_rf_mod)
#
# 最終フィット
set.seed(111)
last_rf_fit <-
  last_rf_workflow |> 
  last_fit(splits)
last_rf_fit
#
# 評価指標
last_rf_fit |> 
  collect_metrics()
#
# Variable Importance
last_rf_fit |> 
  extract_fit_parsnip() |> 
  vip()
#
# ROC Curve
last_rf_fit |> 
  collect_predictions() |> 
  roc_curve(RiskLevel, .pred_high_risk) |> 
  autoplot()
#
# Final Model
set.seed(111)
final_model <- last_rf_workflow |> 
  fit(df_other)
#
# df_test のデータセットで予測
predictions <- predict(final_model, df_test)
predictions
#
# 予測結果: Contingency Table
table(df_test$RiskLevel, predictions$.pred_class)
#
# 正解率
(57 + 177) / (57 + 177 + 11 + 8)
#
# high_risk の正解率
57 / (57 + 11)

#