转载自: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
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %function: ROC curve related
  3. %   date : 2013.07.01
  4. % author : Xin Yang, School of medicine, SZU
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. % 根据Label8score文件绘制 ROC、DET曲线
  7. % 获取数据文件路径
  8. [filename, pathname] = uigetfile( {'*.txt', 'Model Files (*.txt)'; ...
  9. '*.*', 'All Files (*.*)'}, '选择 ROC 数据源','F:\Result\FPPW\');
  10. if isequal(filename,0) || isequal(pathname,0)
  11. return;%如果点了“取消”
  12. else
  13. L8S_file = [pathname , filename];
  14. end
  15. dot_num = 50;
  16. YX_Roc(L8S_file , dot_num);
  17. % YX_DET_Curve(L8S_file , dot_num);

YX_Roc function:

[plain] view plaincopy
  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. Label = Mat_L8S(:,1);% 人工标记
  9. Score = Mat_L8S(:,2);% 算法评分
  10. % 分数上下限
  11. Upper = max(Score);
  12. Lower = min(Score);
  13. % 拓宽分数上下限,便于达到极限
  14. Upper = Upper + 0.1;
  15. Lower = Lower - 0.1;
  16. % 点数
  17. bins = dot_num;
  18. % 步进
  19. step = (Upper - Lower)/bins;
  20. % 阈值变化
  21. T = Lower:step:Upper;
  22. T_num = bins + 1;
  23. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  24. % 计算 TPR 、FPR
  25. TPR = zeros(T_num ,1);
  26. FPR = zeros(T_num ,1);
  27. % 遍历阈值
  28. for i = 1:T_num
  29. T_temp = T(i);
  30. TP = 0 ; FN = 0;% 清零
  31. FP = 0 ; TN = 0;
  32. % 遍历样本
  33. for j = 1:sample_num
  34. if (Label(j) == 1)
  35. if (Score(j) >= T_temp)
  36. TP = TP + 1;% 真阳
  37. else
  38. FN = FN + 1;% 假阴
  39. end
  40. elseif (Label(j) == 0)
  41. if (Score(j) >= T_temp)
  42. FP = FP + 1;% 假阳
  43. else
  44. TN = TN + 1;% 真阴
  45. end
  46. end
  47. end
  48. % *****
  49. TPR(i) = TP/(TP + FN);
  50. FPR(i) = FP/(FP + TN);
  51. end
  52. % ROC 曲线
  53. figure
  54. plot(FPR , TPR , 'c', 'LineWidth',2);
  55. axis([0 ,1 ,0 ,1]);
  56. xlabel('1-Specificity')
  57. ylabel('Sensitivity')
  58. title('ROC')
  59. grid on
  60. % Youden 指数
  61. figure
  62. X = TPR-FPR;
  63. plot(X ,'r','LineWidth',2);
  64. title('Youden 指数');
  65. % TPR、FPR 随阈值的变化,便于观察、确定阈值
  66. figure ,plot3(FPR , TPR , T ,'Color' , 'r' ,'LineWidth',2);
  67. xlabel('\fontsize{14}\bfX轴 -- FPR')
  68. ylabel('\fontsize{14}\bfY轴 -- TPR')
  69. zlabel('\fontsize{14}\bfZ轴 -- Threshold')
  70. title('\fontsize{14}\bf阈值选取')

Plot_PN_pdf function :

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

模式识别的评价方法:ROC曲线, DET曲线, FPPW, FPPI相关推荐

  1. det曲线_11565 P-R、ROC、DET 曲线及 AP、AUC 指标全解析(上)

    机器学习中,最「简单」的一种任务就是二分类任务了.比如,说话人验证(speaker verification)就是一个二分类任务:判断一句话是否是给定说话人说的.再比如,信息检索(informatio ...

  2. 模式识别分类器评价指标之DET曲线

    DET(Detection Error Tradeoff )曲线是对二元分类系统误码率的曲线图,绘制出错误拒绝率FRR(False Reject Rate)与错误接受率(False Accept Ra ...

  3. 机器学习之类别不平衡问题 (2) —— ROC和PR曲线

    机器学习之类别不平衡问题 (1) -- 各种评估指标 机器学习之类别不平衡问题 (2) -- ROC和PR曲线 完整代码 ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题 ...

  4. 评分卡:WOE、IV、PSI计算及ROC和KS曲线

    公式定义和原理解释见: 风控模型-WOE与IV指标的深入理解应用 - 知乎 风控模型-群体稳定性指标(PSI)深入理解应用 - 知乎 1.WOE和IV 延伸:分箱后求 WOE 和 IV 1. WOE ...

  5. det曲线_一文说透机器学习的主流评价指标

    人工智能或者机器学习的各种文章里面各种指标,还有中英文的,例如FPR.误检率,更有甚者,各种曲线,如ROC.DET等,眼花缭乱,它们之间到底是啥关系? 如果读了这篇文章,懂了这些指标的含义和它们间的关 ...

  6. 模型评价指标——混淆矩阵/ROC曲线/AUC曲线

    一.混淆矩阵 TP = True Postive真阳性:FP = False Positive假阳性 :FN = False Negative假阴性:TN = True Negative真阴性 ① 精 ...

  7. 【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)

    近期复习机器学习的一些基本知识,专门精读了一篇关于讲 ROC曲线的PR曲线关系的文章. 文章的title为<The relationship between Precision-Recall a ...

  8. 衡量风控模型优劣的曲线-PR曲线、ROC曲线、K-S曲线、Lift曲线

    ROC曲线,横轴是FPR.纵轴是TPR,变化值是阈值. K-S曲线,又称作洛伦兹曲线.横轴是阈值.纵轴是TPR.FPR. PR曲线,横轴是Recall,纵轴是Precision,变化值是阈值. Lif ...

  9. 【机器学习】scikitLearn分类任务以mnist为例,训练二分类器并衡量性能指标:ROC及PR曲线

    分类相关导航: [机器学习]分类任务以mnist为例,数据集准备及预处理 [机器学习]scikitLearn分类任务以mnist为例,训练二分类器并衡量性能指标:ROC及PR曲线 [机器学习]scik ...

最新文章

  1. Extjs--FormPanel(2)
  2. nginx配置动静分离简单配置示例
  3. Create 2021:李彦宏描绘未来交通图景 - 不限购、不限行、无拥堵
  4. 矩阵计算 pdf_线性代数II: 矩阵
  5. dij算法为什么不能处理负权,以及dij算法变种
  6. python之os模块的基本使用
  7. 带你学习javascript的函数进阶(二)
  8. 【Python3网络爬虫开发实战】1.2.3-ChromeDriver的安装
  9. Effective C# Item33:限制类型的可见性
  10. 减少 JavaScript 代码量的原生技术
  11. 【html】表格table与表单form
  12. Junos 操作系统
  13. windows配置指定网段流量走虚拟专用网络
  14. win7虚拟机_win10使用hyperV创建虚拟机
  15. uni.app H5(微信公众号定位) uni.getLocation
  16. 齐岳功能化玻片(载玻片和盖玻片)
  17. python版飞机大战及码源
  18. JavaScript放大镜插件magnifier实现图像放大效果
  19. jQuery----日期比较
  20. 动态化超详细完善的Excel动态导入Mysql,支持导入不同表,集成后只需配置就可以实现动态导入excel到数据库

热门文章

  1. 从flink-example分析flink组件(3)WordCount 流式实战及源码分析
  2. UNIX 网络协议的深度分析
  3. JAVA/PHP/C#版RSA验签--转
  4. BEA WebLogic平台下J2EE调优攻略--转载
  5. 区块链技术实现只需180行go代码!
  6. java swing 图片切换_使用Javaswing自定义图片作为按钮(原创)
  7. hadoop入门-在windows上编译x64位hadoop
  8. C++五子棋(三)——判断鼠标有效点击
  9. 天津春考计算机重点知识,天津春考第一学期期中试卷(计算机基础)
  10. 如何解决线程安全的问题