ROC曲線のAUCを利用してモデルを比較する方法
概要
ROC曲線は基本的に四角形$[0,1]^2$をいっぱいにするほどよく、曲線の左上の折れる点が$(0,1)$に近いほどよい。
説明
上の二つのROC曲線があるとするなら、安心して「いい」と言えるのは右側だ。この「いい」と言う言葉は、ROC曲線を描くモデルがより優れているという意味だ。当然比較される二つのモデルは同じトレーニングデータから得られたものであり、この与えられた状況でどちらのモデルがより良いかを比較するもので、テストデータや最適なカットオフなどの要素は考慮しない。
しかし問題は、統計学の慢性的問題と言える「目分量」が介入することだ。
次の三つのモデルで描かれた三つのROC曲線を想像してみよう。
深く考えることなく赤色は青色や緑色より悪いことが簡単にわかる。しかし、青色と緑色のどちらかを選ぶとなると問題が曖昧になる。
これを解決するために計算するのが曲線の下の面積aUCだ。四角形の面積は必ず$1$なので、AUCは必ず$0$から$1$の間の何かの値になる。これを使えばどちらのモデルがより良いか簡単に比較できる。
幸いにもRでこのAUCを計算することは非常に簡単だ。
実践
prf <- performance(pr, measure = "tpr", x.measure = "fpr")
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]; auc
上記のコードを実行すると、以下のようにAUCを計算してくれる。
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