ROC曲線

ROC曲線

對於0,1兩類分類問題,一些分類器得到的結果往往不是0,1這樣的標籤,如神經網絡,得到諸如0.5,0,8這樣的分類結果。這時,我們人爲取一個閾值,比如0.4,那麼小於0.4的爲0類,大於等於0.4的爲1類,可以得到一個分類結果。同樣,這個閾值我們可以取0.1,0.2等等。取不同的閾值,得到的最後的分類情況也就不同。

如下面這幅圖:


藍色表示原始爲負類分類得到的統計圖,紅色爲正類得到的統計圖。那麼我們取一條直線,直線左邊分爲負類,右邊分爲正,這條直線也就是我們所取的閾值。

閾值不同,可以得到不同的結果,但是由分類器決定的統計圖始終是不變的。這時候就需要一個獨立於閾值,只與分類器有關的評價指標,來衡量特定分類器的好壞。

還有在類不平衡的情況下,如正樣本90個,負樣本10個,直接把所有樣本分類爲正樣本,得到識別率爲90%。但這顯然是沒有意義的。

如上就是ROC曲線的動機。

關於兩類分類問題,原始類爲positive,negative,分類後的類別爲p,n。排列組合後得到4種結果,如下:


於是我們得到四個指標,分別爲真陽,僞陽;僞陰,真陰。

ROC空間將僞陽性率(FPR)定義爲 X 軸,真陽性率(TPR)定義爲 Y 軸。這兩個值由上面四個值計算得到,公式如下:

TPR:在所有實際爲陽性的樣本中,被正確地判斷爲陽性之比率。

TPR=TP/(TP+FN)

FPR:在所有實際爲陰性的樣本中,被錯誤地判斷爲陽性之比率。

FPR=FP/(FP+TN)

放在具體領域來理解上述兩個指標。

如在醫學診斷中,判斷有病的樣本。

那麼儘量把有病的揪出來是主要任務,也就是第一個指標TPR,要越高越好。

而把沒病的樣本誤診爲有病的,也就是第二個指標FPR,要越低越好。

不難發現,這兩個指標之間是相互制約的。如果某個醫生對於有病的症狀比較敏感,稍微的小症狀都判斷爲有病,那麼他的第一個指標應該會很高,但是第二個指標也就相應地變高。最極端的情況下,他把所有的樣本都看做有病,那麼第一個指標達到1,第二個指標也爲1。

我們以FPR爲橫軸,TPR爲縱軸,得到如下ROC空間。


我們可以看出,左上角的點(TPR=1,FPR=0),爲完美分類,也就是這個醫生醫術高明,診斷全對。

點A(TPR>FPR),醫生A的判斷大體是正確的。中線上的點B(TPR=FPR),也就是醫生B全都是蒙的,蒙對一半,蒙錯一半;下半平面的點C(TPR<FPR),這個醫生說你有病,那麼你很可能沒有病,醫生C的話我們要反着聽,爲真庸醫。

上圖中一個閾值,得到一個點。現在我們需要一個獨立於閾值的評價指標來衡量這個醫生的醫術如何,也就是遍歷所有的閾值,得到ROC曲線。

還是一開始的那幅圖,假設如下就是某個醫生的診斷統計圖,直線代表閾值。我們遍歷所有的閾值,能夠在ROC平面上得到如下的ROC曲線。


曲線距離左上角越近,證明分類器效果越好。

 

如上,是三條ROC曲線,在0.23處取一條直線。那麼,在同樣的低FPR=0.23的情況下,紅色分類器得到更高的PTR。也就表明,ROC越往上,分類器效果越好。我們用一個標量值AUC來量化他。

AUC

AUC值爲ROC曲線所覆蓋的區域面積,顯然,AUC越大,分類器分類效果越好。

AUC = 1,是完美分類器,採用這個預測模型時,不管設定什麼閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。

0.5 < AUC < 1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。

AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。

AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優於隨機猜測。

AUC的物理意義

假設分類器的輸出是樣本屬於正類的socre(置信度),則AUC的物理意義爲,任取一對(正、負)樣本,正樣本的score大於負樣本的score的概率。

計算AUC:

第一種方法:AUC爲ROC曲線下的面積,那我們直接計算面積可得。面積爲一個個小的梯形面積之和。計算的精度與閾值的精度有關。

第二種方法:根據AUC的物理意義,我們計算正樣本score大於負樣本的score的概率。取N*M(N爲正樣本數,M爲負樣本數)個二元組,比較score,最後得到AUC。時間複雜度爲O(N*M)。

第三種方法:與第二種方法相似,直接計算正樣本score大於負樣本的概率。我們首先把所有樣本按照score排序,依次用rank表示他們,如最大score的樣本,rank=n(n=N+M),其次爲n-1。那麼對於正樣本中rank最大的樣本,rank_max,有M-1個其他正樣本比他score小,那麼就有(rank_max-1)-(M-1)個負樣本比他score小。其次爲(rank_second-1)-(M-2)。最後我們得到正樣本大於負樣本的概率爲


時間複雜度爲O(N+M)。

MATLAB實現

MATLAB自帶plotroc()方法,繪製ROC曲線,參數如下:

plotroc(targets,outputs);

第一個參數爲測試樣本的原始標籤,第二個參數爲分類後得到的標籤。

兩個爲行或列向量,相同維數即可。

AUC matlab代碼:

function [result]=AUC(test_targets,output)
%計算AUC值,test_targets爲原始樣本標籤,output爲分類器得到的標籤
%均爲行或列向量
[A,I]=sort(output);
M=0;N=0;
for i=1:length(output)
    if(test_targets(i)==1)
        M=M+1;
    else
        N=N+1;
    end
end
sigma=0;
for i=M+N:-1:1
    if(test_targets(I(i))==1)
        sigma=sigma+i;
    end
end
result=(sigma-(M+1)*M/2)/(M*N);
發佈了11 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章