假設現在有一個二分類問題,先引入兩個概念:
- 真正例率(TPR):正例中預測為正例的比例
- 假正例率(FPR):反例中預測為正例的比例
再假設樣本數為6,現在有一個分類器1,它對樣本的分類結果如下表(按預測值從大到小排序)
ROC曲線的橫軸為假正例率,縱軸為真正例率,范圍都是[0,1],現在我們開始畫圖——根據從大到小遍歷預測值,把當前的預測值當做閾值,計算FPR和TPR。
step1:選擇閾值最大,即為1,正例中和反例中都沒有預測值大於等於1的,所以FPR=TPR=0。
step2:根據上表,選擇閾值為0.9,正例中有1個樣本的預測值大於等於1,反例中有0個,所以,TPR=1/3,FPR=0。
step3:根據上表,選擇閾值為0.8,正例中有2個樣本的預測值大於等於1,反例中有0個,所以,TPR=2/3,FPR=0。
step4:根據上表,選擇閾值為0.7,正例中有3個樣本的預測值大於等於1,反例中有0個,所以,TPR=1,FPR=0。
step5:根據上表,選擇閾值為0.3,正例中有3個樣本的預測值大於等於1,反例中有1個,所以,TPR=1,FPR=1/3。
step6:根據上表,選擇閾值為0.2,正例中有3個樣本的預測值大於等於1,反例中有2個,所以,TPR=1,FPR=2/3。
step7:根據上表,選擇閾值為0.1,正例中有3個樣本的預測值大於等於1,反例中有3個,所以,TPR=1,FPR=1。
綜上,我們得到下表:
描點連線,畫出的圖是下面這樣什兒的
可以看出這個分類器還是很理想的。
假設現在又有一個分類器2,對同樣一組樣本,分類結果如下
根據上面描述的方法,畫出ROC曲線如下
發現這個曲線的左上角比之前往右下角凹了一點。
emmmm,現在又來了一個分類器3,對同樣一組樣本,分類結果如下
不多說,直接畫圖——
哎?這個曲線比之前更“凹”了。
實際上,不用畫出曲線,只是根據這3個分類器的分類結果,我們也能大概能分析出它們的性能:分類器1>分類器2>分類器3。
對分類器1的預測結果來說,所有的正例的預測值都在1這一側,所有反例的預測值都在0那一側,只要閾值取得合適,即閾值落在(0.3,0.7)內都可以。
再看分類器2的預測結果,出現了對反例的預測值(0.75)大於對正例的預測值了(0.7),所以不能選擇一個合適的閾值把這兩類完全分開,所以反映在圖上就是左上角凹了一點,但對大部分樣本還是可以正確分類的。
再看分類器3的預測結果,這種不穩定性就更明顯了,所以相比前兩個的ROC曲線,凹得就更多了。
從這個角度,也就不難得出,ROC下面的面積越大,分類器越好的結論了。當然還有嚴格的數學角度的分析,感興趣的,了解一下。
下面附上畫圖用的matlab代碼
clear; clc; % 分類器1 % label = [1,1,1,0,0,0]; % predict = [0.9,0.8,0.7,0.3,0.2,0.1]; % 分類器2 % label = [1,1,0,1,0,0]; % predict = [0.9,0.8,0.75,0.7,0.2,0.1]; % 分類器3 label = [1,0,0,1,1,0]; predict = [0.9,0.8,0.78,0.75,0.2,0.1]; TPR=[]; FPR=[]; numPositive = size(find(label==1),2); numNegative = size(find(label==0),2); postive = predict(find(label==1)); negative = predict(find(label==0)); for i=1:size(label,2)+1 if i==1 cur = 1; else cur = predict(i-1); end TPR(i) = size(find(postive>=cur),2)/numPositive; FPR(i) = size(find(negative>=cur),2)/numNegative; end plot(FPR,TPR,'k*-') axis([0 1 0 1]); xlabel('FPR') ylabel('TPR')