1. 程式人生 > >R語言︱分類器的效能表現評價(混淆矩陣,準確率,召回率,F1,mAP、ROC曲線)

R語言︱分類器的效能表現評價(混淆矩陣,準確率,召回率,F1,mAP、ROC曲線)


筆者寄語:分類器演算法最後都會有一個預測精度,而預測精度都會寫一個混淆矩陣,所有的訓練資料都會落入這個矩陣中,而對角線上的數字代表了預測正確的數目,即True Positive+True Nagetive。

——————————————————————————

相關內容:


——————————————————————————

筆者覺得在效能評價上有兩個分支:

TPR-TNR,後續接AUC值/ROC曲線;

召回率-正確率,接F1值曲線,再接mAP曲線(召回-準確曲線)

1、TPR與TNR

同時可以相應算出TPR(真正率或稱為靈敏度)和TNR(真負率或稱為特異度)。我們主觀上希望這兩個指標越大越好,但可惜二者是一個此消彼漲的關係。除了分類器的訓練引數,臨界點的選擇,也會大大的影響TPR和TNR。有時可以根據具體問題和需要,來選擇具體的臨界點。


來看看這個圖就一目瞭然了,ROC曲線需要兩個資料集,預測資料+實際資料。

如果我們選擇一系列的臨界點,就會得到一系列的TPR和TNR,將這些值對應的點連線起來,就構成了ROC曲線。ROC曲線可以幫助我們清楚的瞭解到這個分類器的效能表現,還能方便比較不同分類器的效能。在繪製ROC曲線的時候,習慣上是使用1-TNR作為橫座標,TPR作為縱座標。下面來看看如何在R語言中繪製ROC曲線。

2、召回率與準確率

 召回率(Recall)      =  TP/P = TPR  準確率(Precision) =  TP/(TP+FP)召回率recall就是上述說到的TPR

3、TPR與TNR的延伸——AUC值

為了更好的衡量ROC所表達結果的好壞,Area Under Curve(AUC)被提了出來,簡單來說就是曲線右下角部分佔正方形格子的面積比例。該比例代表著分類器預測精度。


4、召回率與準確率的延伸——F1值

準確率和召回率是互相影響的,理想情況下肯定是做到兩者都高,但是一般情況下準確率高、召回率就低,召回率低、準確率高,當然如果兩者都低,那是什麼地方出問題了。一般情況,用不同的閥值,統計出一組不同閥值下的精確率和召回率,如下圖:
如果是做搜尋,那就是保證召回的情況下提升準確率;如果做疾病監測、反垃圾,則是保準確率的條件下,提升召回。所以,在兩者都要求高的情況下,可以用F1來衡量。
  1. F1 = 2 * P * R / (P + R)  
公式基本上就是這樣,但是如何算圖1中的A、B、C、D呢?這需要人工標註,人工標註資料需要較多時間且枯燥,如果僅僅是做實驗可以用用現成的語料。當然,還有一個辦法,找個一個比較成熟的
演算法作為基準,用該演算法的結果作為樣本來進行比照,這個方法也有點問題,如果有現成的很好的演算法,就不用再研究了。

5、召回率、準確率、F1的延伸——AP和mAP(mean Average Precision)

mAP是為解決P,R,F-measure的單點值侷限性的。為了得到 一個能夠反映全域性效能的指標,可以看考察下圖,其中兩條曲線(方塊點與圓點)分佈對應了兩個檢索系統的準確率-召回率曲線
可以看出,雖然兩個系統的效能曲線有所交疊但是以圓點標示的系統的效能在絕大多數情況下要遠好於用方塊標示的系統。從中我們可以 發現一點,如果一個系統的效能較好,其曲線應當儘可能的向上突出。更加具體的,曲線與座標軸之間的面積應當越大。最理想的系統, 其包含的面積應當是1,而所有系統的包含的面積都應當大於0。這就是用以評價資訊檢索系統的最常用效能指標,平均準確率mAP其規範的定義如下:(其中P,R分別為準確率與召回率)

————————————————————————————————————————————————————————

R語言中ROC曲線的繪製

參考以下的部落格:轉載於:http://www.r-bloggers.com/lang/chinese/1205

該部落格示範了三種畫出ROC曲線的方法,第一種主動自己運算、第二種ROCR包、第三種pROC包。

1、自己運算
# 做一個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)

2、ROCR包

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)

注意:其中pre是分類器預測的模型,而newdata$y是實際值。

3、pROC包

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)


——————————————————————————————————————————————

筆者在操作的時候出現以下的問題:

Error in prediction(tablebank, bank_part$y_n) : 
Number of cross-validation runs must be equal for predictions and labels.

網上的解決方案有:

在這種情況下預測(預測,標籤,標籤。 點= NULL)函式類的“預測”和“標籤”變數應該列表或矩陣。

本文有兩個ROC曲線繪製包,可參考。

轉載於:http://www.r-bloggers.com/lang/chinese/1205

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~

———————————————————————————