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

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

UCI Machine Learning Repository の Credit Approval のデータの分析3 - R でロジスティクス回帰でクラシフィケーション

Bing Image Creator で生成: Close up of blue Hyacinthus orientalis flowers, background is long wide view of wild green grass fields, photo

 

www.crosshyou.info

の続きです。前回まででデータフレームの前処理は終わりました。今回からは具体的にマシーンラーニングをしていきます。

まず、データフレームをトレーニング用とテスト用に分けます。

トレーニング用を 500 の観測数、残りをテスト用にしました。

両者の approved の比率に大きな違いが無いかを確認します。

p-value が 0.9248 なので違いがあるとは言えません。トレーニング用のほうは、approved が 1 の比率は 0.45 で、テスト用のほうは、0.4457831 です。

今回は tidymodels パッケージを利用してみます。

まずは、library() 関数でパッケージを読み込みます。

はじめはロジスティクス回帰でやってみます。

Fitting and predicting with parsnip • parsnip

にある、logistic_reg() models の "glm" engine を参考にしてやってみます。

まず、モデルを生成します。

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

あ、approved はファクター型になっていないとダメなようです。

ファクター型に変換します。

もう一度、モデルをフィットします。

predict() 関数で df_test の approved を予測します。

予測結果をみてみましょう。

Tidy Characterizations of Model Performance • yardstick

を参考にしています。まずは、metrics() 関数を使ってみます。

正解率は 83.7% です。 kap というのは何かわからないです。

table() 関数で表を作成してみます。

(75 + 64) / (75 + 64 + 10 + 17) = 83.7349% です。

roc_auc() 関数も使ってみます。

ROC は 0.902 でした。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

初めから読むには、

www.crosshyou.info

です。

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

#
# df をトレーニング用とテスト用に分ける
set.seed(179)
index <- sample(1:nrow(df), 500, replace = FALSE)
df_train <- df[index, ]
df_test <- df[-index, ]
#
# df_train と df_test の approved の比較
t.test(
  df_train$approved,
  df_test$approved
)
#
# tidymodels パッケージを読み込む
library(tidymodels)
#
# ロジスティクスモデル
logreg_cls_spec <-
  logistic_reg() |> 
  set_engine("glm")
logreg_cls_spec
#
# モデルをフィット
set.seed(200)
logreg_cls_fit <- logreg_cls_spec |> 
  fit(approved ~ ., data = df_train)
#
# approved をファクター型の変数にする
df_train <- df_train |> 
  mutate(approved = factor(approved))
df_test <- df_test |> 
  mutate(approved = factor(approved))
#
# 再度、モデルをフィット
set.seed(200)
logreg_cls_fit <- logreg_cls_spec |> 
  fit(approved ~ ., data = df_train)
logreg_cls_fit
#
# df_test を予想する
logreg_cls_pred <- predict(logreg_cls_fit,
                           new_data = df_test)
logreg_cls_pred
#
# 予測結果を評価
logreg_cls_pred |> 
  mutate(truth = df_test$approved) |> 
  metrics(truth, .pred_class)
#
# 表
table(logreg_cls_pred$.pred_class, df_test$approved)
#

#
# ROC
bind_cols( 
  predict(logreg_cls_fit, df_test),
  predict(logreg_cls_fit, df_test, type = "prob")
) |> 
  mutate(truth = df_test$approved) |> 
  roc_auc(truth, .pred_0)
#