分类模型评估:混淆矩阵、准确率、召回率、ROC

news2024/12/23 8:20:14

1. 混淆矩阵

在二分类问题中,混淆矩阵被用来度量模型的准确率。因为在二分类问题中单一样本的预测结果只有Yes or No,即:真或者假两种结果,所以全体样本的经二分类模型处理后,处理结果不外乎四种情况,每种情况都有一个专门称谓,如果用一个2行2列表格描述,得到的就是“混淆矩阵”,以下是遵循sklearn规范的混淆矩阵布局(本文地址:https://laurence.blog.csdn.net/article/details/129006571,转载请注明出处!):

 预测为’假’预测为’真’
实际为’假’真阴性 / TN (True Negative)假阳性 / FP (False Positive)
实际为’真’假阴性 / FN (False Negative)真阳性 / TP (True Positive)

助记:

  • 行:实际值,第1行:假,第2行:真;
  • 列:预测值,第1列:假,第2列:真
  • 主对角线:真阴、真阳,均以T开头
  • 副对角线:假阳、假阴,均以F开头
名称缩写解释(1)解释(2)
真阴性TN预测为阴,实测也为阴预测为假,实测也为假
假阳性FP预测为阳,实测为阴(错报)预测为真,实测为假
假阴性FN预测为阴,实测为阳(漏报)预测为假,实测为真
真阳性TP预测为阳,实测也为阳预测为真,实测也为真

其中,假阳性(FP)又被称为“Type 1 Error”,就是“错报”,假阴性(FN)又被称为“Type 2 Error”,就是“漏报”。混淆矩阵的4个值定义清晰,没有任何歧义,容易让人搞混的是混淆矩阵的布局,因为业界没有统一规定过在混淆矩阵中实际值和预测值谁应该是行谁应该是列,也没规定真假值/正负值谁应是第一行谁应是第二行,所以在不同的资料和程序库中就会出现行列结构或顺序相反的情况,所以要特别留意一下混淆矩阵的布局。本文遵循的是sklearn中定义的混淆矩阵结构,使用公式描述就是:

C o n f u s i o n   M a t r i x = [ T N F P F N T P ] Confusion\ Matrix = \begin{bmatrix} {TN}&{FP}\\ {FN}&{TP}\\ \end{bmatrix} Confusion Matrix=[TNFNFPTP]

在《Hands-On ML》一书的第三章,就计算过针对图片(数字5)的二分类模型处理结果的混淆矩阵:

在这里插入图片描述

上述案例使用的是MNIST数据集,训练数据6万张图片(使用6万张图片训练,同时再使用它们进行评估),根据红框中的混淆矩阵可知:

  • 实际不是数字5,模型预测也不是数字5(预测正确)的图片有:53892张
  • 实际不是数字5,模型预测是数字5(预测错误)的图片有:687张
  • 实际是数字5,模型预测不是数字5(预测错误)的图片有:1891张
  • 实际是数字5,模型预测也是数字5(预测正确)的图片有:3530张

2. 准确率与召回率

在混淆矩阵的四个数据基础之上,人们还设计了两种常用的度量指标,分别是准确率和召回率:

  • 在所有“预测为真”(TP+FP)的样本中,有多少是“真得预测对了”(TP)的? 这个百分比叫“准确率”(Precision)
    P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP + FP} Precision=TP+FPTP
  • 在所有“实际为真”(TP + FN)的样本中,有多少是“真得预测对了”(TP)的? 这个百分比叫“召回率”(Recall)
    R e c a l l = T P T P + F N Recall=\frac{TP}{TP + FN} Recall=TP+FNTP

在《Hands-On ML》一书的第三章,给出了一张图,清晰明了地阐述了混淆矩阵、准确率、召回率三者之间的关系:

在这里插入图片描述

注意:该图4个象限的布局对应Sklearn中的混淆矩阵的布局。网上有的资料介绍混淆矩阵使用的4象限图表
未必与本图一致,它们对于行列是实际值还是预测值的定义可能是反的,对于真假值/正负值谁是第一行谁是二行的定义可能是反的,请一定注意区分!

3. 准确率与召回率之间的权衡

