ROC及AUC計算方法及原理

1.非均衡分類問題

在大多數情況下不同類別的分類代價並不相等,即將樣本分類爲正例或反例的代價是不能相提並論的。例如在垃圾郵件過濾中,我們希望重要的郵件永遠不要被誤判爲垃圾郵件,還有在癌症檢測中,寧願誤判也不漏判。在這種情況下,僅僅使用分類錯誤率來度量是不充分的,這樣的度量錯誤掩蓋了樣例如何被錯分的事實。所以,在分類中,當某個類別的重要性高於其他類別時,可以使用Precison和Recall多個比分類錯誤率更好的新指標。

Precison(查準率):預測爲正例的樣本中真正正例的比例。

Recall(召回率):真正爲正例的樣本有多少被預測出來。

可見,我們可以根據我們最終的目標來選擇度量指標。例如,在癌症檢測中,我們希望選擇Recall較高的模型(有病爲正例)。而在垃圾郵件過濾中,我們希望選擇Precison較高的模型。但是我們很容易構造一個高查準率或高召回率的分類器,但是很難保證兩者同時成立。構建一個同時使兩者很大的分類器是具有挑戰性的。

2.ROC曲線

ROC是一個用於度量分類中的非均衡性的工具,ROC曲線及AUC常被用來評價一個二值分類器的優劣。

既然已經有了這麼多的評價指標,爲什麼還要使用ROC與AUC呢?

因爲ROC曲線有一個很好的特徵:在實際的數據集中經常會出現類別不平衡現象,即負樣本比正樣本多很多(或者相反),而且測試數據中的正負樣本的分佈也可能隨着時間而變化。而在這種情況下,ROC曲線能夠保持不變。下圖是ROC曲線和Precison-Recall曲線的對比:

ROCæ²çº¿ vs. Precision-Recallæ²çº¿

在上圖中,a和c爲ROC曲線,b和d爲Precison和Recall曲線。a和b展示的是在原始測試集(正負樣本平衡)的結果,c和d是將測試集中負樣本的數量變爲原來的10倍後分類器的結果。可以看出,曲線基本保持不變,而Precison和Recall變化較大。

2.2 ROC曲線的定義(Receiver Operating Characteristic)

ROC可以用來比較不同分類器的相關性能。

ROCæ²çº¿ç¤ºä¾

如圖是一個ROC曲線的實例。

其中橫座標爲FPR(False positive rate 假陽率),縱座標爲真陽率TPR(True postive rate)。

FPR:所有負例中有多少被預測爲正例; TPR:有多少真正的正例被預測出來;

ROC 描繪了兩者的相對權衡:

  • benefits(true postives)
  • costs(false positives)

下圖給出了Precison,Recall, FPR,TPR的定義:

FPRåTPRå®ä¹

F-measure: precison和recall的調和平均值。沒有一個單個的度量可以告訴所有的信息,所以建議使用多個度量。

接下來我們考慮ROC曲線中的四個點和一條線。

1.(0,0):fp=tp=0 ,即所有樣本都被預測爲負樣本;

2.(1,1):fp=tp=1,所有樣本都被預測爲正樣本;

3.(1,0):fp=1,tp=0,所有正例都被預測爲負例,而所有正例都沒被預測出來,這時最糟糕的分類器,因爲它成功的避開了所有正確答案。

4.(0,1):fp=0,tp=1,這是一個完美的分類器,它將所有樣本都正確分類。

所以經過上述分析,我們可以斷言,ROC曲線越接近左上角,該分類器的性能越好,意味着分類器在假陽率很低的同時獲得了很高的真陽率。

5.   虛線y=x:這條對角線熵的點其實代表的是一個採用隨機猜測策略的分類器的結果。例如(0.5,0.5),表示對於一半的樣本猜測其爲正樣本,另外一半樣本爲負樣本。出現在右下角三角形中的任何分類器都比隨機猜測更糟糕。因此,在ROC圖中,此三角形通常爲空。

3.AUC的含義

AUC(Area Under Curve) 被定義爲ROC曲線下的面積,因爲ROC曲線一般都處於y=x這條直線的上方,所以取值範圍在0.5和1之間,使用AUC作爲評價指標是因爲ROC曲線在很多時候並不能清晰地說明哪個分類器的效果更好,而AUC作爲一個數值,其值越大代表分類器效果更好。

AUC意味着什麼?

The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.

首先AUC是一個概率值,當隨機挑選一個正樣本以及一個負樣本,當前的分類算法根據計算得到的分數將這個正樣本排在負樣本前面的概率就是AUC值。所以,AUC的值越大,當前的分類算法越有可能將正樣本排在負樣本值前面,既能夠更好的分類。

