【科研入门】评价指标AUC原理及实践

在这里插入图片描述

在这里插入图片描述

评价指标AUC原理及实践

目录

    • 评价指标AUC原理及实践
      • 一、二分类评估指标
          • 1.1 混淆矩阵
          • 1.2 准确率 Accuracy
            • 定义
            • 公式
            • 局限性
          • 1.3 精确率 Precision 和 召回率 Recall
            • 定义
            • 公式
          • 1.4 阈值
            • 定义
            • 阈值的调整
          • 1.5 ROC与AUC
            • 引入
            • 定义
            • 公式理解
            • AUC算法

一、二分类评估指标

1.1 混淆矩阵

对于二分类问题,真实的样本标签有两类,我们学习器预测的类别有两类,根据二者的类别组合可以划分为四组,如下表所示:

在这里插入图片描述

上表即为混淆矩阵,其中,行表示预测的label值,列表示真实label值。TP,FP,FN,TN分别表示如下意思:

  • 真正类(True Positives, TP):这是模型正确预测为正类的样本数量。换句话说,这些样本在实际上也是正类,模型也预测为正类。
  • 假正类(False Positives, FP):这是模型错误地预测为正类的样本数量,而这些样本在实际上是负类。有时也称为“假警报”。
  • 假负类(False Negatives, FN):这是模型错误地预测为负类的样本数量,而这些样本在实际上是正类。有时也称为“漏报”。
  • 真负类(True Negatives, TN):这是模型正确预测为负类的样本数量。换句话说,这些样本在实际上也是负类,模型也预测为负类。

由此可得,TP和TN是我们预测准确的样本,而FP和FN是我们预测错误的样本。

1.2 准确率 Accuracy
定义

准确率表示的是预测正确的样本数占样本总数的比例。

公式

用混淆矩阵计算的话,准确率可以表示为:

A c c u r a c y = T P + T N T P + F P + T N + F N Accuracy=\frac{TP+TN}{TP+FP+TN+FN} Accuracy=TP+FP+TN+FNTP+TN

局限性

对于二分类问题,样本是极其不平衡的。对于大数据集来说,标签为1的正样本数据往往不足10%,那么如果分类器将所有样本判别为负样本,那么仍可以达到90%以上的分类准确率,但这个分类器的性能显然是非常差的。

1.3 精确率 Precision 和 召回率 Recall
定义

精确率表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率

召回率表示原始样本中,本就为正样本的样本中,正确预测为正样本的概率。

公式

二者用混淆矩阵表示如下:

P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP

1.4 阈值
定义

预测一个样本的正负是通过模型给出的概率值设定的阈值进行比较后得出的,如果模型给出的概率值大于阈值,该样本被预测为正例;如果小于阈值,则被额预测为负例

我们会将所有的结果按照概率值进行降序排序,这个阈值可以将排序结果截断为两部分。

阈值的调整

如果提高阈值,模型会变得很保守,即只有它非常确定一个样本是正例时才会预测为正例,这样能减少假正例(FP)的数量,从而提高精确率

如果降低阈值,模型更倾向于将样本预测为正例,这样就能减少漏检假负例(FN)的数量,从而提高召回率

1.5 ROC与AUC
引入

学习到这里,我们会抛出两个问题:

  • 设定阈值后再来计算精确率和召回率太麻烦了,阈值应该被设定为多少?有没有不用设定阈值就可以直接评价模型性能的方法呢?

  • 我们是根据概率值降序排序的结果来划分预测的正负例的,我们要怎样做才能让正例经过模型预测后的概率值都比负例高呢从而来提高模型的性能呢?

没错,ROC与AUC就可以解决以上的两个问题。

定义

ROC

  1. 首先,将模型对每个样本预测出来的属于正类的概率值进行降序排序,同时将概率值和标签组合成一个表格。

  2. 接着,从排序中最高的概率值开始,逐个将每个样本的概率值视作阈值。对于每个这样的阈值,计算出所有高于或等于此阈值的样本被视为正例,而低于此阈值的样本被视为负例。

  3. 对于每个阈值,都需要计算两个关键指标:TPR和FPR

  • T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP 作纵轴 横轴长度即为正样本数
  • F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP​ 作横轴 纵轴长度即为负样本数
    在这里插入图片描述

AUC

AUC即为ROC曲线下的面积。

AUC值越接近1,表明模型的性能越好;值越接近0.5(或更低),则表明模型的性能接近(或不如)随机猜测。

公式理解

为什么要选用这两个公式作为ROC曲线的横纵坐标?

T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP

F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP

TPR的分母TP+FN是全部的真实正例数,FPR的分母TN+FP是全部的真实负例数,分母并不会变化。

假设正例的总数为m,负例的总数是n,对按照概率值倒序排序的概率列从上到下设定阈值,每遇到一个真实正例,TPR就增加 1 m \frac{1}{m} m1,每遇到一个真实负例,那么FPR就增加 1 n \frac{1}{n} n1​。

