ROC曲线 和 AUC 直白详解

2023-11-07 03:40
文章标签 详解 曲线 roc auc 直白

本文主要是介绍ROC曲线 和 AUC 直白详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ROC曲线

  • 定义

在信号检测理论中,接收者操作特征曲线receiver operating characteristic curve,或者叫ROC曲线)是一种坐标图式的分析工具,用于
(1) 选择最佳的信号侦测模型、舍弃次佳的模型。
(2) 在同一模型中设定最佳阈值。

这里我们只要记得 ROC曲线 主要是用来确定一个模型的 阈值。

  • 理解
    既然我们想要直白来理解 ROC曲线,那么例子是肯定少不了的:
    假设1:感冒有三种特征,咳嗽,发烧,流鼻涕。
    假设2:如果想确定一个人是否得了感冒,可以根据三种特征来打分,每个特征可以打 0-1 分。打分越高,得感冒概率越高。
    假设3:现在你是一个医生,有100个病人来看病,你需要根据这些人的三个感冒特征给他们打分,得到如下一组数据 (编号,分数)

    (1,2) (2,2.4) (2,0.4)....(100,3)
    

    假设4:我是一个神医,能百分百确定别人是否得了感冒。然后我看了你的报告,并给每个数据都给了确定的答案,所以数据就变成了(编号,是否真感冒,分数)(其中感冒60人,正常40人)

    (1,0,2) (2,1,2.4) (2,0,0.4)....(100,1,3)
    

    好了,现在问题来了,你是给每个病人打分了,病人也知道分数越高得感冒得概率越高,但是,到底得没得感冒却没有一个标准,这个标准就是上面说的 阈值,所以接下来就是要想办法确定这个 阈值或者标准了,那么我们采用办法呢?对于这种 二分类 问题的阈值,就是我们 ROC 曲线大展身手的时候了。

  • ROC 曲线 和 阈值

    • 阈值比较小的时候:
      如果我们认为打 1 分以上的就是感冒患者,那么只要有一点症状就可以确诊为感冒了,这时候100个人,确诊感冒的可能有 80 人,但是实际呢?可能80个人中只有50个是真感冒的,。如下图
    阈值=1诊断感冒诊断正常合计
    真感冒501060
    真正常301040
    合计8020100
    • 阈值比较大的时候:
      如果我们认为打 2 分以上的才是感冒患者,这时候100个人,确诊感冒的可能有 20 人,但是实际呢?真正感冒的可是60人,你确诊20个,可能其中还有一个是误诊呢?如下图
    阈值=2诊断感冒诊断正常合计
    真感冒194160
    真正常13940
    合计2080100
    • 那么我们期望的是阈值不大不小,换句话理解就是,我们希望得到一个使得 诊断感冒/真感冒 趋于 1(如果你感冒了,我们尽量确诊),诊断感冒/真正常 趋于 0(如果你正常,尽量不误诊)的阈值。在 ROC曲线中我们叫做 真阳率 和 假阳率

    • 所以我们一点点改变阈值,就可以得到一组又一组的 真阳率 和 假阳率 ,将这一组组 真阳率 和 假阳率在坐标轴上表示出来,就是我们要的 ROC曲线,通过图形化,我们就可以很直观的取一个合适的阈值了。(这个图只是随便在网上找的,可不是这个列子的图噢,我们大概看下 ROC曲线的 样子就好了,哈哈)

      2595955-3ffc11055524eac8.png
      roc.png

好了,到这里我们大概就讲了下 ROC曲线 的由来:主要就是为了方便我们直观的求一个合适的 阈值罢了,并没有什么太高深的东西,值得一提的是,ROC 是从 预测为真的角度来看待问题的,所以我们只需要考虑 诊断感冒 这个方面来计算:诊断感冒正确的 / 真感冒诊断感冒错误的 / 真正常

AUC

  • 定义
    1. ROC曲线 与 横轴 围城的曲边形的面积
    2. 将所有样本根据算法模型预测的打分进行升序排列,随机挑选一正一负两个样本,负样本排在正样本前面的概率
      只是看文字好像不是很好理解,可以结合上面那个例子来看一看就好理解了,我们跟所有来看病的人都有打分,按照打分给他们排个序,然后随机挑选一个真得感冒 和 一个 真正常的人,看一下是不是真正常的人排在前面,如果是,那么计数为1,进行 N 次实验,所有计数的累计和 为 n,那么 n/N 就是AUC的值了,顺便提一下,最理想的情况就是 n = N了,也意味着我们的打分已经完美

定义有两种,但是他们应该如何进行理解互通呢?笔者目前也不是很清楚,尝试推理了下,也不是很明白,这里就不敢班门弄斧了,如果有大佬理解,请不吝赐教!!!非常感谢!!!这里如果有感谢兴趣的朋友,也可以查看下 这篇博客,应该是我找到的比较有深度的 auc 的计算了

  • 为什么需要 AUC
    前面我们说了 ROC曲线 可以用来给一个模型确定阈值,那么 AUC 则是来评判一个 二分类的 模型的优劣。
    如果 AUC = 1:完美预测,基本不会存在的情况。
    如果 0.5 < AUC < 1:除了完美预测,那就乘这个区间的最有价值了。
    如果 AUC = 0.5:因为是二分类,随机猜测也就是这个概率了,完全就没有价值
    如果 AUC < 0.5:比随机猜测的概率还低!!!但是反过来说,非黑即白,如果取个反呢?

总的来说,不考虑最后一种情况,AUC当然是越大 越好,如果是最后一致情况,那当然是越小越好,因为我一旦取反,那么就和第一种情况一样啦。

  • AUC 计算
    首先还是这篇博客。

    其次,我想说的是,写AUC的博客那么多,为什么没人将工作中的计算方法说上来呢?所以这里我就贴一个工作中计算方式:
    1.首先我们计算AUC肯定得有一份打完分了的数据,假设数据auc.text,内容如下:

    -1    0.12
    -1    0.13
    -1    0.16 
    1     0.2
    -1    0.21
    -1    0.23
    1     0.3
    -1    0.32
    -1    0.35
    1     0.4
    -1    0.42
    -1    0.46
    1     0.5
    -1    0.51
    -1    0.53
    1     0.7
    1     1.1
    1     1.2
    1     1.2
    
    1. 计算方法
      cat auc.text |sort -k2n|awk '($1==-1){++x;a+=y}($1==1){++y}END{print 1.0-a/(x*y)}'
      通过一个简单的 awk 就可以得出来了,至于这个公式得原理,也很简单,就是完全遵循我们定义中的第二种方式得来的,详细的过程我就不啰嗦了,如果有疑问,欢迎留言咨询

好了,本文到此就结束啦!谢谢你的阅读!!!

这篇关于ROC曲线 和 AUC 直白详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input