『評価指標入門』をRで書く:二値分類における評価指標

『評価指標入門』をRで書く

この記事はR言語 Advent Calendar 2023 シリーズ2の13日目の記事です。

qiita.com

二値分類における評価指標

ライブラリーの呼び出し。

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)

以上です。