『評価指標入門』をRで書く:二値分類における評価指標
『評価指標入門』をRで書く
この記事はR言語 Advent Calendar 2023 シリーズ2の13日目の記事です。
二値分類における評価指標
ライブラリーの呼び出し。
library(tidyverse) library(palmerpenguins) library(rsample) library(MLmetrics) library(yardstick) library(pROC) library(ranger)
ペンギンの性別を判別するランダムフォレストのモデル。
pen_split <- penguins |> mutate(year = as.factor(year)) |> drop_na() |> initial_split(prop = 0.2, strata = sex) pen_train <- pen_split |> training() pen_test <- pen_split |> testing() fit_2_class <- pen_train |> ranger(sex ~ ., data = _) pred_test <- pen_test |> predict(fit_2_class, data = _)
G-Meanのパッケージが見当たらなかったので実装する。
g_mean <- function (y_true, y_pred, positive = NULL) { Confusion_DF <- ConfusionDF(y_pred, y_true) if (is.null(positive) == TRUE) positive <- as.character(Confusion_DF[1, 1]) TP <- as.integer(subset(Confusion_DF, y_true == positive & y_pred == positive)["Freq"]) FN <- as.integer(sum(subset(Confusion_DF, y_true == positive & y_pred != positive)["Freq"])) TN <- as.integer(subset(Confusion_DF, y_true != positive & y_pred != positive)["Freq"]) FP <- as.integer(sum(subset(Confusion_DF, y_true != positive & y_pred == positive)["Freq"])) TPR <- TP/(TP + FN) TNR <- TN/(TP + FP) GM <- sqrt(TPR * TNR) return(GM) }
以下の評価指標を算出。
- 正解率(Accuracy)
- マシューズ相関係数(Matthews Correlation coefficient ; MCC)
- 適合率(Precision ; 精度)
- 再現率(Recall, True Positive Rate ; TPR ; 感度)
- F1-score
- G-Mean(Geometric Mean)
Accuracy(pred_test$predictions, pen_test$sex) mcc_vec(pred_test$predictions, pen_test$sex) Precision(pred_test$predictions, pen_test$sex) Recall(pred_test$predictions, pen_test$sex) F1_Score(pred_test$predictions, pen_test$sex) g_mean(pred_test$predictions, pen_test$sex)
ペンギンの性別の確率を推定するランダムフォレストのモデル。
fit_2_class_p <- pen_train |> mutate(sex = if_else(sex == "female", 1, 0)) |> ranger(sex ~ ., data = _) pred_test <- pen_test |> mutate(sex = if_else(sex == "female", 1, 0)) |> predict(fit_2_class_p, data = _)
以下の評価指標を算出する。
- ROC-AUC(Receiver Operating Characteristic - Area Under the Curve)
- PR-AUC(Precision Recall - Area Under the Curve)
- pAUC(Partial Precision Area Under the Curve)
# ROC-AUC AUC( pred_test$predictions, if_else(pen_test$sex == "female", 1, 0) ) # PR-AUC PRAUC( pred_test$predictions, if_else(pen_test$sex == "female", 1, 0) ) # pAUC (α = 0, β = 0.2 の場合) roc( if_else(pen_test$sex == "female", 1, 0), pred_test$predictions ) |> auc(partial.auc=c(0.0, 0.2), partial.auc.correct=TRUE)
以上です。