1. 程式人生 > >ROC曲線及AUC評價指標

ROC曲線及AUC評價指標

一,簡介

對訓練出的分類器的分類效果的評估,常見有精確度(accuracy),PR(precision- recall), precision等,一般來說訓練樣本數量越大,則的儲的

用的就是分類器的精確度(accuracy),在某些如推薦或資訊獲取領域還會組合使用precision-recall作為評價指標。因為 你用於訓練分類器的樣本本身就是總體的一個抽樣,所以這些指標的數值也僅僅是一種統計上的反映,如果你做多次抽樣訓練,跟別的隨機變數一樣,它一樣會有期 望、方差、置信區間這些概念。理論上說,訓練樣本量越大,你得到的這些指標的可信度就越高(即它們以某個概率落在的置信區間越窄)。不幸的是,實際中你未 必會有那麼多的樣本,所以機器學習工作者設計出很多種方法來應對資料量不足情況下分類器的訓練與評估,如k步交叉檢驗、留1法、boostrap等等

分類、檢索中評價的指標比較多,precision,recall,accuracy,F1,ROC,PRcurve

二,ROC介紹

很多時候,我們希望對一個二值分類器的效能進行評價,AUC正是這樣一種用來度量分類模型好壞的一個標準。現實中樣本在不同類別上的不均衡分佈(class distribution imbalance problem),使得accuracy這樣的傳統的度量標準不能恰當的反應分類器的效能。舉個例子:測試樣本中有A類樣本90個,B 類樣本10個。若某個分類器簡單的將所有樣本都劃分成A類,那麼在這個測試樣本中,它的準確率仍為90%,這顯示是不合理的。為了解決上述問題,人們從醫療分析領域引入了一種新的分類模型performance評判方法——ROC分析。在介紹ROC之前,首先討論一下混淆矩陣(Confusion matrix)。

混淆矩陣是監督學習中的一種視覺化工具,主要用於比較分類結果和例項的真實資訊(outcom vs.  ground truth)。矩陣中的每一行代表例項的預測類別,每一列代表例項的真實類別。在混淆矩陣中,每一個例項可以劃分為四種類型之一,True Positive\False Positive\False Negative\True Negetive(TP\FP\FN\TN),如圖1所示。其中,Positive代表預測例項來自正類,Negetive代表預測例項來自負類;True代表預測正確,False代表預測錯誤。

Confusion Matrix

圖1:Confusion Matrix

由混淆矩陣可以計算一系列的評價指標,如accurancy、precision、recall等等。

fp rate = FP/N        tp rate = TP/P

precision = TP/(TP + FN)       recall = TP/P

accuracy = (TP + TN) / (P + N)

F-measure = 2/( 1/precision + 1/recall)

幾個引數的解釋:

precision和recall是從資訊檢索來的定義,

precision為查準率-----指得是檢測的相關文獻量檢出文獻總量的比率,是衡量資訊檢索系統檢出文獻的準確                                        度的尺度。

recall 為查全率------檢測出的相關文獻量檢索系統中相關文獻總量的比率,是衡量資訊檢索系統檢出相關文                                     獻能力的尺度

可以通過一個例子來解釋

一個7類的混淆矩陣,每類樣本數量為100

confus =

 69            2              4              6           1          14           4
        3             70            6              2           7           6            6
        4              6             66             2           5           6          11
        2              2             18            51          9          12          6
4              8              1               2          80         3           2
7              6               3              7           2           67        8
11            6               7              5           7           6          58

accuracy = 0.6586

numcorrect = 461

precision =0.6900    0.7000    0.6286    0.6800    0.7207    0.5877    0.6105

recall =0.6900    0.7000    0.6600    0.5100    0.8000    0.6700    0.5800

F =0.6900    0.7000    0.6439    0.5829    0.7583    0.6262    0.5949

confus矩陣中每一行和等於該類的樣本和=100;但是每一列就不是100了,每一列其實的意義,就是資訊檢索的返回的所有結果