4. ROC曲線的繪製

我們可以看出,對於一個特定的分類器和測試數據集,顯然只能得到一個分類結果,即一組FPR和TPR的結果,那麼是如何得到整個ROC曲線的呢?

要想得到ROC曲線,我們就需要一組FPR和TPR的值。我們先來看Wikipedia上面對ROC曲線的定義:

“In signal detection theory, a receiver oprating characteristic(ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied.”

ROC曲線代表的是當“discriminative threshold“變化時分類器的性能、如何理解這裏的“discriminative threshold”呢?

它代表的是分類器以多大的置信度將樣本分類爲正樣本。分類器的一個重要功能”概率輸出“,即表示分類器認爲某個樣本具有多大的概率屬於正樣本(或負樣本)。通過深入地瞭解各個分類器的內部機理,我們總能想辦法得到一種概率輸出。通常來說,是將一個實數範圍通過某個變化映射到(0,1)區間。

假設我們已經得到了所有樣本的概率輸出(即屬於正樣本的概率),那麼我們就可以通過改變”discrimination threshold“來繪製ROC曲線。

(許多分類器,例如決策樹或者規則集合,被設計產生一個類別決策,即將每個樣本預測爲Y或N。當使用這樣的離散分類器時,產生一個單個額confusion矩陣,對應於一個ROC點。而一些分類器,例如Naive Bayes,產生一個樣本概率值,這樣一個ranking/scoring分類器可以使用一個threshold來產生一個discrete(binary)分類器:如果分類器輸出的概率大於threshold,分類器產生Y,否則產生N。每個不同的threshold值在ROC空間產生一個不同的點(對應於一個不同的confusion matrix)。)

 

具體過程如下所述:

æç§æ¦çæåº

1.如圖,我們根據每個測試樣本屬於正樣本的概率值score從大到小排序。(圖中class一欄代表每個測試樣本的真正標籤(p代表正樣本,n代表負樣本))

2.接着,我們從高到低,依次將score作爲閾值threshold,當測試樣本屬於正樣本的概率大於或等於這個threshold時,我們認爲它爲正樣本,否則爲負樣本。

例如:對於第四個樣本,其score值爲0.6,那麼score值大於等於0.6的樣本1,2,3,4都被認爲是正樣本,而其他樣本則被認爲是負樣本。

3.每次選取不同的score作爲threshold,我們就可以得到一組FPR和TPR,即曲線上的一點。將這些(FPR,TPR)對連接起來,就可以得到完整的ROC曲線如下圖。(當threshold取值越多,ROC曲線就越平滑)。

ROCæ²çº¿ä¸¾ä¾

當我們將threshold設置爲1和0時,即分別對應將所有樣本劃分爲負樣本和將所有樣本劃分爲正樣本,就可以的得到曲線上的(0,0)和(1,1)兩點。

關於score值:分類器都會提供每個樣例被判爲陽性或者陰性的可信程度值,大多數分類器都能夠做到這一點,但是在通常情況下,這些值會在最後輸出離散分類標籤之前被清除。例如,樸素貝葉斯能夠提供一個可能值,在Logistic迴歸中輸入到sigmoid函數中的是一個數值。在Adaboost和SVM中,都會計算一個數值然後輸入到sign()函數中,所有的這些值都可以看做score,用於衡量給定分類器的預測強度。

 ROC點(0.1,0.5)產生了最高的準確率。注意到分類器的最好的準確率出現在threshold=0.54時,而不是我們認爲的在類別平衡分佈的threshold等於0.5處。

4.1 Convex Hull

 

 

陰影區域被稱作兩個曲線的convex hull。在選擇分類器時總是應該根據convex hull的上邊界進行操作。例如,如果你的目標只是覆蓋40%的真陽性,你應該選擇方法A,這樣可以提供5%的更低的假陽性率相對於B來說。如果你的目標是覆蓋80%的真陽性,你應該選擇方法B,因爲B的假陽性率爲60%,與A相比更低。如果你的目標是覆蓋60%的真陽性,那麼你應該結合A和B。

5. 準確性的不足(代價敏感學習

在金融檢測中,如果將欺詐用戶誤判爲優質客戶,這樣會給企業帶來巨大損失。同樣把病人誤判爲健康的人,會給病人帶來生命威脅,這些問題都是代價敏感分類問題。即將樣本誤分類爲正樣本和將樣本誤分類爲負樣本的代價是不同的。然而,許多傳統的分類算法假定分類代價都是相等的,分類的時候一般就考慮怎麼使得分類模型的準確率更高,這樣就可能忽視掉分類代價的問題。但是往往分類代價相比分類準確率具有更加重要的意義。正如上面的例子,欺詐用戶和有病的人一般是小類別樣本,將它們進行正確分類更爲重要,如果將它們誤分類將會產生嚴重的後果,我們的目標就是檢查出這些異常。

傳統的分類算法不適合解決代價敏感的問題,這就需要研究能夠解決代價敏感問題的分類方法,所以可以在傳統分類方法中引入代價因子,運用代價敏感學習減少分類代價。成本矩陣Cost(i,j)表示將i類樣本誤分類爲類j的代價。代價敏感分類就是爲不同類型的錯誤分類不同的代價,使得分類時,高代價錯誤產生的數量和錯誤分類的代價總和最小。

基於損失的分類:

對於每個樣本E,分類器計算p(y|E) 和 p(n|E)=1-p(y|E),分類器將樣本分類爲正例當:

p(y|E)>\frac{p(n|E)*c(Y,n)}{c(N,y)}

MetaCost(代價敏感學習):MetaCost是一種典型的集成學習算法,其核心思想是計算出每個訓練樣本額預測分類概率,再根據最優分類期望代價重標記原訓練樣本的類標號,得到新的訓練集,然後在新的訓練集上重新運行目標分類算法進行訓練,從而實現代價敏感分類。

 

6. ROC曲線的python代碼實現

def plotROC(predStrengths, classLabels):
    cur=(0.0, 0.0)
    numPosClass = np.sum(np.array(classLabels) == 1.0)
    yStep = 1.0/numPosClass
    xStep = 1.0/(len(classLabels)-numPosClass)
    print(np.array(predStrengths.flatten()))
    sortedIndicies = np.argsort(-np.array(predStrengths.flatten()))
    print(sortedIndicies)
    fig = plt.figure()
    fig.clf()
    ySum = 0.0
    ax = plt.subplot(111)
    for index in sortedIndicies:
        if classLabels[index] == 1.0:
            delY = yStep; delX=0
        else:
            delY = 0; delX = xStep
            ySum += cur[1]
        ax.plot([cur[0], cur[0]+delX], [cur[1], cur[1]+delY], c='b')
        cur = (cur[0]+delX, cur[1]+delY)
        print(cur)
    ax.plot([0, 1], [0, 1], 'b--')
    ax.axis([0, 1, 0, 1])
    plt.xlabel('False Positve Rate')
    plt.ylabel('True Postive Rate')
    plt.title('ROC curve for AdaBoost Horse Colic Detection System')
    ax.axis([0, 1, 0, 1])
    plt.show()
    print('the Area under the curve is:', ySum*xStep)

代碼解釋:

上述程序中的函數有兩個輸入參數,第一個參數就代表的是score,代表的是分類器的預測強度。第二個參數是classLabels,即樣本真實的類標籤。首先創建一個浮點數二元組cur,將它初始化爲(0.0,0.0),代表從座標點(0.0,0.0)開始繪製ROC曲線。接着通過數組過濾的方式計算正例的數目,並將該值賦給numPosClas,該值確定了在y座標軸上的步進數目。(因爲y軸的含義是有多少正例被預測出來,所以它的長度爲正例的數目),相應的,也可以得到x軸的步長。

接下來,我們將score從大到小排序得到排序索引,因爲threshold是從大到小設置。所以最開始threshold爲1.0,即所有樣本都被預測爲負例,因此是從點(0,0)開始繪製。當在循環中遍歷座標點時,每當得到一個類別爲1的樣本,那麼就要沿着y軸增加一個步長,即增加真陽率。對於類別爲0的樣本,則沿着x軸增加一個步長,增加假陽率。一旦確定了是在哪個軸的方向熵進行移動的,就可以在當前點和新點之間畫出一條線段,再更新座標點cur。

(例如,對與樣本點1,當前threshold爲0.9,即score大於等於0.9的樣本爲正,小於爲負,那麼樣本點1就被預測爲正,而該樣本的真實標籤也爲正,所以真陽率+1。同理,當遍歷到樣本3時,threshold設爲0.7,此時樣本3被預測爲正例,但是該樣本其實爲負例,所以假陽率+1,代表又一個負樣本被誤判爲正例。)

爲了計算,我們需要對多個小矩形的面積進行累加。這些小矩形的寬度是xStep,因此我們可以對所有矩形的高度進行累加,所有高度的和隨着x軸的每次移動而依次增加,然後再乘以xStep得到總面積。

運行結果:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章