讓我們從頭說起,首先AUC是一種用來度量分類模型好壞的一個標准。這樣的標准其實有很多,例如:大約10年前在machine learning文獻中一統天下的標准:分類精度;在信息檢索(IR)領域中常用的recall和precision,等等。其實,度量反應了人們對” 好”的分類結果的追求,同一時期的不同的度量反映了人們對什么是”好”這個最根本問題的不同認識,而不同時期流行的度量則反映了人們認識事物的深度的變 化。近年來,隨着machine learning的相關技術從實驗室走向實際應用,一些實際的問題對度量標准提出了新的需求。特別的,現實中樣本在不同類別上的不均衡分布(class distribution imbalance problem)。使得accuracy這樣的傳統的度量標准不能恰當的反應分類器的performance。舉個例子:測試樣本中有A類樣本90個,B 類樣本10個。分類器C1把所有的測試樣本都分成了A類,分類器C2把A類的90個樣本分對了70個,B類的10個樣本分對了5個。則C1的分類精度為 90%,C2的分類精度為75%。但是,顯然C2更有用些。另外,在一些分類問題中犯不同的錯誤代價是不同的(cost sensitive learning)。這樣,默認0.5為分類閾值的傳統做法也顯得不恰當了。
為了解決上述問題,人們從醫療分析領域引入了一種新的分類模型performance評判方法——ROC分析。ROC分析本身就是一個很豐富的內容,有興趣的讀者可以自行Google。由於我自己對ROC分析的內容了解還不深刻,所以這里只做些簡單的概念性的介紹。
ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一個畫在二維平面上的曲線——ROC curve。平面的橫坐標是false positive rate(FPR),縱坐標是true positive rate(TPR)。對某個分類器而言,我們可以根據其在測試樣本上的表現得到一個TPR和FPR點對。這樣,此分類器就可以映射成ROC平面上的一個點。調整這個分類器分類時候使用的閾值,我們就可以得到一個經過(0, 0),(1, 1)的曲線,這就是此分類器的ROC曲線。一般情況下,這個曲線都應該處於(0, 0)和(1, 1)連線的上方。因為(0, 0)和(1, 1)連線形成的ROC曲線實際上代表的是一個隨機分類器。如果很不幸,你得到一個位於此直線下方的分類器的話,一個直觀的補救辦法就是把所有的預測結果反向,即:分類器輸出結果為正類,則最終分類的結果為負類,反之,則為正類。雖然,用ROC curve來表示分類器的performance很直觀好用。可是,人們總是希望能有一個數值來標志分類器的好壞。於是Area Under roc Curve(AUC)就出現了。顧名思義,AUC的值就是處於ROC curve下方的那部分面積的大小。通常,AUC的值介於0.5到1.0之間,較大的AUC代表了較好的performance。好了,到此為止,所有的 前續介紹部分結束,下面進入本篇帖子的主題:AUC的計算方法總結。
一、假正例和假負例
分類器的正確率和召回率
前幾天在無覓上看到有人分享了一篇 數據不平衡時分類器性能評價之ROC曲線分析, 把這個問題已經講差不多了, 我這復述一下.
先說混淆矩陣 (confusion matrix). 混淆矩陣是評估分類器可信度的一個基本工具, 設實際的所有正樣本為 P (real-Positive), 負樣本為 N (real-Negative), 分類器分到的正樣本標為 pre-Positive', 負樣本標為 pre-Negetive', 則可以用下面的混淆矩陣表示所有情況:
| real-positive | real-negative pre-positive' | TP (true positive) | FP (false positive) pre-negative' | FN (false negative) | TN (true negative)
通過這個矩陣, 可以得到很多評估指標:
FP rate = FP / N TP rate = TP / P Accuracy = (TP + TN) / (P + N) # 一般稱之為准確性或正確性 Precision = TP / (TP + FP) # 另一些領域的准確性或正確性, 經常需要看上下文來判斷 Recall = TP / P # 一般稱之為召回率 F-score = Precision * Recall
假正例(False Positive):預測為1,實際為0的樣本
假負例(False Negative):預測為0,實際為1的樣本
實際預測中,那些真正例(True Positive)和真負例(True Negative)都不會造成損失(cost)。
那么,我們假設一個假正例的損失是LFP,一個假負例的損失是LFN。
我們可以得到一個損失矩陣:
| y^=1 | y^=0 | |
| y=1 | 0 | LFN |
| y=0 | LFP | 0 |
其中,y是真實值,y^是預測值。
那么,我們可以得到一個樣本的后驗期望損失:
這里 p(y=1|x)是x為正樣本的概率 * x被誤判為負樣本的概率 也就是 樣本的期望損失。
當
的時候,我們會預測結果為y^1=1,此時 (當正樣本被誤判為負樣本的概率大於負樣本被誤判為正樣本的概率時),也就是預測結果中大部分為負樣本,
例如,c=1時,我們對假正例和假負例同等對待,則可以得到我們的決策邊界0.5。
ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一個畫在二維平面上的曲線——ROC curve。平面的橫坐標是false positive rate(FPR),縱坐標是true positive rate(TPR)。
真陽性率=真陽性人數÷標准陽性人數,即: 真陽性率=a÷(a+c)
假陽性率=假陽性人數÷標准陰性人數,即: 假陽性率=b÷(b+d)
|
標准
|
合計
|
|||
|
陽性(+)
|
陰性(-)
|
|||
|
某篩檢
方法
|
陽性(+)
|
a
|
b
|
a+b
|
|
陰性(-)
|
c
|
d
|
c+d
|
|
|
合 計
|
a+c
|
b+d
|
N
|
|
(b:篩選為陽性,而標准分類為陰性的例數;d:陰性一致例數)
最直觀的,根據AUC這個名稱,我們知道,計算出ROC曲線下面的面積,就是AUC的值。事實上,這也是在早期Machine Learning文獻中常見的AUC計算方法。由於我們的測試樣本是有限的。我們得到的AUC曲線必然是一個階梯狀的。因此,計算的AUC也就是這些階梯下面的面積之和。這樣,我們先把score排序(假設score越大,此樣本屬於正類的概率越大),然后一邊掃描就可以得到我們想要的AUC。但是,這么 做有個缺點,就是當多個測試樣本的score相等的時候,我們調整一下閾值,得到的不是曲線一個階梯往上或者往右的延展,而是斜着向上形成一個梯形。此時,我們就需要計算這個梯形的面積。由此,我們可以看到,用這種方法計算AUC實際上是比較麻煩的。
一個關於AUC的很有趣的性質是,它和Wilcoxon-Mann-Witney Test是等價的。這個等價關系的證明留在下篇帖子中給出。而Wilcoxon-Mann-Witney Test就是測試任意給一個正類樣本和一個負類樣本,正類樣本的score有多大的概率大於負類樣本的score。有了這個定義,我們就得到了另外一中計算AUC的辦法:得到這個概率。我們知道,在有限樣本中我們常用的得到概率的辦法就是通過頻率來估計之。這種估計隨着樣本規模的擴大而逐漸逼近真實值。這 和上面的方法中,樣本數越多,計算的AUC越准確類似,也和計算積分的時候,小區間划分的越細,計算的越准確是同樣的道理。具體來說就是統計一下所有的 M×N(M為正類樣本的數目,N為負類樣本的數目)個正負樣本對中,有多少個組中的正樣本的score大於負樣本的score。當二元組中正負樣本的 score相等的時候,按照0.5計算。然后除以MN。實現這個方法的復雜度為O(n^2)。n為樣本數(即n=M+N)
第三種方法實際上和上述第二種方法是一樣的,但是復雜度減小了。它也是首先對score從大到小排序,然后令最大score對應的sample 的rank為n,第二大score對應sample的rank為n-1,以此類推。然后把所有的正類樣本的rank相加,再減去正類樣本的score為最 小的那M個值的情況。得到的就是所有的樣本中有多少對正類樣本的score大於負類樣本的score。然后再除以M×N。即
AUC=((所有的正例位置相加)-M*(M+1))/(M*N)
另外,特別需要注意的是,再存在score相等的情況時,對相等score的樣本,需要 賦予相同的rank(無論這個相等的score是出現在同類樣本還是不同類的樣本之間,都需要這樣處理)。具體操作就是再把所有這些score相等的樣本 的rank取平均。然后再使用上述公式。
---------------------------------------------------------------華麗的分割線(還是這篇博文寫的明白)---------------------------------------------------------------------
大家在將統計學習方法用於實際應用時,不免會遇到各類間數據不太平衡的情況。比如垃圾郵件的識別、稀有病情的診斷、詐騙電話識別、情感分析等等情況。導致數據不平衡的原因有很多,有可能是因為不恰當的采樣方法,也可能真實的數據分布就是如此;然而真實的數據分布在大多數情況下我們是無從得知的,於是我們只好認為我們所取得的樣本是“真實”的,再從中進行學習。那么針對數據不平衡有很多研究點,最近稍微調研了一下,這也算是一個比較老的Topic了。2000 AAAI/2003 ICML先后有兩次Workshop對此進行討論,之后似乎研究的人就比較少了。
本文主要關注的是在類間數據不平衡的情況下,如何評價分類器的性能?至於這個問題本身的更詳細分析,只要在google scholar中搜索“Learning from Imbalance data”就會看一堆資料了,我也看了一些,但是不細致,最近實在是很忙。
在AAAI(2000) Workshop上,有兩個問題最受關注。
1:在類不平衡(class imbalances)的情況下,如何評價學習算法的性能?
2:類不平衡與代價敏感學習(cost-sensitive Learning)的關系。
今天稍微研究了一下第一個問題。既然要評價,那么也就默認了一個前提假設:類樣本不平衡是符合實際數據分布的(訓練集和測試集同分布)。要評價一個二元分類器的性能,人們自然而然地想到Accuracy。而對於不平衡數據,這是否合適?看一個簡單的例子:假設這個世界上有99.9%的人不患癌症,0.01%的人身患癌症。於是我們想設計一個分類器,來判斷一個病人是否身患癌症。那么在已有先驗知識的情況下,我只需要認為所有病人都不患癌症,那么分類器至少能達到99.9%的分類准確率。顯然,這個分類器一點兒價值也沒有。同理,對於n:1(n比較大)的類樣本分布,只需要認為所有樣本都屬於n那一類,准確率就可以達到非常高,可是沒有任何意義和參考價值。所以,Accuracy的衡量標准在這里是不合適的。
ROC分析為這個問題提供了一個比Accuracy更為准確的度量方式:)
先簡單看一下混淆矩陣(confusion matrix)。混淆矩陣是評估分類器可信度的一個基本工具。以二元分類器為研究對象,下面的混淆矩陣顯示了一個分類器可能遇到的所有情況:
| positive | negative | |
| positive’ | TP (true positive) | FP (false positive) |
| negative’ | FN (false negative) | TN (true negative) |
其中列對應於樣本實際的類別,行對應於樣本被預測的類別。這四個基本指標可以衍生出多個分類器指標:
1:FP rate = FP / N;N為負樣本數
2:TP rate = TP / P;P為正樣本數
3:Accuracy = (TP + TN) / (P + N);//我們一般用的
4:Precision = TP / (TP + FP)
5:Recall = TP / P
6:F-score = Precision * Recall
其中Accuracy是我們最經常使用的,在某些領域,Precision/Recall也很頻繁。
以上這些都屬於靜態的評價指標,如前所述,當正負樣本不平衡時存在嚴重的問題。
於是,ROC曲線和AUC(曲線包圍面積)應運而生。
ROC曲線描述的是混淆矩陣中FPR(FP rate)和TPR兩個量之間的相對變化關系。如果二元分類器給出的是對正樣本的一個分類概率,那么通過設定不同的閾值,可以得到不同的混淆矩陣,而每個混淆矩陣都對應於ROC曲線上的一個點。將這些點描繪出來可以得到一條平滑的曲線,這時,我們可以用曲線所包圍的面積,即AUC,來評估該二元分類器的可信度。這就是ROC分析,說完啦。看一幅來自Wikipedia的圖:
橫軸為FPR,縱軸為TPR。如果混淆矩陣表示的點(FPR,TPR)處在中間那根紅線上,則表示該分類器沒有區分能力。以前面的n:1為例,如果分類器簡單地把所有樣本分至n這一類,則正好處在右上角,即(1, 1)。再試想一下數據平衡1:1的情況,當分類器處於紅線上時,容易計算出Accuracy為50%,對於二元分類器而言,沒有什么比准確率低於50%更丟人的事情了……
所以,點若處在左上角部分,則說明分類器性能不錯,若不幸在右下角,那么這個分類器無疑是一坨。。
我們根據不同的閾值得到了ROC曲線之后:
可以通過計算該曲線所包圍的面積(AUC)來衡量分類器的可信度。面積越大,則可信度越高。不過面積可不好計算,因為我們得到的都是離散點。對此有興趣的話,可以參考下這篇文章(ICML 2006)
The Relationship Between Precision-Recall and ROC Curves
這篇文章附着一個計算AUC的Java工具包:http://mark.goadrich.com/programs/AUC/
一般認為,對於一個診斷實驗,AUC在0.5~0.7之間時,診斷價值較低;在0.7~0.9之間,診斷價值中等;在0.9以上時診斷價值較高。這是醫學診斷上的經驗了,對於其他領域的分類器如何,還需要在實踐中摸索。

![clip_image002[14] clip_image002[14]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNTU4MDc0LzIwMTMxMi8xMjE1MzQyMC03YzJmMWFiMzY5OTU0MjE4ODA1NWVjNTcwNDUwMzNhZi5wbmc=.png)