转自:

http://www.sjsjw.com/kf_other/article/67_8369_7749.asp

ROC曲线

对于0,1两类分类问题,一些分类器得到的结果往往不是0,1这样的标签,如神经网络,得到诸如0.5,0,8这样的分类结果。这时,我们人为取一个阈值,比如0.4,那么小于0.4的为0类,大于等于0.4的为1类,可以得到一个分类结果。同样,这个阈值我们可以取0.1,0.2等等。取不同的阈值,得到的最后的分类情况也就不同。 
如下面这幅图: 

蓝色表示原始为负类分类得到的统计图,红色为正类得到的统计图。那么我们取一条直线,直线左边分为负类,右边分为正,这条直线也就是我们所取的阈值。 
阈值不同,可以得到不同的结果,但是由分类器决定的统计图始终是不变的。这时候就需要一个独立于阈值,只与分类器有关的评价指标,来衡量特定分类器的好坏。 
还有在类不平衡的情况下,如正样本90个,负样本10个,直接把所有样本分类为正样本,得到识别率为90%。但这显然是没有意义的。 
如上就是ROC曲线的动机。 
  
关于两类分类问题,原始类为positive,negative,分类后的类别为p,n。排列组合后得到4种结果,如下: 

于是我们得到四个指标,分别为真阳,伪阳;伪阴,真阴。 
ROC空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。这两个值由上面四个值计算得到,公式如下: 
TPR:在所有实际为阳性的样本中,被正确地判断为阳性之比率。 
TPR=TP/(TP+FN) 
FPR:在所有实际为阴性的样本中,被错误地判断为阳性之比率。 
FPR=FP/(FP+TN) 
放在具体领域来理解上述两个指标。 
如在医学诊断中,判断有病的样本。 
那么尽量把有病的揪出来是主要任务,也就是第一个指标TPR,要越高越好。 
而把没病的样本误诊为有病的,也就是第二个指标FPR,要越低越好。 
  
不难发现,这两个指标之间是相互制约的。如果某个医生对于有病的症状比较敏感,稍微的小症状都判断为有病,那么他的第一个指标应该会很高,但是第二个指标也就相应地变高。最极端的情况下,他把所有的样本都看做有病,那么第一个指标达到1,第二个指标也为1。 
我们以FPR为横轴,TPR为纵轴,得到如下ROC空间。 

我们可以看出,左上角的点(TPR=1,FPR=0),为完美分类,也就是这个医生医术高明,诊断全对。 
点A(TPR>FPR),医生A的判断大体是正确的。中线上的点B(TPR=FPR),也就是医生B全都是蒙的,蒙对一半,蒙错一半;下半平面的点C(TPR<FPR),这个医生说你有病,那么你很可能没有病,医生C的话我们要反着听,为真庸医。 
  
上图中一个阈值,得到一个点。现在我们需要一个独立于阈值的评价指标来衡量这个医生的医术如何,也就是遍历所有的阈值,得到ROC曲线。 
还是一开始的那幅图,假设如下就是某个医生的诊断统计图,直线代表阈值。我们遍历所有的阈值,能够在ROC平面上得到如下的ROC曲线。 

曲线距离左上角越近,证明分类器效果越好。 
  

如上,是三条ROC曲线,在0.23处取一条直线。那么,在同样的低FPR=0.23的情况下,红色分类器得到更高的PTR。也就表明,ROC越往上,分类器效果越好。我们用一个标量值AUC来量化他。

AUC

AUC值为ROC曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好。 
  
AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。 
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。 
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。 
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

AUC的物理意义

假设分类器的输出是样本属于正类的socre(置信度),则AUC的物理意义为,任取一对(正、负)样本,正样本的score大于负样本的score的概率。

计算AUC:

第一种方法:AUC为ROC曲线下的面积,那我们直接计算面积可得。面积为一个个小的梯形面积之和。计算的精度与阈值的精度有关。 
第二种方法:根据AUC的物理意义,我们计算正样本score大于负样本的score的概率。取N*M(N为正样本数,M为负样本数)个二元组,比较score,最后得到AUC。时间复杂度为O(N*M)。 
第三种方法:与第二种方法相似,直接计算正样本score大于负样本的概率。我们首先把所有样本按照score排序,依次用rank表示他们,如最大score的样本,rank=n(n=N+M),其次为n-1。那么对于正样本中rank最大的样本,rank_max,有M-1个其他正样本比他score小,那么就有(rank_max-1)-(M-1)个负样本比他score小。其次为(rank_second-1)-(M-2)。最后我们得到正样本大于负样本的概率为 

时间复杂度为O(N+M)。

MATLAB实现

MATLAB自带plotroc()方法,绘制ROC曲线,参数如下: 
plotroc(targets,outputs); 
第一个参数为测试样本的原始标签,第二个参数为分类后得到的标签。 
两个为行或列向量,相同维数即可。 
AUC matlab代码:

[plain] view plain copy print?
  1. function [result]=AUC(test_targets,output)
  2. %计算AUC值,test_targets为原始样本标签,output为分类器得到的标签
  3. %均为行或列向量
  4. [A,I]=sort(output);
  5. M=0;N=0;
  6. for i=1:length(output)
  7. if(test_targets(i)==1)
  8. M=M+1;
  9. else
  10. N=N+1;
  11. end
  12. end
  13. sigma=0;
  14. for i=M+N:-1:1
  15. if(test_targets(I(i))==1)
  16. sigma=sigma+i;
  17. end
  18. end
  19. result=(sigma-(M+1)*M/2)/(M*N);
