模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.

时间:2022-12-08 09:57:45

模式识别 评价方法 ===> 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];
end
dot_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 、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 : 

% 根据 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正、负标记分布曲线')

中间结果:

模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.  模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.

                                    (1)                                                                                          (2)

模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.  模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.

                                  (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来说,更接近于分类器的实际应用情况。


模式识别 评价方法 ROC曲线, DET曲线, FPPW, FPPI etc.