模式識別 評價方法 ===> ROC 曲線 DET 曲線 FPPW FPPI
因個人在做模式識別相關的工作,模式識別演算法最終的效能評價是關鍵。但苦於網上很難找到具體、詳細的評價流程、方法以及代碼,所以本人打算近期準備如題所示評價方法的整理工作,到時候會奉上方法介紹、基礎代碼(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:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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];enddot_num = 50;YX_Roc(L8S_file , dot_num);% YX_DET_Curve(L8S_file , dot_num);
YX_Roc function:
% 根據 標記&預測得分檔案 繪製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 、FPRTPR = 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 曲線figureplot(FPR , TPR , 'c', 'LineWidth',2);axis([0 ,1 ,0 ,1]);xlabel('1-Specificity')ylabel('Sensitivity')title('ROC')grid on% Youden 指數figureX = 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 :
% 根據 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來說,更接近於分類器的實際應用情況。