轉載自:http://blog.csdn.net/pb09013037/article/details/48949037
因個人在做模式識別相關的工作,模式識別算法最終的性能評價是關鍵。但苦于網上很難找到具體、詳細的評價流程、方法以及代碼,所以本人打算近期準備如題所示評價方法的整理工作,到時候會奉上方法介紹、基礎代碼(matlab 版),以幫助更多像我這樣對這些方法有些迷茫的人。
暫時提供matlab中自帶的ROC,DET曲線繪制函數: perfcurve()
具體使用方法,中文鏈接:http://ilovematlab.cn/thread-76781-1-1.html
MathWork Manual(文檔源自matlab2013。之前低版本中應該有該函數,但本人在自己的2008a版本中沒有發現,2010版本中應該有):?http://www.mathworks.cn/cn/help/stats/perfcurve.html
自編 ROC 曲線及相關中間結果的計算代碼。
Main function:
[plain]?view plaincopy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?? %function:?ROC?curve?related?? %???date?:?2013.07.01?? %?author?:?Xin?Yang,?School?of?medicine,?SZU?? %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?? ?? %?根據Label8score文件繪制?ROC、DET曲線?? %?獲取數據文件路徑?? [filename,?pathname]?=?uigetfile(?{'*.txt',?'Model?Files?(*.txt)';?...?? '*.*',?'All?Files?(*.*)'},?'選擇?ROC?數據源','F:\Result\FPPW\');?? if?isequal(filename,0)?||?isequal(pathname,0)?? ????return;%如果點了“取消”?? else?? ????L8S_file?=?[pathname?,?filename];?? end?? dot_num?=?50;?? YX_Roc(L8S_file?,?dot_num);?? %?YX_DET_Curve(L8S_file?,?dot_num);??
YX_Roc function:
[plain]?view plaincopy %?根據?標記&預測得分文件?繪制ROC曲線?? function?YX_Roc(Label8ScoreFile?,?dot_num)?? %?加載?標記&預測得分?數據文件??1:正?0:負?? Mat_L8S?=?load(Label8ScoreFile);?? sample_num?=?size(Mat_L8S?,1);?? %?繪制正、負標記分布趨勢圖,用于觀察正負樣本的交叉程度?? Plot_PN_pdf(Mat_L8S);?? ?? Label?=?Mat_L8S(:,1);%?人工標記?? Score?=?Mat_L8S(:,2);%?算法評分?? %?分數上下限?? Upper?=?max(Score);?? Lower?=?min(Score);?? %?拓寬分數上下限,便于達到極限?? Upper?=?Upper?+?0.1;?? Lower?=?Lower?-?0.1;?? %?點數?? bins?=?dot_num;?? %?步進?? step?=?(Upper?-?Lower)/bins;?? %?閾值變化?? T?=?Lower:step:Upper;?? T_num?=?bins?+?1;?? %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%?? %?計算?TPR?、FPR?? TPR?=?zeros(T_num?,1);?? FPR?=?zeros(T_num?,1);?? %?遍歷閾值?? for?i?=?1:T_num?? ????T_temp?=?T(i);?? ????TP?=?0?;?FN?=?0;%?清零?? ????FP?=?0?;?TN?=?0;?? ????%?遍歷樣本?? ????for?j?=?1:sample_num?? ????????if?(Label(j)?==?1)?? ????????????if?(Score(j)?>=?T_temp)?? ????????????????TP?=?TP?+?1;%?真陽?? ????????????else?? ????????????????FN?=?FN?+?1;%?假陰?? ????????????end?? ????????elseif?(Label(j)?==?0)?? ????????????if?(Score(j)?>=?T_temp)?? ????????????????FP?=?FP?+?1;%?假陽?? ????????????else?? ????????????????TN?=?TN?+?1;%?真陰?? ????????????end?? ????????end?? ????end?? ????%?*****?? ????TPR(i)?=?TP/(TP?+?FN);?? ????FPR(i)?=?FP/(FP?+?TN);?? end?? %?ROC?曲線?? figure?? plot(FPR?,?TPR?,?'c',?'LineWidth',2);?? axis([0?,1?,0?,1]);?? xlabel('1-Specificity')?? ylabel('Sensitivity')?? title('ROC')?? grid?on?? %?Youden?指數?? figure?? X?=?TPR-FPR;?? plot(X?,'r','LineWidth',2);?? title('Youden?指數');?? %?TPR、FPR?隨閾值的變化,便于觀察、確定閾值?? figure?,plot3(FPR?,?TPR?,?T?,'Color'?,?'r'?,'LineWidth',2);?? xlabel('\fontsize{14}\bfX軸?--?FPR')?? ylabel('\fontsize{14}\bfY軸?--?TPR')?? zlabel('\fontsize{14}\bfZ軸?--?Threshold')?? title('\fontsize{14}\bf閾值選取')??
Plot_PN_pdf function :?
[plain]?view plaincopy %?根據?Label2Score?繪制正、負標記的概率密度函數曲線?? function?Plot_PN_pdf(Mat_label2score)?? ?? [La_P_r?,?La_P_c]?=?find(Mat_label2score(:,1)?==?1);?? [La_N_r?,?La_N_c]?=?find(Mat_label2score(:,1)?==?0);?? ?? P_Score?=?Mat_label2score(La_P_r?,?2);?? N_Score?=?Mat_label2score(La_N_r?,?2);?? ?? [P_Count?,?P_bin]?=?hist(P_Score?,?50);?? [N_Count?,?N_bin]?=?hist(N_Score?,?50);?? P_Count?=?(P_Count?-?min(P_Count))/(max(P_Count)?-?min(P_Count));?? N_Count?=?(N_Count?-?min(N_Count))/(max(N_Count)?-?min(N_Count));?? ?? figure??? values?=?spcrv([[P_bin(1)?P_bin?P_bin(end)];[P_Count(1)?P_Count?P_Count(end)]],3);?? plot(values(1,:),values(2,:),'Color'?,?'r'?,'LineWidth',2);?? hold?on??? values?=?spcrv([[N_bin(1)?N_bin?N_bin(end)];[N_Count(1)?N_Count?N_Count(end)]],3);?? plot(values(1,:),values(2,:),'Color'?,?'b'?,'LineWidth',2);?? legend('\fontsize{14}\it??P-Labeled','\fontsize{14}\it??N-Labeled')?? xlabel('\fontsize{14}\bfScore')?? ylabel('\fontsize{14}\bffrequency')?? title('\fontsize{14}\bf正、負標記分布曲線')??
?
中間結果:
??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??(1) ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??(2)
??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??(3)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(4)
(1)圖刻畫了正負測試數據的預測得分分布(概率密度函數),并表明了正負測試樣本得分的交叉程度。交叉程度由兩者曲線下的交叉部分的積分,即面積決定。交叉越多,則表明分類器效果越差,反之,效果越好。
(2)圖則是ROC曲線,越靠近左上角,分類器性能越好。
(3)圖則是ROC曲線應用時,選取實際應用閾值的參考方法之一:Youden指數。曲線最高點對應的閾值為最好的應用閾值。Youden指數可參考如下文章第6頁:http://www.medicalbiostatistics.com/roccurve.pdf
(4)圖是基于ROC,選取閾值的曲線。X, Y分別為假陽率、真陽率,Z軸則是相應的閾值。要始終記住的是,ROC曲線的產生,就是因為以閾值作為變量,在不同閾值下,得到的多組真陽、假陽率點繪制而來的ROC曲線。所以ROC曲線上的任何一個點,都是有對應的閾值的。繪制ROC曲線的目的,除了直觀的看到分類器性能,另一個重要作用就是,根據ROC曲線,選取一個合理的閾值,用于實際檢測、應用、判定。
另附兩篇個人覺得很有用的博文鏈接,是關于ROC和Precision-Recall的講解的:
[1]?http://www.zhizhihu.com/html/y2012/4076.html
[2]?http://blog.csdn.net/abcjennifer/article/details/7834256
//=============== 28-Aug-2015 增加==================//
目標檢測中另外常用的評價標準則是FPPW和FPPI,詳細應用可以參考這篇文章:
Pedestrian detection: A?benchmark
兩者都側重考察FP(False Positive)出現的頻率。
FPPW (False Positive per Window)
基本含義:給定一定數目N的負樣本圖像,分類器將負樣本判定為“正”的次數FP,其比率FP/N即為FPPW。意義與ROC中的假陽率相同。FPPW中,一張圖就是一個樣本。
FPPI (False Positive per Image)
基本含義:給定一定數目N的樣本集,內含N張圖像,每張圖像內包含或不包含檢測目標。
每張圖像均需要標定:
1.包含目標的個數;
2. 目標的準確位置L。
而后在每張圖像上運行分類器,檢測目標并得到位置p。然后,檢查每張圖像內的檢測結果是否“擊中”標定的目標:
a. 若圖像內無目標,而分類器給出了n個“目標”檢測結果,那么False Positive 次數 +n;
b. 若圖像內有目標,則判斷p是否擊中L,判斷標準參看上述文章(主要看p與L的重疊率)。若判斷未擊中,則False Positive 次數 +1。
最后 FPPI = (False Positive 次數)/N。
FPPI 相比于FPPW來說,更接近于分類器的實際應用情況。
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的模式识别的评价方法:ROC曲线, DET曲线, FPPW, FPPI的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。