こんにちは、みっちゃんです。

今回の記事では、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")

多くの方の参考になれば幸いです。

参考文献

平井有三「はじめてのパターン認識」森北出版