人们之所以会定义“准确率”和“召回率”这两个概念,是因为它们能从两个不同的维度(或者说角度)度量二分类模型的准确性,且在不同的场景里,人们对这两个指标的看重程度是不一样的。引用《Hands-On ML》一书给出的两个例子:

  • 案例一: 过滤少儿不宜的视频

    在这个场景中,模型的任务是:判定视频是否适合儿童观看,True表示健康视频,False表示少儿不宜。在该场景下模型应该追求的是:宁可将部分健康视频错误地认定为少儿不宜,也要最大限度地保证认定为健康的视频一定是健康的,这是典型的“优先保证高准确率,允许牺牲一定召回率”的场景。

  • 案例二:识别商超监控中的盗窃行为

    在这个场景中,模型的任务是:判定视频中的人是否有盗窃行为,True表示有,False表示无。在该场景下模型应该追求的是:宁可将部分正常行为的视频错误地认定为了盗窃,也要最大限度地保证所有盗窃行为都能被识别出来,这是典型的“优先保证高召回率,允许牺牲一定准确率”的场景。

很多时候,鱼和熊掌不可兼得,在模型调至最优状态时,依然要在“准确率”与“召回率”之间作出“权衡”,它们之间是“此消彼长”的博弈关系,通过调整阈值是可以调节两者的大小的。我们以《Hands-On ML》第三章“识别数字5”的图片二分类结果为例解释的“准确率”与“召回率”之间的“权衡”或者“博弈”关系:

在这里插入图片描述

首先,图中12张数字图片的排序不是随机的,而是根据模型给它们的“评分”按从小到大的顺序在Score数轴上依次排列的。这里是“准确率”与“召回率”之间可调的关键,因为虽然二分类模型给出的是一个Yes or No的二元结果,但在模型内部其实为维护的是一个“量值”,通过调节“阈值”的大小,可以决定最终输出的是Yes还是No,这会影响一个“不是很容易分辨的样本”最后被划定成FP还是FN(TP和TN的分值一般会很高或很低,受阈值调整的影响不大,这很容易理解)。以图示的情况为例:

  • 情形一:阈值设定在数轴左侧图片9和5的得分之间(暂不考虑具体数值),则右侧8张图片均会被判定为True,8张图片中实际有两个数字2和6被错误判定了,所以准确率=6/8=75%;同时,在总计6张的数字5图片中,该阈值设定下,全部6张数字5的图片都被判定为True,所以召回率=6/6=100%

  • 情形二:阈值设定在数轴中间两张图片5的得分之间(暂不考虑具体数值),则右侧5张图片均会被判定为True,5张图片中实际有1个数字6被错误判定了,所以准确率=4/5=80%;同时,在总计6张的数字5图片中,该阈值设定下,只有4张数字5的图片都被判定为True,所以召回率=4/6=67%

  • 情形三:阈值设定在在数轴右侧图片6和5的得分之间(暂不考虑具体数值),则右侧3张图片均会被判定为True,3张图片全部正确判定,所以准确率=3/3=100%;同时,在总计6张的数字5图片中,该阈值设定下,只有3张数字5的图片都被判定为True,所以召回率=3/6=50%

从上述三次阈值的调节中我们可以清晰观察到:“准确率”和“召回率”之间此消彼长的博弈关系。

关于上述解释中所说的“评分”,专业名称叫“Confidence Score”,分值越高表示结果为True的可能性越大。在Sklearn中使用SGDClassifier.decision_function(X)方法可以计算出给定样本的评分,下图是书中针对某一个数字5的图片计算score的示例代码:

在这里插入图片描述

4. 如何设定期望的准确率与召回率?

就像前面介绍的两个案例一样,不同的情形下,人们对于模型的准确率与召回率的期望是不同的,而通过设定Score的阈值,我们就可以调整模型预测的准确率和召回率。我们可以自行推导一下寻找期望的准确率和召回率组合的方法:

假设有1000个样本,首先,计算出所有样本的Confidence Score,按分值从小到大排好,以每一个score作为阈值,计算对应的准确率和召回率,这样就会得出准确率和召回率伴随阈值变化的曲线,可以想见:当阈值取最小的score时,全部样本都会被判定为True,所以召回率将是100%,而准确率会非常低,而当阈值取到最大的score时,全部样本都会被判定为False,此时召回率将降为0,准确率会趋向于无穷大。为此,Sklearn专门提供了一个函数sklearn.metrics.precision_recall_curve(官方文档)用于计算一组样本+对应成绩的准确率和召回率曲线,下图是《Hands-On ML》一书利用这个函数绘制的数字5的准确率和召回率变化曲线:

在这里插入图片描述

这张图已经把阈值变化对准确率和召回率的影响描述地非常清晰了,从这张图上也能清晰地看出准确率和召回率之间的“此消彼长”的博弈关系。此外,我们还可以只观察准确率和召回率之间的变化关系,辅助我们找出最佳组合,下图是《Hands-On ML》针对上述准确率和召回率数据绘制的两者变化关系,这张图提供了一些额外的“信息”,我们可以从中发现:一但准确率低于80%以后就会急剧下降,当然,这也意味着召回率是在急剧上升。

在这里插入图片描述

假设我们最终选择了:准确率90% + 召回率50% 的组合,接下来的工作就是找出它们所对应的阈值,然后将这个阈值设置给模型产出符合预期的预测结果。但是,这里有一个不问题,那就是:Sklearn其实并不提供修改其内部阈值的接口(不允许用户直接修改),怎么办呢?非常简单,我们只需要拿到score数组,然后和自己设定的threshold值进行矩阵逻辑计算,就可以轻松获得最终的判定结果:布尔数组,就是下面的做法:

在这里插入图片描述

5. ROC

ROC的全称是“受试者工作特征”(Receiver Operating Characteristic)曲线,也是评判分类模型结果好坏的一方法。

  • 假阳性率 ( False Positice Rate,FPR )

    在所有“实际为假”(FP+TN)的样本中,有多少是“预测错了”(FP)的? 这个百分比叫“假阳性率(FPR)”,计算公式:

F a l s e   P o s i t i v e   R a t e   ( F P R ) = F P F P + T N False\ Positive \ Rate\ (FPR)= \frac{FP}{FP+TN} False Positive Rate (FPR)=FP+TNFP

  • 真阳性率 ( True Positive Rate,TPR )

    在所有“实际为真”(TP + FN)的样本中,有多少是“真得预测对了”(TP)的? 这个百分比叫真阳性率(TPR),其实也就是“召回率”(Recall),计算公式:

T r u e   P o s i t i v e   R a t e   ( T P R ) = T P T P + F N True \ Positive \ Rate\ (TPR)= \frac{TP}{TP+FN} True Positive Rate (TPR)=TP+FNTP

而ROC曲线就是以假阳性率(FPR)为横坐标,真阳性率(TPR)为纵坐标绘制的曲线:
在这里插入图片描述

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

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

相关文章

反应-扩散方程(Reaction-diffusion system)

文章目录单组分反应-扩散方程双组分反应-扩散方程三组分和更多组分的反应-扩散方程Fishers equationKPP方程Belousov–Zhabotinsky reaction历史化学机理变体Noise-induced order数学背景Briggs–Rauscher reactionZFK equation行波解渐近解外部区域内部区域KPP-ZFK 转变Clavin…

13-PHP使用过的函数 121-130

121、bindColumn 将字段绑定到变量上 // while,foreach,list()进行结果数组的解构,解构到变量中; //!要在预处理对象上调用bindColumn函数 $stmt->bindColumn(id,$id); $stmt->bindColumn(name,$name); $stmt->bindColumn(sex,$sex); $stmt->bindColumn…

flink solt概念详解

ask是flink中的一个逻辑概念,一个任务由一个或者多个算子组合而成(多个算子构成一个任务是需要满足一定的条件才可以,有兴趣的老铁可以来了解一下 Operator Chain),为了提升任务执行的效率,可以对任务配置并行度,使任务在实际运行…

【服务器数据恢复】FreeNAS层UFS2文件系统数据恢复案例

服务器数据恢复环境: Dell存储服务器,采用esxi虚拟化系统,esxi虚拟化系统里有3台虚拟机;上层iSCSI使用FreeNAS构建,通过iSCSI方式实现FCSAN功能;FreeNAS层采用UFS2文件系统。 esxi虚拟化系统里有3台虚拟机中…

python中使用numpy包的向量矩阵相乘

一直对np的线性运算不太清晰,正好上课讲到了,做一个笔记整个理解一下 1.向量和矩阵 在numpy中,一重方括号表示的是向量vector,vector没有行列的概念。二重方括号表示矩阵matrix,有行列。 代码显示如下: …

VMware 复制已有的虚拟机并修改IP地址

