淺談ROC曲線 機器學習中很常見的一個大類就是二元分類器。很多二元分類器會產生一個機率預測值,而非僅僅是0-1預測值。我們可以使用某個臨界點(例如0.5),以劃分哪些預測為1,哪些預測為0。得到二元預測值後,可以構建一個混淆矩陣來評價二元分類器的預測效果。所有的訓練資料都會落入這個矩陣中,而對角線上的數字代表了預測正確的數目,即True Positive+True Nagetive。同時可以相應算出TPR(真正率或稱為靈敏度)和TNR(真負率或稱為特異度)。我們主觀上希望這兩個指標越大越好,但可惜二者是一個此消彼漲的關係。除了分類器的訓練參數,臨界點的選擇,也會大大的影響TPR和TNR。有時可以根據具體問題和需要,來選擇具體的臨界點。
如果我們選擇一系列的臨界點,就會得到一系列的TPR和TNR,將這些值對應的點串連起來,就構成了ROC曲線。ROC曲線可以協助我們清楚的瞭解到這個分類器的效能表現,還能方便比較不同分類器的效能。在繪製ROC曲線的時候,習慣上是使用1-TNR作為橫座標,TPR作為縱座標。下面來看看如何在R語言中繪製ROC曲線。
# 做一個logistic迴歸,產生機率預測值model1 <- glm(y~., data=newdata, family='binomial')pre <- predict(model1,type='response')# 將預測機率prob和實際結果y放在一個資料框中data <- data.frame(prob=pre,obs=newdata$y)# 按預測機率從低到高排序data <- data[order(data$prob),]n <- nrow(data)tpr <- fpr <- rep(0,n)# 根據不同的臨界值threshold來計算TPR和FPR,之後繪製成圖for (i in 1:n) { threshold <- data$prob[i] tp <- sum(data$prob > threshold & data$obs == 1) fp <- sum(data$prob > threshold & data$obs == 0) tn <- sum(data$prob < threshold & data$obs == 0) fn <- sum(data$prob < threshold & data$obs == 1) tpr[i] <- tp/(tp+fn) # 真正率 fpr[i] <- fp/(tn+fp) # 假正率}plot(fpr,tpr,type='l')abline(a=0,b=1)
R中也有專門用來繪製ROC曲線的包,例如常見的ROCR包,它不僅可以用來畫圖,還能計算ROC曲線下面積AUC,以評價分類器的綜合效能,該數值取0-1之間,越大越好。library(ROCR)pred <- prediction(pre,newdata$y)performance(pred,'auc')@y.values #AUC值perf <- performance(pred,'tpr','fpr')plot(perf)
ROCR包畫圖函數功能比較單一,筆者比較偏好使用功能更強大的pROC包。它可以方便比較兩個分類器,還能自動標註出最優的臨界點,圖看起來也比較漂亮。library(pROC)modelroc <- roc(newdata$y,pre)plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2), grid.col=c("green", "red"), max.auc.polygon=TRUE, auc.polygon.col="skyblue", print.thres=TRUE)