假設我們用類別3的標籤進行搜尋,那麼會返回confus中第3列的所有資料,沒問題吧?因為分到第3類的確實是這些資料,一共有105個,因為有其他的類也分到這個類中了唄。

所以第三類的查準率=檢索出的相關文件數目(66)/檢索返回的所有的文件數目(105)=0.6288=precision(3)。

查全率那就是檢索出的文件數目(66)/資料庫中的第三類的所有文件數目(檢索出的第三類+沒有檢索出的第三類=confus第三行的和=100)=0.66=recall(3)。

三,ROC原理介紹

回到ROC上來, 百度百科對roc的解釋如下:ROC曲線指受試者工作特徵曲線(receiver operating characteristic curve), 是反映敏感性和特異性連續變數的綜合指標,是用構圖法揭示敏感性和特異性的相互關係,它通過將連續變數設定出多個不同的臨界值,從而計算出一系列敏感性和特異性,再以敏感性為縱座標、(1-特異性)為橫座標繪製成曲線,曲線下面積越大(AUC area  under roc curve),診斷準確性越高。在ROC曲線上,最靠近座標圖左上方的點為敏感性和特異性均較高的臨界值。

ROC關注兩個指標:

true positive rate ( TPR = TP / [TP + FN] ) ------正例分對的概率

false positive rate ( FPR = FP / [FP + TN] ) ------負例錯分的概率

直觀上,TPR代表能將正例分對的概率,FPR代表將負例錯分為正例的概率,FPR 預測的是正例,但是實際上是負例。這部分在負例中佔得比例。也就是將負例錯分為正例的概率。

在ROC 空間中,每個點的橫座標是FPR,縱座標是TPR,這也就描繪了分類器在TP(真正的正例)和FP(錯誤的正例)間的trade-off。ROC的主要分析工具是一個畫在ROC空間的曲線——ROC curve。我們知道,對於二值分類問題,例項的值往往是連續值,我們通過設定一個閾值,將例項分類到正類或者負類(比如大於閾值劃分為正類)。因此我們可以變化閾值,根據不同的閾值進行分類,根據分類結果計算得到ROC空間中相應的點,連線這些點就形成ROC curve。ROC curve經過(0,0)(1,1),實際上(0, 0)和(1, 1)連線形成的ROC curve實際上代表的是一個隨機分類器。一般情況下,這個曲線都應該處於(0, 0)和(1, 1)連線的上方。如圖2所示。

ROC Curve

圖2 ROC Curve

四,AUC介紹

用ROC curve來表示分類器的performance很直觀好用。可是,人們總是希望能有一個數值來標誌分類器的好壞。於是Area Under roc Curve(AUC)就出現了。顧名思義,AUC的值就是處於ROC curve下方的那部分面積的大小。通常,AUC的值介於0.5到1.0之間,較大的AUC代表了較好的performance。

計算ROC curve的AUC值的程式碼可以在這找到。

五,ROC中最優P-0的計算

p_0為一個閾值,通過這個閾值來分類,保證TPR同時代價要比FPR儘量小,具體操作再去檢視論文吧,

六,Precision-Recall Corve曲線的畫法

不過Precision-Recall Corve對於每一類的畫法還是很有講究的,我們知道對於二類問題,像是檢索中的問題,最後的查全率、查準率基本都是最後計算一對值就行了,但是就一對值,一個點是畫不出曲線來的,所以在實際的曲線過程中,是這樣的:

1、首先得分為正負兩類,多類問題真對每一類都可以對映過去

2、按照決策值(分類問題每一個樣本肯定會有一個支援分類的概率或者置信度等等,像是libsvm的dec_values的矩陣),按照從小到大的順序進行排序

3、然後分別計算全部樣本、全本樣本-1、全部樣本-2、...........、一直計算完畢,每一次都會有查全率查準率,就可以曲線了,這裡我說的很粗糙,詳細的可以檢視我的程式碼,當然也有函式參考的別人的,也做了說明。

參考資料: