考慮一個二分問題,即將實例分成正類(positive)或負類(negative)。對一個二分問題來說,會出現四種情況。如果一個實例是正類並且也被 預測成正類,即為真正類(True positive),如果實例是負類被預測成正類,稱之為假正類(False positive)。相應地,如果實例是負類被預測成負類,稱之為真負類(True negative),正類被預測成負類則為假負類(false negative)。
列聯表如下表所示,1代表正類,0代表負類。
預測
|
||||
1
|
0
|
合計
|
||
實際
|
1
|
True Positive(TP)
|
False Negative(FN)
|
Actual Positive(TP+FN)
|
0
|
False Positive(FP)
|
True Negative(TN)
|
Actual Negative(FP+TN)
|
|
合計
|
Predicted Positive(TP+FP)
|
Predicted Negative(FN+TN)
|
TP+FP+FN+TN
|
從列聯表引入兩個新名詞。其一是真正類率(true positive rate ,TPR), 計算公式為
TPR=TP/ (
TP+
FN),刻畫的是
分類器所識別出的 正實例占所有正實例的比例。另外一個是假正類率(false positive rate, FPR),計算公式為
FPR= FP / (FP + TN),計算的是
分類器錯認為正類的負實例占所有負實例的比例。還有一個真負類率(True Negative Rate,TNR),也稱為specificity,計算公式為TNR=
TN/ (
FP+
TN) = 1 -
FPR。
在一個二分類模型中,對於所得到的連續結果,假設已確定一個
閥值,比如說 0.6,大於這個值的實例划歸為正類,小於這個值則划到負類中。如果減小
閥值,減到0.5,固然能識別出更多的正類,也就是提高了識別出的正例占所有正例的比例,即TPR,但同時也將更多的負實例當作了正實例,即提高了FPR。為了形象化這一變化,在此引入ROC。
Receiver Operating Characteristic,翻譯為"接受者操作特性曲線",夠拗口的。曲線由兩個變量1-specificity 和 Sensitivity繪制. 1-specificity=FPR,即假正類率。Sensitivity即是真正類率,TPR(True positive rate),反映了正類覆蓋程度。這個組合以1-specificity對sensitivity,即是以代價(costs)對收益(benefits)。
下表是一個邏輯回歸得到的結果。將得到的實數值按大到小划分成10個個數 相同的部分。
Percentile
|
實例數
|
正例數
|
1-特異度(%)
|
敏感度(%)
|
10
|
6180
|
4879
|
2.73
|
34.64
|
20
|
6180
|
2804
|
9.80
|
54.55
|
30
|
6180
|
2165
|
18.22
|
69.92
|
40
|
6180
|
1506
|
28.01
|
80.62
|
50
|
6180
|
987
|
38.90
|
87.62
|
60
|
6180
|
529
|
50.74
|
91.38
|
70
|
6180
|
365
|
62.93
|
93.97
|
80
|
6180
|
294
|
75.26
|
96.06
|
90
|
6180
|
297
|
87.59
|
98.17
|
100
|
6177
|
258
|
100.00
|
100.00
|
其正例數為此部分里實際的正類數。也就是說,將邏輯回歸得到的結 果按從大到小排列,倘若以前10%的數值作為
閥值,即將前10%的實例都划歸為正類,6180個。其中,正確的個數為4879個,占所有正類的 4879/14084*100%=34.64%,即敏感度;另外,有6180-4879=1301個負實例被錯划為正類,占所有負類的1301 /47713*100%=2.73%,即1-特異度。以這兩組值分別作為x值和y值,在excel中作散點圖。得到ROC曲線如下

roc曲線
上面的部分均來自百度百科。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面是自己的理解,如果不正確,歡迎指正(雖說基本上沒啥人看。。。)
前幾天畫了ROC曲線,其實按照自己的理解,就是錯誤接受率(FAR,false acceptance rate)和錯誤拒絕率(FRR,false rejection rate)的關系曲線。FAR對應FP,FRR對應FN。這兩個通過閾值T來計算。因為對於分類問題,都需要一個閾值,來判斷某樣本是屬於positive還是negative。對應於每個閾值,都可以得到一個FAR和一個FRR。按照不同的stepsize,得到不同的閾值,便可以得到對應的一組FAR和FRR。之后畫FAR和FRR的關系,便是ROC曲線。
matlab代碼如下(由於FAR和FRR的數據變化范圍比較大,因而使用了對數坐標log):
1 load('result.mat'); 2 Pnum=length(resultP); 3 Nnum=length(resultN); 4 5 minN=min(resultN); 6 maxN=max(resultN); 7 8 index=0; 9 for threshold=minN:0.002:maxN 10 index=index+1; 11 FRR(index)=length(find(resultP>threshold))/Pnum; 12 FAR(index)=length(find(resultN<threshold))/Nnum; 13 thresholdT(index)=threshold; 14 end 15 plot(FAR,FRR); 16 title('ROC曲線'); 17 set(gca,'yscale','log') 18 set(gca,'xscale','log') 19 axis([min(FAR) max(FAR)+0.01 min(FRR) max(FRR)]) 20 grid on 21 grid minor 22 23 set(gca,'YTickMode','manual'); 24 set(gca,'YMinorTick','on'); 25 ylabelval=[1e-4 1e-3 1e-2 1e-1 0.2]'; 26 set(gca,'ytick',ylabelval') ; 27 for kk=1:1:length(ylabelval) 28 b(kk)='%'; 29 end 30 ylabeltick=[num2str(ylabelval*100),b']; 31 set(gca,'yticklabel',ylabeltick) ; 32 33 set(gca,'XTickMode','manual'); 34 xlabelval=[1e-6 1e-5 1e-4 1e-3 1e-2 1e-1 1]'; 35 set(gca,'xtick',xlabelval) ; 36 for kk=1:1:length(xlabelval) 37 a(kk)='%'; 38 end 39 xlabeltick=[num2str(xlabelval*100),a']; 40 set(gca,'xticklabel',xlabeltick); 41 xlabel('FAR'); 42 ylabel('FRR');
畫出來的結果如下: