文章出處

從TP、FP、TN、FN到ROC曲線、miss rate、行人檢測評估

想要在行人檢測的evaluation階段要計算miss rate,就要從True Positive Rate講起:miss rate = 1 - true positive rate

true positive rate畢竟是一個rate,是一個比值。是誰和誰比呢?P

要從TP、FP、TN、FN講起。
考慮一個二分類問題:一個item,它實際值有0、1兩種取值,即負例、正例;而二分類算法預測出來的結果,也只有0、1兩種取值,即負例、正例。我們不考慮二分類算法細節,當作黑箱子就好;我們關心的是,預測的結果和實際情況匹配、偏差的情況。

TP:true positive,實際是正例,預測為正例
FP:false positive,實際為負例,預測為正例
TN:true negative,實際為負例,預測為負例
FN:false negative,實際為正例,預測為負例

也就是說:我們不僅考慮算法的預測結果對不對,還要考慮是“哪一種對”;我們還考慮算法預測錯的情況,并且我們深究“是哪一種錯”:
Alt text

OK,既然把TP、FP、TN、FN搞清楚了,那么看幾個rate的定義。
TPR:true positive rate, 等于,又叫precision rate
FPR:false positive rate,等于
TNR:true negative rate,等于
FNR:false negative rate,等于,又叫miss rate
觀察后不難發現,每個rate的公式,都是前,#表示number,即統計數量。
而結合前面畫的那張圖,容易發現,每個rate公式還可以通過畫圖理解:每個rate都等于,雖然這么說起來不嚴謹,赫赫但是形象化的理解更容易記住。
還有一點:fnr+tpr=1, fpr+tnr=1
其實后面使用到的,更多的是fnr,俗稱miss rate,作為ROC曲線的縱坐標;而橫坐標則取fpr

理解閾值
再次考慮二分類問題。你說,真實世界會存在嚴格的二分類嗎?就說人的性取向,有的人也是“徘徊不定”的,這樣的人真是讓人頭疼但是必須想辦法處理掉。因此設定一個閾值:根據這個人的一系列舉動,給ta的性別累計打分并最終映射到[0,1]區間(得到score),然后比如設定閾值t為0.5,若score>t=0.5,那么ta是男的;否則是女的。
回到理論上,每一個需要預測的變量,其取值都可以根據閾值進行劃分。對于二分類,我設定閾值t,當某個item取值大于t,就判定為正例(positive),否則判定為負例(negative)。
也就是說,我手頭有一堆預測得到的數據(甭管我用的是哪種機器學習算法),我通過設定不同的閾值,能得到不同的TP、FP、TN、FN取值,相應的TPR、FPR、TNR、FNR取值也產生變化。那么這種變化我就可以通過圖像顯示出來:對于一個確定的閾值t,FPR和TPR是確定的,得到一個(fpr,tpr)元組;將閾值從0到1變化,當t=0時所有預測結果都大于0都是Positive所以FP=TP=1,FN=TN=0,fpr=tpr=1,得到(1,1)點,當t=1時所有預測結果都小于0都是Negative所以FP=TP=0,FN=TN=1,fpr=tpr=0,得到(0,0)點,t取(0,1)上的值時則fpr和tpr都在0到1之間變化,且不難發現:當t增加,#FP也減小,#TN增加,則fpr減小;當t增加,#TP減小,#FN增加,則tpr減小。也就是說,當閾值t從0變化到1,fpr和tpr也單調減小,從(1,1)減小到(0,0)

呃,這里不知道為什么,大多數我看到的文獻,都是畫出fpr和tpr的圖像,而把閾值本身省掉了,得到ROC曲線:
Alt text

Anyway,我們繼續,我們的目標是搞清楚行人檢測評估中的miss rate怎么算。等等,好像已經出來了:miss rate = 1 - true positive rate,那么對應的YoX圖像,也就是miss rate - false positive rate圖像,就應當是單調下降的曲線。

繪圖
干巴巴的說什么單調增加單調下降缺少直觀印象,有代碼有繪圖才是正道~
我使用的是Caltech行人檢測數據集網站主頁提供的matlab工具,因為想要搞明白的miss rate是在pedestrian檢測中作為評價標準出現,而這個Caltech數據集以及matlab工具都是行人檢測中會用到的工具。廢話不多說,下載好這個toolbox后打開并添加到path中,進入matlab目錄調用plotRoc函數就能玩了,比如:

1.k=2; x=0:.0001:1; data1 = [1-x; (1-x.^k).^(1/k)]';
2.k=3; x=0:.0001:1; data2 = [1-x; (1-x.^k).^(1/k)]';
3.hs(1)=plotRoc(data1,struct('color','g','marker','s'));
4.hs(2)=plotRoc(data2,struct('color','b','lineSt','--'));
5.legend( hs, {'roc1','roc2'} ); xlabel('fp'); ylabel('fn');

Alt text

圖中縱坐標標記為fn,其實是fnr(false negative rate),也就是1-tnr。fnr俗稱miss rate。而橫坐標fpr(false positive rate),也可以用FPPI(False Positive Per Image)或者FPPW(False Positive Per Window)來表示。

OK,總算搞懂了:要想繪制行人檢測的evaluation階段的miss rate - FPPI圖像(roc曲線),需要有帶annotation的測試圖片(提供作為ground truth的object window的bbox坐標),并且用某個算法(各種機器學習模型都行,看效果了)對每個測試圖片算出若干bbox坐標:前者()作為“實際取值”,后者()作為“預測取值”,當閾值t從0變化到1,每個預測取值也會變化,從{TP,FP,TN,FN}中取值,而在任意一個t的取值上,FPR、FNR(miss rate)都可以通過統計#TP,#FP,#TN,#FN后算出,因而就能得到plotRoc繪圖函數所需的參數D,進而繪制出ROC曲線勒~

 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()