function [result]=AUC(test_targets,output)
%计算AUC值,test_targets为原始样本标签,output为分类器得到的标签
%均为行或列向量
[A,I]=sort(output);
M=0;N=0;
for i=1:length(output)if(test_targets(i)==1)M=M+1;elseN=N+1;end
end
sigma=0;
for i=M+N:-1:1if(test_targets(I(i))==1)sigma=sigma+i;end
end
result=(sigma-(M+1)*M/2)/(M*N);

matlab plotroc 画roc曲线相关推荐

  1. 高斯白噪声中CW,LFM脉冲检测,定量画ROC曲线

    高斯白噪声中CW脉冲检测,matlab定量画ROC曲线?LFM又如何 理论背景 高斯白噪声: 高斯白噪声,幅度分布服从高斯分布,功率谱密度服从均匀分布 白噪声在功率谱上(若以频率为横轴,信号幅度的平方 ...

  2. matlab roc曲线,MATLAB画ROC曲线,及计算AUC值

    标签: 根据决策值和真实标签画ROC曲线,同时计算AUC的值 function auc = roc_curve(deci,label_y) %%deci=wx+b, label_y, true lab ...

  3. matlab计算prc曲线auc面积,MATLAB画ROC曲线,及计算AUC值

    根据决策值和真实标签画ROC曲线,同时计算AUC的值 步骤: 根据决策值和真实标签画ROC曲线,同时计算AUC的值: 计算算法的决策函数值deci 根据决策函数值deci对真实标签y进行降序排序,得到 ...

  4. r roc函数_画ROC曲线的R包总结

    原标题:画ROC曲线的R包总结 作者: Joseph Rickert 原文链接: https://rviews.rstudio.com/2019/03/01/some-r-packages-for-r ...

  5. 数据挖掘 python roc曲线_利用scikitlearn画ROC曲线实例

    一个完整的数据挖掘模型,最后都要进行模型评估,对于二分类来说,AUC,ROC这两个指标用到最多,所以 利用sklearn里面相应的函数进行模块搭建. 具体实现的代码可以参照下面博友的代码,评估svm的 ...

  6. 用matlab绘制P三曲线,知道曲线方程 怎么用matlab绘制三维图 一定要给出程序 , matlab怎样画三维曲线...

    导航:网站首页 > 知道曲线方程 怎么用matlab绘制三维图 一定要给出程序 , matlab怎样画三维曲线 知道曲线方程 怎么用matlab绘制三维图 一定要给出程序 , matlab怎样画 ...

  7. 如何画ROC曲线和FROC曲线

    画ROC曲线代码 具体去看https://www.jianshu.com/p/5df19746daf9.,里面的代码讲的详细 例子 # coding=UTF-8 from sklearn import ...

  8. origin画ROC曲线

    ROC曲线的全称是受试者工作特征(Receiver Operating Characteristic)曲线,是非常重要和常见的统计分析方法. 如果已经计算好FPR和TPR,可以直接使用最简单的图绘制. ...

  9. python画roc曲线需要什么数据_python sklearn画ROC曲线

    preface:最近<生物信息学>多次谈到AUC,ROC这两个指标,正在做的project,要求画ROC曲线,sklearn里面有相应的函数,故学习学习. AUC: ROC: 具体使用参考 ...

最新文章

  1. Blender着色器纹理材质创作教程含源文件 Shader Forge
  2. 数据库基本----SQL语句大全
  3. TensorFlow数据统计
  4. 求求你!不要在网上乱拷贝代码了!一段网上找的代码突然炸了,项目出现大BUG...
  5. 实验7.2 二维数组 7-6 方阵循环右移
  6. CodeForces - 1300E Water Balance(贪心)
  7. 美国WH在明尼苏达州最大光伏阵列完工
  8. JavaScript学习总结(一)——JavaScript基础
  9. 不重复int数组里找不存在的值
  10. Django开发中问题和报错集合
  11. Java技术回顾之JNDI--JNDI API
  12. Java数据库篇9——备份与还原、忘记密码
  13. 【BZOJ】【1045/1465】【HAOI2008】糖果传递
  14. 第13天:页面布局实例-博雅主页
  15. GCN相关paper集合
  16. wordpress如何防止发布文章时候自动清除P、br换行标签
  17. 查询数据库授权以及授权到期的处理方法
  18. Altium design 的smart pdf 打印不出汉字来。
  19. 立创商城PCB库下载(SVN更新)
  20. mumu模拟器屏蔽root,mumu模拟器下载

热门文章

  1. 04.声明式服务调用:Spring Cloud Feign(Greenwich.SR2)
  2. 基于auto.js微信点赞
  3. ubuntu上python使用opencv调用usb摄像头无故掉线以后重连摄像头。
  4. 利用 π/4=1-1/3+1/5+…,编程计算π的近似值,直到最后一项的绝对值小于 10的负5次方为止,输出π的值并统计累加的项数。
  5. andriod——Fresco+Retrofit+GreenDao
  6. 十三、添加RD 会话主机角色
  7. http请求头中的host是什么意思
  8. php 微信开发回复消息
  9. 如何进行团队建设以保持团队稳定?
  10. 网课男生穿搭技巧尔雅答案 吴小吟