AUC算法

AUC可以通过计算ROC积分来得到,但是积分过于麻烦。

因此,我们通过对所有可能的正负样本对,统计其中模型预测得分正确地将正样本得分高于负样本的比例

import numpy as np
from sklearn import metrics##给定的真实y 和 预测pred
y = np.array([1,0,0,0,1,0,1,0,0,1])
pred = np.array([0.9, 0.4, 0.3, 0.1, 0.35, 0.6, 0.65, 0.32, 0.8, 0.7])numerator = 0    #分子
denominator = 0  #分母for i in range(0, len(y)-1):for j in range(i, len(y)):if y[i] != y[j]:denominator += 1#统计所有正负样本对中,模型把相对位置排序正确的数量if(y[i]>y[j] and pred[i]>pred[j]) or (y[i]<y[j] and pred[i]<pred[j]):numerator += 1print("AUC =" , numerator/denominator)

或者可以用库中的sklearn.metrics.auc(fpr,tpr)方法

from sklearn import metricsfpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=1)# 真实的标签为y,模型对样本的预测概率为pred,正类的标签是1,fpr是假正率,tpr是真正率,thresholds是阈值
print(metrics.auc(fpr, tpr))# metrics.auc(fpr,tpr)通过对提供的 fpr 和 tpr 数据点进行数值积分(通常使用梯形法则),计算出ROC曲线下的面积。
实的标签为y,模型对样本的预测概率为pred,正类的标签是1,fpr是假正率,tpr是真正率,thresholds是阈值
print(metrics.auc(fpr, tpr))# metrics.auc(fpr,tpr)通过对提供的 fpr 和 tpr 数据点进行数值积分(通常使用梯形法则),计算出ROC曲线下的面积。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【muzzik 分享】关于 MKFramework 的设计想法

MKFramework是我个人维护持续了几年的项目&#xff08;虽然公开只有一年左右&#xff09;&#xff0c;最开始由于自己从事QP类游戏开发&#xff0c;我很喜欢MVVM&#xff0c;于是想把他做成 MVVM 框架&#xff0c;在论坛第一个 MVVM 框架出来的时候&#xff0c;我的框架已经快完…

函数调用栈中的栈帧形成了一个链式结构

下面是一个简单的 C 示例&#xff0c;演示了函数调用栈的概念&#xff1a; #include <iostream>// 递归函数&#xff0c;计算阶乘 int factorial(int n) {if (n 0 || n 1) {return 1;} else {return n * factorial(n - 1); // 递归调用} }int main() {int result fac…

电机控制专题(二)——Sensorless之扩展反电动势EEMF

文章目录 电机控制专题(二)——Sensorless之扩展反电动势EEMF前言理论推导仿真验证总结参考文献 电机控制专题(二)——Sensorless之扩展反电动势EEMF 前言 总结下电机控制中的扩展反电动势模型。 纯小白&#xff0c;如有不当&#xff0c;轻喷&#xff0c;还请指出。 在得出E…

代码随想录算法训练营Day17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和 | Python | 个人记录向

本文目录 110.平衡二叉树做题看文章 257. 二叉树的所有路径做题看文章 404.左叶子之和做题看文章 以往忽略的知识点小结个人体会 110.平衡二叉树 代码随想录&#xff1a;110.平衡二叉树 Leetcode&#xff1a;110.平衡二叉树 做题 今天算是第一次用递归做出来了&#xff0c;之…

《神经网络与深度学习:案例与实践》动手练习1.3

飞桨AI Studio星河社区-人工智能学习与实训社区 动手练习1.3 执行上述算子的反向过程&#xff0c;并验证梯度是否正确。 import mathclass Op(object):def __init__(self):passdef __call__(self, inputs):return self.forward(inputs)# 前向函数# 输入&#xff1a;张量inpu…

synchronized锁升级原理

锁升级过程 jdk1.6之后的优化 synchronized锁有四种状态&#xff0c;无锁&#xff0c;偏向锁&#xff0c;轻量级锁&#xff0c;重量级锁&#xff0c;这几个状态会随着竞争状态逐渐升级&#xff0c;锁可以升级但不能降级&#xff0c;但是偏向锁状态可以被重置为无锁状态。 1、偏…

深入挖掘C语言 ---- 文件操作

目录 1. 文件的打开和关闭1.1 流和标准流1.1.1流1.1.2标准流 1.2 文件指针1.3 文件的打开和关闭 2. 顺序读写3. 随机读写3.1 fseek3.2 ftell3.3 rewind 4. 读取结束判定 正文开始 1. 文件的打开和关闭 1.1 流和标准流 1.1.1流 我们程序的数据需要输出到各种外部设备, 也需要…

CentOS7升级openssl

