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

相关文章

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数