こんにちは、みっちゃんです。
今回の記事では、2クラスの分類器(モデル)の性能を評価する際に有用な指標である、AUCとAUPRを紹介します。
さらに、R言語を使用したAUCとAUPRの計算手順についても紹介します。
目次(まとめ)
- AUCとAUPRは分類スコアと正解クラスの情報を用いて算出する
- Rの「PRROCパッケージ」を用いて簡単に算出することができる
- 参考文献
AUCとAUPRは分類スコアと正解クラスの情報を用いて算出する
ここでは説明のため、以下のような設定を考えます。
【設定】
理数科の学生5人と普通科の学生5人がいます。数学の点数を元に、理数科の学生を「理数科」に分類できるような分類器(モデル)を作りました。このモデルから得られる分類スコアが高い学生を、理数科に分類するとします。
上の表は、10人の学生、それぞれについて得られた分類スコアと、実際に「理数科」に所属しているかどうか(正解かどうか)を示しています。
分類器(モデル)が完全に正しければ、分類スコアが高い5人が「理数科」となるはずなのですが、そうはなっていません。
このような状況を定量的に評価し、分類器(モデル)の性能を評価する指標として、以下の2つが代表的です。
AUC:Area Under the ROC (Receiver Operator Characteristics) Curve
→ 受信者動作特性曲線(ROC曲線)の下面積
AUPR:Area Under the Precision-Recall curve
→ 適合率−再現率 曲線(PR曲線)の下面積
これらの指標は、上の表から、以下のようにいくつかの割合を計算することで算出します。
ここで、FPは偽陽性(False Positive)、Nは正解ではない場合の合計数、TPは真陽性(True Positive)、Pは正解の場合の合計数を示しています。
・偽陽性:誤って「正しい」と分類してしまった場合
・真陽性:正しく「正しい」と分類した場合
AUCを算出するためのROC曲線は「真陽性率」と「偽陽性率」を使って描くことができます。
AUPRを算出するためのPR曲線は「適合率」と「再現率」を使って描くことができます。
ここで「再現率」は、「真陽性率」と同じになります(実用上、厳密には意味が違うので参考文献などをご覧ください)。
Rの「PRROCパッケージ」を用いて簡単に算出することができる
ROC曲線、PR曲線、および、それらの下面積であるAUC、AUPRは、Rの「PRROCパッケージ」を用いて簡単に算出することができます。
※Rの基本的な使い方については、以前の記事で紹介していますので、そちらをご覧ください。
まず、入力データを準備します。
例えば、エクセルでは、以下のように準備します。
保存する際に、ファイル形式を選択できるので、「.csv」を選択します。
今回は「data.csv」として「デスクトップ」に保存しました。
※プログラミングでは、「ファイルを保存する場所」をしっかり認識しておくことが重要です。
それでは、Rを起動します。
$ R -q
次に、先ほど作った入力データを以下のように読み込みます。
> df <- read.table("~/Desktop/data.csv", header = T, sep = ",")
入力データの中には「score」や「label」といったヘッダー行があるので、「header = T」としています。
また「.csv」形式、つまり「コンマ区切り」のファイルとして保存したので、区切り文字を「,」に指定して読み込んでいます。
次に、パッケージをインストールします。
> install.packages("PRROC")
画面の指示にしたがって番号を入力するなどすると、インストールが完了します。
次に、インストールしたパッケージを読み込みます。
> library("PRROC")
AUCなどを計算する準備は整ったので、以下のように実行します。
> fg <- df$score[df$label == 1]
> bg <- df$score[df$label == 0]
> roc <- roc.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
> pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
「fg」には、入力データの中で「label = 1」になっているscoreが入ります。
逆に「bg」には、入力データの中で「label = 0」になっているscoreが入ります。
AUCを算出するためには、以下のようにします。
> roc
ROC curve
Area under curve:
0.8
Curve for scores from 0 to 0.9
( can be plotted with plot(x) )
ちなみに、AUCの値だけを得たい場合には、以下のように実行すればOKです。
> roc$auc
AUPRを算出するためには、以下のようにします。
> pr
Precision-recall curve
Area under curve (Integral):
0.817716
Area under curve (Davis & Goadrich):
0.8163095
Curve for scores from 0 to 0.9
( can be plotted with plot(x) )
ちなみに、AUPRの値だけを得たい場合には、以下のように実行すればOKです。
> pr$auc.integral
または
> pr$auc.davis.goadrich
また、ROC曲線は、以下のようにして描くことができます。
> plot(roc, xlab = "False Positive Rate", ylab = "True Positive Rate")
PR曲線は、以下のようにして描くことができます。
> plot(pr, xlab = "Recall", ylab = "Precision")
多くの方の参考になれば幸いです。