文章目录 一 系统环境二 操作步骤三 版本检查 一 系统环境 公司服务器等保要求&#xff0c;修复openssl的高危漏洞。 本机使用centos7.9系统&#xff0c;openssl版本是1.0.2k&#xff0c;计划升级到1.1.1q 在执行下列操作前&#xff0c;务必要打快照做好备份&#xff0c;以防升…

docker 容器中安装cron,却无法启动定时任务

问题描述&#xff1a; 当我是在Dockerfile配置安装cron RUN apt-get update && apt-get install -y cron 或者进入容器中安装cron apt-get install -y cron 都会有个问题就是cron服务正常启动&#xff0c;但是加入到/etc/con.d下的任务&#xff0c;或者crontab -…

基于STM32单片机的智能家居环境监测与控制系统设计

基于STM32单片机的智能家居环境监测与控制系统设计 摘要&#xff1a;随着物联网技术的不断发展&#xff0c;智能家居环境监测与控制系统的应用越来越广泛。本文设计了一种基于STM32单片机的智能家居环境监测与控制系统&#xff0c;该系统能够实时监测环境中的温湿度和天然气浓…

浮点数随机生成器

浅做了一个数值模拟器&#xff0c;支持自定义多路数据模拟。数据源支持浮点型、整形等多种类型&#xff0c;通讯支持网口和串口&#xff0c;支持指定协议。简略效果大概如下&#xff0c;后续可能会考虑开源~ [code] 浮点数生成器 #include <iostream> #include <ra…

Spring的事务传播机制有哪些

Spring的事务传播机制有哪些&#xff1f; Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。 在复杂的业务场景中&#xff0c;多个事务方法之间的调用可能会导致事务的不一致&#xff0c;如出现数据丢失、重复提交等问题&#xff0c;使用事务传播机制可以避…

Scala 04 —— 函数式编程底层逻辑

函数式编程 底层逻辑 该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。 文章目录 函数式编程 底层逻辑函数式编程假如...副作用是必须的&#xff1f;函数的定义函数是数据的函数&#xff0c;不是数字的函数如何把业务逻辑做成纯函数式&#xff1f;函数式编程…

【python】直接在python3下安装 jupyter notebook,以及处理安装报错,启动不了问题

目录 问题&#xff1a; 1 先做准备&#xff0c;查看环境 1.1 先看python3 和pip &#xff0c;以及查看是否有 juypter 1.2 开始安装 1.3 安装完成后得到警告和报错 2 处理安装的报错问题 2.1 网上有说是因为 pip 自身需要更新&#xff0c;更新之 2.1.1 更新pip 2.1.…

从写博客到现在的感受

从写博客开始到现在我已经写了35篇博客了&#xff0c;慢慢的了解发现&#xff0c;越是深入了解代码&#xff0c;我就感觉到自己的渺小与不足&#xff0c;感觉要写的东西实在是太多了&#xff0c;我发现&#xff1a;以前我是个初学小白&#xff0c;现在依然是个初学小白&#xf…

c++复习笔记

前言 为什么写C复习笔记&#xff1f;脑子不好使&#xff0c;今天学明天忘。 为什么一堆代码&#xff1f;代码是敲出来的&#xff0c;不是看出来的。里面的代码都运行过&#xff0c;萌新跟着敲就完事了&#xff0c;也有注释辅助理解。至于有基础的&#xff0c;代码就这么点&am…

互联网十万个为什么之什么是产品经理?

什么是产品经理&#xff1f; 你知道每当你打开手机&#xff0c;点开一个应用程序&#xff0c;或者在网上购物时&#xff0c;那背后的幕后英雄是谁吗&#xff1f;这就是产品经理。他们是那些负责设计、开发和推广产品的人&#xff0c;他们的工作是确保你的体验顺畅而愉快。 产…

Redis搭建主从

Redis搭建主从: 1:拉取Redis镜像 docker pull redis2:创建主从对应的目录结构 3:对redis6379.log,redis6380.log,redis6381.log进行授权 chmod 777 redis6379.log chmod 777 redis6380.log chmod 777 redis6381.log4:修改主(master)的配置文件 5:创建主(master) redis_6379 …

Linux命令学习—Mail 服务器

1.1、Mail 服务器的组成 1、电子邮局 2、电子邮件发送和接收系统 3、MUA&#xff08;邮件用户代理&#xff09;和 MTA&#xff08;邮件传输代理&#xff09; 1.2、Mail 系统相关协议 1、SMTP 协议 简单邮件传输协议 SMTP 协议使用 25 端口&#xff1a; SMTP(Simple Mail T…

docker部署java项目,如何docker-compose内的jdk版本与本地版本保持一致

目录结构 /var └── data├── docker-compose.yml └── docker├── Dockerfile└── jdk-8u401-linux-x64.tar.gzdockerfile文件 FROM ubuntu:latest# 拷贝本地服务器上的 JDK 安装包到 Docker 镜像中 COPY jdk-8u401-linux-x64.tar.gz /jdk-8u401-linux-x64.tar.g…