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

因个人在做模式识别相关的工作,模式识别算法最终的性能评价是关键。但苦于网上很难找到具体、详细的评价流程、方法以及代码,所以本人打算近期准备如题所示评价方法的整理工作,到时候会奉上方法介绍、基础代码(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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  2. %function: ROC curve related  
  3. %   date : 2013.07.01  
  4. % author : Xin Yang, School of medicine, SZU  
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  6.   
  7. % 根据Label8score文件绘制 ROC、DET曲线  
  8. % 获取数据文件路径  
  9. [filename, pathname] = uigetfile( {'*.txt', 'Model Files (*.txt)'; ...  
  10. '*.*', 'All Files (*.*)'}, '选择 ROC 数据源','F:\Result\FPPW\');  
  11. if isequal(filename,0) || isequal(pathname,0)  
  12.     return;%如果点了“取消”  
  13. else  
  14.     L8S_file = [pathname , filename];  
  15. end  
  16. dot_num = 50;  
  17. YX_Roc(L8S_file , dot_num);  
  18. % YX_DET_Curve(L8S_file , dot_num);  

YX_Roc function:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. % 根据 标记&预测得分文件 绘制ROC曲线  
  2. function YX_Roc(Label8ScoreFile , dot_num)  
  3. % 加载 标记&预测得分 数据文件  1:正 0:负  
  4. Mat_L8S = load(Label8ScoreFile);  
  5. sample_num = size(Mat_L8S ,1);  
  6. % 绘制正、负标记分布趋势图,用于观察正负样本的交叉程度  
  7. Plot_PN_pdf(Mat_L8S);  
  8.   
  9. Label = Mat_L8S(:,1);% 人工标记  
  10. Score = Mat_L8S(:,2);% 算法评分  
  11. % 分数上下限  
  12. Upper = max(Score);  
  13. Lower = min(Score);  
  14. % 拓宽分数上下限,便于达到极限  
  15. Upper = Upper + 0.1;  
  16. Lower = Lower - 0.1;  
  17. % 点数  
  18. bins = dot_num;  
  19. % 步进  
  20. step = (Upper - Lower)/bins;  
  21. % 阈值变化  
  22. T = Lower:step:Upper;  
  23. T_num = bins + 1;  
  24. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  25. % 计算 TPR 、FPR  
  26. TPR = zeros(T_num ,1);  
  27. FPR = zeros(T_num ,1);  
  28. % 遍历阈值  
  29. for i = 1:T_num  
  30.     T_temp = T(i);  
  31.     TP = 0 ; FN = 0;% 清零  
  32.     FP = 0 ; TN = 0;  
  33.     % 遍历样本  
  34.     for j = 1:sample_num  
  35.         if (Label(j) == 1)  
  36.             if (Score(j) >= T_temp)  
  37.                 TP = TP + 1;% 真阳  
  38.             else  
  39.                 FN = FN + 1;% 假阴  
  40.             end  
  41.         elseif (Label(j) == 0)  
  42.             if (Score(j) >= T_temp)  
  43.                 FP = FP + 1;% 假阳  
  44.             else  
  45.                 TN = TN + 1;% 真阴  
  46.             end  
  47.         end  
  48.     end  
  49.     % *****  
  50.     TPR(i) = TP/(TP + FN);  
  51.     FPR(i) = FP/(FP + TN);  
  52. end  
  53. % ROC 曲线  
  54. figure  
  55. plot(FPR , TPR , 'c', 'LineWidth',2);  
  56. axis([0 ,1 ,0 ,1]);  
  57. xlabel('1-Specificity')  
  58. ylabel('Sensitivity')  
  59. title('ROC')  
  60. grid on  
  61. % Youden 指数  
  62. figure  
  63. X = TPR-FPR;  
  64. plot(X ,'r','LineWidth',2);  
  65. title('Youden 指数');  
  66. % TPR、FPR 随阈值的变化,便于观察、确定阈值  
  67. figure ,plot3(FPR , TPR , T ,'Color' , 'r' ,'LineWidth',2);  
  68. xlabel('\fontsize{14}\bfX轴 -- FPR')  
  69. ylabel('\fontsize{14}\bfY轴 -- TPR')  
  70. zlabel('\fontsize{14}\bfZ轴 -- Threshold')  
  71. title('\fontsize{14}\bf阈值选取')  

Plot_PN_pdf function : 

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. % 根据 Label2Score 绘制正、负标记的概率密度函数曲线  
  2. function Plot_PN_pdf(Mat_label2score)  
  3.   
  4. [La_P_r , La_P_c] = find(Mat_label2score(:,1) == 1);  
  5. [La_N_r , La_N_c] = find(Mat_label2score(:,1) == 0);  
  6.   
  7. P_Score = Mat_label2score(La_P_r , 2);  
  8. N_Score = Mat_label2score(La_N_r , 2);  
  9.   
  10. [P_Count , P_bin] = hist(P_Score , 50);  
  11. [N_Count , N_bin] = hist(N_Score , 50);  
  12. P_Count = (P_Count - min(P_Count))/(max(P_Count) - min(P_Count));  
  13. N_Count = (N_Count - min(N_Count))/(max(N_Count) - min(N_Count));  
  14.   
  15. figure   
  16. values = spcrv([[P_bin(1) P_bin P_bin(end)];[P_Count(1) P_Count P_Count(end)]],3);  
  17. plot(values(1,:),values(2,:),'Color' , 'r' ,'LineWidth',2);  
  18. hold on   
  19. values = spcrv([[N_bin(1) N_bin N_bin(end)];[N_Count(1) N_Count N_Count(end)]],3);  
  20. plot(values(1,:),values(2,:),'Color' , 'b' ,'LineWidth',2);  
  21. legend('\fontsize{14}\it  P-Labeled','\fontsize{14}\it  N-Labeled')  
  22. xlabel('\fontsize{14}\bfScore')  
  23. ylabel('\fontsize{14}\bffrequency')  
  24. 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来说,更接近于分类器的实际应用情况。



版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MATLAB模式识别实现指标分类评估预测如环境业绩等-Training_NPR.m 最近看到很多会员需要使用MATLAB神经网络做如下的事情: 1:MATLAB神经网络对水的质量的分类、评估、预测 (属于环境类分类、评估预测) 2:MATLAB神经网络对空气质量的分类、评估、预测 (属于环境类分类、评估预测) 2:MATLAB神经网络对土壤质量的分类、评估、预测 (属于环境类分类、评估预测) 3:MATLAB神经网络对学员的个人表现进行分类、评估、预测 (属于个人业绩鉴定) 4:MATLAB神经网络对医学、生物学上的细胞、疾病等分类、评估等(属于医学、生物学) 5:MATLAB神经网络对交通、物流等效率方面的分类、评估、预测等(属于交通、物流管理) 6:MATLAB神经网络用于故障诊断 7:概括来讲,就是使用神经网络对某些指标(如空气质量、水质量、个人业绩等)进行“有限”的分类、预测、评价等。 在这里,我特别强调“有限”两个字,因为这正是模式识别工具箱可以解决的问题。我看到很多会员使用不同的神经网络(如模糊识别,RBF, SVM等)。根据我多年的使用经验,其实基于多层BP网络的模式识别是最容易实现、效果非常满意、且结果非常具有说服力。很多会员没有掌握模式识别的精髓,或者网络训练好以后不知道如何评估、使用等。现在我用一个完整的例子来给大家展示一下它的优点。 不知道什么是模式识别,什么是BP网络的会员,请先看一下这个视频:MATLAB模式识别工具箱视频教学 用MATLAB模式识别工具箱(函数)来对某些指标(如空气质量、水质量、个人业绩等)进行分类、评估、预测,分为三步: 数据准备训练和评估预测 下面我来一步一步讲解,先谈数据的准备: 确保输入数据(包括训练以及将来要预测的数据)在比较接近的范围里(归一化是其中一种方式)。 这一个步骤不仅仅是在模式识别里,其实在任何一种网络里,这一步都是必须的。比如说你有400组数据,每组数据对应一个中国县城的空气质量。假设每组数据含有6个指标(称之为A,B,C,D,E,F,G), 如果数据A的范围是10^5-10^7, F的范围是0.1-0.5, 如果用这些数据来训练,很容易导致网络的权重也有同样的数量级的差别,结果是你的网络会非常的“敏感”(可以想象一下,如果F对应的权重是10^10,那么即使F稍微变化一下,都有可能导致网络的输出结果不同。而有时候这样的敏感度并不是你想要的,你可以对数据进行归一化处理,把数据都转换到0-1的区间内。 MATLAB模式识别工具箱可以自动对输入数据进行归一化处理,所以你只要明白这个过程,但是并不需要你额外写程序来处理这些数据。对输出数据进行二进制量化 通常情况下,用于测试的输入数据所对应的输出数据不是量化数据,比如说:优、良,或者是一级、二级等等。那么通常我们用二进制来表达,两位数字的二进制可以表示3类(01,10,11),三位数字的二进制可以表示7类(001,010,011,100,101,110,111,通常我们不使用000)。二进制的顺序不重要,比如说优可以对应001,也可以用010来表示。 经过简单处理,输入数据和新添加的二进制输入数据如下图所示: 神经网络——输入数据模式识别.png MATLAB模式识别实现指标分类、评估、预测 原始训练数据下载: training_data.xls MATLAB模式识别实现指标分类、评估、预测 把数据导入到MATLAB程序里close all clear all clc x=xlsread; y=xlsread; inputs = x'; targets = y';复制代码 我们再谈谈网络的训练和评估: 你可以使用MATLAB自带的模式识别工具箱界面来导入数据、调整参数等,然后得到结果。我通常第一次这样使用,得到一个基础架构以后,然后生成m代码,再在代码上修改。这里我演示给大家,如果通过程序来实现。下面是用来做模式识别的代码(工具箱产生的函数): % 创建一个模式识别网络(两层BP网络),同时给出中间层神经元的个数,这里使用20 hiddenLayerSize = 20; net = patternnet; % 对数据进行预处理,这里使用了归一化函数(一般不用修改) % For a list of all processing functions type: help nnprocess net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'}; net.outp
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值