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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 该文介绍了二分类问题的评估指标,特别是AUC的概念和重要性。文章首先讲解了混淆矩阵,包括TP、FP、FN和TN的含义,然后讨论了准确率、精确率和召回率,并指出它们在处理不平衡数据集时的局限性。接着,作者解释了阈值对分类结果的影响以及如何通过调整阈值平衡精确率和召回率。最后,文章重点介绍了ROC曲线和AUC,说明AUC作为衡量模型性能的无参数指标,其值越接近1表示模型性能越好。AUC可以通过计算ROC曲线下的面积或比较样本对的预测得分来求得。

image.png
image.png

评价指标AUC原理及实践

一、二分类评估指标

1.1 混淆矩阵

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

image.png

上表即为混淆矩阵,其中,行表示预测的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
定义

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

公式

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

$Accuracy=\frac{TP+TN}{TP+FP+TN+FN}$

局限性

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

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

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

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

公式

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

$Precision=\frac{TP}{TP+FP}$

$Recall=\frac{TP}{TP+FN}$

1.4 阈值
定义

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

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

阈值的调整

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

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

1.5 ROC与AUC
引入

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

  • 设定阈值后再来计算精确率和召回率太麻烦了,阈值应该被设定为多少?有没有不用设定阈值就可以直接评价模型性能的方法呢?
  • 我们是根据概率值降序排序的结果来划分预测的正负例的,我们要怎样做才能让正例经过模型预测后的概率值都比负例高呢从而来提高模型的性能呢?

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

定义

ROC

  1. 首先,将模型对每个样本预测出来的属于正类的概率值进行降序排序,同时将概率值和标签组合成一个表格。
  2. 接着,从排序中最高的概率值开始,逐个将每个样本的概率值视作阈值。对于每个这样的阈值,计算出所有高于或等于此阈值的样本被视为正例,而低于此阈值的样本被视为负例。
  3. 对于每个阈值,都需要计算两个关键指标:TPR和FPR
  • $TPR=\frac{TP}{TP+FN}$ 作纵轴 横轴长度即为正样本数
  • $FPR=\frac{FP}{TN+FP}$​ 作横轴 纵轴长度即为负样本数

image.png

AUC

AUC即为ROC曲线下的面积。

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

公式理解

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

$TPR=\frac{TP}{TP+FN}$

$FPR=\frac{FP}{TN+FP}$

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

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

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 += 1

print("AUC =" , numerator/denominator)

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

from sklearn import metrics

fpr, 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曲线下的面积。

image.png

目录
相关文章
|
存储 算法 数据挖掘
带你读《Apache Doris 案例集》——06 Apache Doris 助力中国联通万亿日志数据分析提速10倍(2)
带你读《Apache Doris 案例集》——06 Apache Doris 助力中国联通万亿日志数据分析提速10倍(2)
440 1
|
机器学习/深度学习 人工智能 算法
算法金 | 一文彻底理解机器学习 ROC-AUC 指标
```markdown # ROC曲线与AUC详解:评估分类模型利器 本文深入浅出解释ROC曲线和AUC,通过实例和代码帮助理解其在模型评估中的重要性,旨在提升对分类模型性能的理解和应用。 ```
1247 13
算法金 | 一文彻底理解机器学习 ROC-AUC 指标
|
6月前
|
存储 SQL 运维
当「内容科技企业」遇上多模数据库:新榜采用Lindorm打造全域数据“超级底盘”
新榜业务以数据服务提升内容产业信息流通效率,其数据处理需求聚焦于跨平台实时数据融合处理、实时分析检索、批量更新效率三大维度。Lindorm通过多模超融合架构,提供检索分析一体化、多引擎数据共享,分布式弹性扩展等能力,成为支撑新榜内容服务的核心引擎,助力客户在内容生态竞争中持续领跑。
|
10月前
|
数据采集 前端开发 物联网
【项目实战】通过LLaMaFactory+Qwen2-VL-2B微调一个多模态医疗大模型
本文介绍了一个基于多模态大模型的医疗图像诊断项目。项目旨在通过训练一个医疗领域的多模态大模型,提高医生处理医学图像的效率,辅助诊断和治疗。作者以家中老人的脑部CT为例,展示了如何利用MedTrinity-25M数据集训练模型,经过数据准备、环境搭建、模型训练及微调、最终验证等步骤,成功使模型能够识别CT图像并给出具体的诊断意见,与专业医生的诊断结果高度吻合。
18746 7
【项目实战】通过LLaMaFactory+Qwen2-VL-2B微调一个多模态医疗大模型
|
11月前
|
机器学习/深度学习 数据采集 搜索推荐
使用Python实现智能食品推荐系统的深度学习模型
使用Python实现智能食品推荐系统的深度学习模型
525 2
|
Java Go
go如何读取yaml配置文件?
本文介绍了如何在Go项目中利用YAML文件进行配置管理,以简化变量更改及维护工作。首先,通过`go get gopkg.in/yaml.v3`命令安装YAML处理库。接着,展示了如何创建并解析YAML配置文件,包括定义结构体映射YAML字段、读取文件内容以及错误处理等步骤。此外,还提供了通过Go代码生成YAML文件的方法。使用`gopkg.in/yaml.v3`库能够有效提升项目的可维护性和开发效率。
899 1
go如何读取yaml配置文件?
|
API 数据库 开发者
Flask:Python的轻量级Web框架
Flask:Python的轻量级Web框架
312 2
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
1106 4
|
监控 测试技术 持续交付
Python 3.x与Python 2.x:不兼容性的深度解析
Python 3.x与Python 2.x之间的不兼容性是一个复杂而重要的问题。尽管迁移可能会带来一些挑战和困难,但考虑到Python 2.x已经停止支持以及Python 3.x带来的诸多改进和优势,迁移是不可避免的。通过了解变化、使用兼容工具、逐步迁移、利用社区资源、编写测试、保持更新、考虑使用Python 3.x的特定功能、重新评估第三方库和框架、备份和版本控制以及测试和部署等策略,你可以成功地将你的代码从Python 2.x迁移到Python 3.x,并享受Python 3.x带来的新功能和改进.
1457 5
|
存储 算法 安全
cryptography Python代码示例
cryptography Python代码示例