第一步:关闭当前机器第二步:在VMware中右键要克隆的机器 选择管理-->克隆第三步:启动新克隆的虚拟机 修改主机名 如 hostname slave2第四步:修改克隆的虚拟机的ip地址和mac地址(注意:由于slave2是克隆出…

直流电机驱动模块开发,为电子设备提供动力之源

直流电机分为有刷直流电机和无刷直流电机两种,有刷直流电机连接上直流电就能转动,但是想要做到精准的转速和方向控制离不开电机驱动模块;无刷直流电机则必须要有驱动才能转动,直流电机驱动模块能够充分利用和有效发挥电源的能量功…

MQTT X 1.9.1 发布:资源消耗降低 80%,稳定性大幅提升

经过两个 Beta 版本迭代,近日,MQTT 5.0 客户端工具 MQTT X 正式发布了 1.9.1 稳定版本。 该版本通过大规模性能优化以及已知问题修复实现了稳定性的飞跃提升。特别是在性能方面,以接收大量消息场景为例,v1.9.1 相比于上一版本&am…

【数据结构与算法】单调队列 | 单调栈

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

【Python入门第七天】Python 数字

Python 数字 Python 中有三种数字类型: intfloatcomplex 为变量赋值时,将创建数值类型的变量: 实例 x 10 # int y 6.3 # float z 2j # complex如需验证 Python 中任何对象的类型,请使用 type() 函数: 实…

计算机图形学:中点Bresenham算法画椭圆

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、实现思路二、…

分布式-分布式事务和分布式锁

分布式事务有哪些解决方案 分布式事务 指事务的参与者、支持事务操作的服务器、存储等资源分别位于分布式系统的不同节点之上。 分布式事务就是一个业务操作,是由多个细分操作完成的,而这些细分操作又分布在不同的服务器上;事务&#xff0c…

数据库(第一天)

文档信息 文档类别正式文档文档编号数据库基础课 1.2-001版本1.2-001文档名称数据库基础课编写负责人/编写时间梁昭东/2023 年 1 月 30 日审核负责人/审核时间年 月 日批准人/批准时间年 月 日 变更记录 日期版本号变更内容修订者2023.01.30v1.2版根据实际情况增删了部分内容…

LINUX【线程概念】

线程线程概念线程的优点线程的缺点线程异常线程用途linux进程和线程线程控制pthread 库创建线程线程等待线程退出线程分离线程互斥线程互斥相关概念线程互斥互斥量互斥量接口初始化互斥量销毁互斥量互斥量的加锁和解锁互斥量实现原理线程概念 线程是进程中的一个执行流 一个进程…

ShonyDanza:如何利用Shodan实现自定义的安全研究与网络防护

关于ShonyDanza ShonyDanza是一款支持自定义且易于使用的安全工具,该工具基于Shodan实现其功能,并且可以利用Shodan的强大能力帮助研究人员实现安全研究、安全测试和安全防护等任务。 ShonyDanza的功能包括: 1、根据搜索条件获取IP 2、根据…

LabWindows CVI 2017开发笔记--串口调试软件实例

一、新建工程 打开LabWindows CVI软件,在桌面新建SerialDebug文件夹用来保存工程文件,在欢迎页点击New–>Project 或者在软件首页点击File–>New–>Project 将Project创建在新的Workspace中,设置完成后点击OK 新建一个用户GUI界…

内存溢出、内存泄露的概述及常见情形

内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,由于 GC&…

functional interface

更优雅 案例 要在TodoTaskRepository写find方法找到对应task列表,传入自定义的如何find 要传入两个参数,返回一个bool,在文档里找这样的functional interface java8官方文档-Package java.util.function BiPredicate是这样的 接口函数是t…

Numpy基础——人工智能基础

文章目录一、Numpy概述1.优势2.numpy历史3.Numpy的核心:多维数组4.numpy基础4.1 ndarray数组4.2 内存中的ndarray对象一、Numpy概述 1.优势 Numpy(Nummerical Python),补充了Python语言所欠缺的数值计算能力;Numpy是其它数据分析及机器学习库的底层库&…

GitLab CI/CD实现代码推送后自动maven打包发布

1、GitLab CI/CD介绍 CI(Continuous Intergration):即持续集成,将代码的合并、部署、自动化测试都在一起,不断地执行这个过程,并对结果反馈。 CD(Continuous Delivery):即持续交付,持续交付是一种软件工程方…