真阳率(true positive rate)、假阳率(false positive rate),AUC,ROC

2024-06-16 13:38

本文主要是介绍真阳率(true positive rate)、假阳率(false positive rate),AUC,ROC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很早以前就知道这些概念了,不过由于跟自己的认知习惯不一样,所以碰到了还是经常会忘。于是索性把这些概念总结一下,以后再忘了也好找(其他的文章太啰嗦了,计算方法也写的不清不楚….) 
另外我也会陆续更新一些其他的机器学习相关概念和指标,即是方便自己,也方便他人吧。

注意:本文将混用正负样本和阳性(+)阴性(-)这两套说法

真阳率、假阳率

这些概念其实是从医学那边引入到机器学习里面的,所以其思维逻辑多多少少会跟做机器学习的有点出入。我们去看病,化验单或报告单会出现(+)跟(-),其分别表型阳性和阴性。比如你去检查是不是得了某种病,阳性(+)就说明得了,阴性(-)就说明没事。 
那么,这种检验到底靠不靠谱呢?科研人员在设计这种检验方法的时候希望知道,如果这个人确实得了病,那么这个方法能检查出来的概率是多少呢(真阳率)?如果这个人没有得病,那么这个方法误诊其有病的概率是多少呢(假阳率)? 
具体来说,看下面这张表(摘自百度百科): 
真阳率、假阳率示意图

真阳率(True Positive Rate, TPR)就是: 

=aa+c真阳率=aa+c

含义是检测出来的真阳性样本数除以所有真实阳性样本数。

假阳率(False Positive Rate, FPR)就是: 

=bb+d假阳率=bb+d

含义是检测出来的假阳性样本数除以所有真实阴性样本数。

ROC(Receiver Operating Characteristic)

很简单,就是把假阳率当x轴,真阳率当y轴画一个二维平面直角坐标系。然后不断调整检测方法(或机器学习中的分类器)的阈值,即最终得分高于某个值就是阳性,反之就是阴性,得到不同的真阳率和假阳率数值,然后描点。就可以得到一条ROC曲线。 
需要注意的是,ROC曲线必定起于(0,0),止于(1,1)。因为,当全都判断为阴性(-)时,就是(0,0);全部判断为阳性(+)时就是(1,1)。这两点间斜率为1的线段表示随机分类器(对真实的正负样本没有区分能力)。所以一般分类器需要在这条线上方。

画出来大概是长下面这样(转自这里): 
ROC

AUC(Area Under Curve)

顾名思义,就是这条ROC曲线下方的面积了。越接近1表示分类器越好。 
但是,直接计算AUC很麻烦,但由于其跟Wilcoxon-Mann-Witney Test等价,所以可以用这个测试的方法来计算AUC。Wilcoxon-Mann-Witney Test指的是,任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score(score指分类器的打分)。

方案一: 
我们可以对于总样本中的M个正样本和N个负样本,组成M×NM×N个pair,如果某个pair正样本score大于负样本,则记1分,反之记0分,相等记0.5分。然后总分除以M×NM×N就是AUC的值了。复杂度O(M×N)O(M×N)

方案二: 
基本思想一样,不过复杂度可以缩减到O((M+N)log(M+N))O((M+N)log(M+N))。 
首先,我们将所有样本得分从大到小排序,则排名最高的样本rank为M+N,第二的为M+N-1,以此类推。然后我们将所有正样本的rank加和,其思想为:排名k的正样本至多比k-1个负样本的score要大。当我们将正样本的rank加和后,再减去(1+M)M/2(1+M)M/2,即正样本的个数,就是正样本score比负样本score大的pair个数。再除以O(M×N)O(M×N)就是AUC的值了,公式如下: 

AUC=ipositiveranki(1+M)M2M×NAUC=∑i∈positiveranki−(1+M)M2M×N

注意:对score相等的样本,需要赋予相同的rank(无论这个相等的score是出现在同类样本还是不同类的样本之间,都需要这样处理)。具体操作就是把所有这些score相等的样本的rank取平均。然后再使用上述公式。比如score为0.8的有两个样本,rank为7和8,则其最终代入公式的rank为7.5

这篇关于真阳率(true positive rate)、假阳率(false positive rate),AUC,ROC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066603

相关文章

在JavaScript当中,为什么NaN===NaN和NaN==NaN返回false?

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:vscode chrome 今天这个话题的缘由是早上和一位同专业的学长聊天,他在公司完成了一个项目,项目当中有一个40个字段的返回值,于是牵扯到了某道他遇到的面试题,其中是需要用js找到某个数组当中null的索引,然后他问了我这样一个问题:你觉得NaN===NaN吗?当时我回答了不等于,然后他又追问为什么,

linux 环境下使用PHP OpenSSL扩展函数openssl_pkey_new(),返回false的原因

<?php$config = array('private_key_bits' => 2048,);$res = openssl_pkey_new($config); $res返回false的时候,检查发现,是linux系统缺少了openssl的配置,解决方法如下: 直接将php -m 中 Openssl 中的xx.conf 配置移动到对应的目录,然后重启php-fpm 完美解决

mysql中,字段类型为tinyint(1),在查询时为啥不显示正常的数字而是true或false?

背景 在查询数据的时候发现gender字段应该显示1,2,3,4等这样的数字,但是查出来却是true或false这样的boolean类型 分析 不免产生疑问,为何education字段也是存的数字,就能正确显示出数字,而gender不行,我又查看字段,发现这两个字段的类型不一样 gender字段的类型是tinyint()类型,那在不想改变字段类型的情况下,该如何能查出正确的数据呢?

ScrollView的android:fillViewport=true

http://stackoverflow.com/questions/2599837/linearlayout-not-expanding-inside-a-scrollview http://blog.csdn.net/linqingf/article/details/6573602 当fillViewport="true" 设置为 true里 , scrollV

MySQL - 关于 False、True、0、1、tinyint(1) 的说明

MySQL 保存 Boolean 值时,用 1 代表 TRUE,0 代表 FALSE;类似一个 bit 位,默认没有数据,即为 0,也即 Faslse     MySQL 存储 Boolean 值的类型为 tinyint(1) 类型;MySQL 中有 true、false、TRUE、FALSE 四个常量,代表1、0、1、0 mysql> select true,false,TRUE,F

解决树莓派IOError: [Errno Invalid sample rate] -9997 采样率16K错误

树莓派在基于pyaudio录音的时候会提示如上错误,这主要是使用的树莓派声卡不支持当前的采用率,没关系,其实在alsa架构下我们可以通过声卡的插件实现转换。在树莓派下家目录创建一个声卡隐藏配置文件 .asoundrc。特别说明,不要在你的pyaudio里面设置打开声卡的编号因为下面的配置已经配置了。 1.安装 sudo apt-get install pulseaudio 2.在家目录创

LeetCode - 41. First Missing Positive

41. First Missing Positive  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一组整数,找出第一个空缺的正整数. 要求:时间O(n),空间O(n). analyse: 这题时间O(n)想了

在Yolov8中model.export后self.export=false问题(记录)

遇到一个问题是自己创建了新的Detect检测头,但是在导出模型时,想要修改输出格式,在yolo中可以通过if self.export:来修改网络的返回值格式 当使用model.export()导出时,理论上会自动将export设置为True 但是在实际中发现export=false,于是通过调试发现在ultralytics/engine/exporter.py中 for m in model

推荐系统-排序算法:常用评价指标:NDCG、MAP、MRR、HR、ILS、ROC、AUC、F1等

参考资料: 推荐算法常用评价指标:NDCG、MAP、MRR、HR、ILS、ROC、AUC、F1等 搜索评价指标——NDCG