logo

ROC曲線のAUCを利用してモデルを比較する方法 📂機械学習

ROC曲線のAUCを利用してモデルを比較する方法

概要

ROC曲線は基本的に四角形$[0,1]^2$をいっぱいにするほどよく、曲線の左上の折れる点が$(0,1)$に近いほどよい。

説明

20190210\_232535.png

上の二つのROC曲線があるとするなら、安心して「いい」と言えるのは右側だ。この「いい」と言う言葉は、ROC曲線を描くモデルがより優れているという意味だ。当然比較される二つのモデルは同じトレーニングデータから得られたものであり、この与えられた状況でどちらのモデルがより良いかを比較するもので、テストデータや最適なカットオフなどの要素は考慮しない。

しかし問題は、統計学の慢性的問題と言える「目分量」が介入することだ。

次の三つのモデルで描かれた三つのROC曲線を想像してみよう。

20190210\_234007.png 深く考えることなく赤色青色緑色より悪いことが簡単にわかる。しかし、青色緑色のどちらかを選ぶとなると問題が曖昧になる。

これを解決するために計算するのが曲線の下の面積aUCだ。四角形の面積は必ず$1$なので、AUCは必ず$0$から$1$の間の何かの値になる。これを使えばどちらのモデルがより良いか簡単に比較できる。

幸いにもRでこのAUCを計算することは非常に簡単だ。

実践

(ROC曲線の描き方に続いて)

cxv.png

prf <- performance(pr, measure = "tpr", x.measure = "fpr")
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]; auc

上記のコードを実行すると、以下のようにAUCを計算してくれる。

20190210\_235303.png AUCを変数選択基準の一種と考えるならば、$R^2$に似ており、他のモデルとの比較だけでなく、そのモデルのパフォーマンス自体を評価するときにも参照すべき意味のある尺度だ。

コード

以下は例のコードだ。

install.packages("car")
install.packages("ResourceSelection")
install.packages("ROCR")
 
library(car)
library(ResourceSelection)
library(ROCR)
 
set.seed(150421)
 
?Chile
str(Chile)
nrow(Chile)
head(Chile); tail(Chile)
 
DATA<-na.omit(Chile)
DATA$vote[DATA
          $vote!='Y']<-'N'
DATA$vote<-factor(DATA$vote)
head(DATA); tail(DATA)
 
DATANUM<-nrow(DATA)
train<-sample(1:DATANUM)<(DATANUM*0.8)
test<-DATA[!train,]; head(test)
train<-DATA[train,]; head(train)
 
out0<-glm(vote~.,family=binomial(),data=train); summary(out0)
p <- predict(out0, newdata=test, type="response"); p
 
pr <- prediction(p, test$vote)
win.graph(5,5); plot(prf, main='ROC')
 
prf <- performance(pr, measure = "tpr", x.measure = "fpr")
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]; auc