【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率

article/2025/9/11 1:37:37

你这蠢货,是不是又把酸葡萄和葡萄酸弄“混淆”啦!!!这里的混淆,我们细品,帮助我们理解名词“混淆矩阵”

上面日常情况中的混淆就是:是否把某两件东西或者多件东西给弄混了,迷糊了。把“酸葡萄”误认为了“葡萄酸”,或者是把“葡萄酸”误认为了“酸葡萄”,此时就会可能出现2种大可能,和4种小可能。分别是:

  1. 分类正确了
    • “酸葡萄”正确认为是“酸葡萄”
    • “葡萄酸”正确认为是“葡萄酸”
  2. 分类错误了
    • 把“酸葡萄”误认为了“葡萄酸”
    • 把“葡萄酸”误认为了“酸葡萄”

对于任何一个分类任务,都可能会存在上述4种情况。那在机器学习中,该如何描述他们呢?那就用混淆矩阵。

一、混淆矩阵

混淆矩阵是一个误差矩阵, 常用来可视化地评估监督学习算法的性能。混淆矩阵大小为 (n_classes, n_classes) 的方阵, 其中 n_classes 表示类的数量。

其中:

  • 这个矩阵的一行表示预测类中的实例(可以理解为模型预测输出,predict, PD),
  • 另一列表示对该预测结果对应的标签(Ground Truth, GT)。
  • 于是综合PD和GT进行判定模型的预测结果是否与标注结果一致,正确为True,错误为False

此时,就引入混淆矩阵的四个元素:TP、FP、TN、FN。根据混淆矩阵,进一步计算:精确率(Precision),召回率(Recall),准确率(Accuracy)等等评价指标,我们在后面分别详述。

以猫、非猫二分类为例(不是猫,就是其他,没有更多的可能了),假定:

  • cat为正例-Positive,那么not cat为负例-Negative;
  • 预测正确为-True,反之,预测错误为-False。

我们针对cat或not cat,就可以得到下面这样一个表示TP、FP、TN、FN的表:

1
在计算混淆矩阵的时候,我们可以使用 scikit-learn 科学计算包,计算混淆矩阵函数 sklearn.metrics.confusion_matrix API 接口,可以快速帮助我们绘制混淆矩阵。接口定义如下:

skearn.metrics.confusion_matrix(y_true,   # array, Gound true (correct) target valuesy_pred,  # array, Estimated targets as returned by a classifierlabels=None,  # array, List of labels to index the matrix.sample_weight=None  # array-like of shape = [n_samples], Optional sample weights
)

完整示例代码如下:

import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as pltsns.set()f, (ax1, ax2) = plt.subplots(figsize=(10, 8), nrows=2)
y_pred = ["cat", "cat", "not cat", "cat", "cat", "cat", "cat"]
y_true = ["not cat", "not cat", "not cat", "cat", "cat", "cat", "cat"]
C2 = confusion_matrix(y_true, y_pred, labels=["not cat", "cat"])
print(C2)
print(C2.ravel())
sns.heatmap(C2, annot=True)ax2.set_title('sns_heatmap_confusion_matrix')
ax2.set_xlabel('pd')
ax2.set_ylabel('gt')
f.savefig('sns_heatmap_confusion_matrix.jpg', bbox_inches='tight')

保存的图像如下所示:

1这个时候我们还是不知道skearn.metrics.confusion_matrix做了些什么,这个时候print(C2),打印看下C2究竟里面包含着什么。最终的打印结果如下所示:

                   pd"not cat" "cat"
gt  "not cat"  1        2"cat"      0        4

解释下上面这几个数字的意思:

C2 = confusion_matrix(y_true, y_pred, labels=["not cat", "cat"])中的labels的顺序就分布是01,negative和positive注:labels=[]可加可不加,不加情况下会自动识别,自己定义

在计算cat的混淆矩阵的时候,cat就是阳性,not cat就是阴性,如下面这样:

  • cat为1-positive,其中真实值中cat有4个,4个被预测为cat,预测正确T,0个被预测为not cat,预测错误F;
  • not cat为0-negative,其中真实值中dog有3个,1个被预测为not cat,预测正确T,2个被预测为cat,预测错误F。

定义:

  • TP:正确的预测为正例,也就是预测为正例,预测对了
  • TN:正确的预测为反例,也就是预测为反例,预测对了
  • FP:错误的预测为正例,也就是预测为正例,预测错了
  • FN:预测的预测为反例,也就是预测为反例,预测错了

所以:在分别以not cat和猫cat为正例,预测错位为反例中,会分别得到如下两个混淆矩阵:

dog-1,其他为0:
y_true = ["1", "1", "1", "0", "0", "0", "0"]
y_pred = ["0", "0", "1", "0", "0", "0", "0"]TP:1
TN:4
FP:0
FN:2cat-1,其他为0:
y_true = ["0", "0", "0", "1", "1", "1", "1"]
y_pred = ["1", "1", "0", "1", "1", "1", "1"]TP:4
TN:1
FP:2
FN:0

注意:混淆矩阵是评价某一模型预测结果好坏的方法,预测对与错的参照标准是标注结果。其中,需要对预测置信度进行阈值分割。

  • 大于该阈值的,为预测阳性
  • 小于该阈值的,为预测阴性

所以,确定该类的阈值是多少,很重要,直接决定了混淆矩阵的数值分布。其中,该阈值可根据ROC曲线进行确定,这块下文会详述,继续往后看。

从这里就可以看出,混淆矩阵的衡量是很片面的,依据混淆矩阵计算的精确率、召回率、准确率等等评价方法,也是很片面的。这就是他们的缺点,需要一个更加全面的评价指标的出现。

二、引申:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1score

2.1、准确率(Accuracy)

这三个指标里最直观的就是准确率: 模型判断正确的数据(TP+TN)占总数据的比例

"Accuracy: "+str(round((tp+tn)/(tp+fp+fn+tn), 3))

2.2、召回率(Recall)

​​
针对数据集中的所有正例label(TP+FN)而言,模型正确判断出的正例(TP)占数据集中所有正例的比例;FN表示被模型误认为是负例但实际是正例的数据;

召回率也叫查全率,以物体检测为例,我们往往把图片中的物体作为正例,此时召回率高代表着模型可以找出图片中更多的物体!

"Recall: "+str(round((tp)/(tp+fn), 3))

2.3、精确率(Precision)

针对模型判断出的所有正例(TP+FP)而言,其中真正例(TP)占的比例。精确率也叫查准率,还是以物体检测为例,精确率高表示模型检测出的物体中大部分确实是物体,只有少量不是物体的对象被当成物体。

"Precision: "+str(round((tp)/(tp+fp), 3))

2.4、敏感度、特异度、假阳性率、阳性预测值、阴性预测值

还有,敏感度Sensitivity、特异度Specificity、假阳性率False positive rate,FPR、阳性预测值Positive predictive value,PPV、阴性预测值Negative predictive value,NPV,分别的计算方法如下所示:

敏感度(recall):("Sensitivity: "+str(round(tp/(tp+fn+0.01), 3)))
特异度:("Specificity: "+str(round(1-(fp/(fp+tn+0.01)), 3)))
假阳性率:("False positive rate: "+str(round(fp/(fp+tn+0.01), 3)))
阳性预测值:("Positive predictive value: "+str(round(tp/(tp+fp+0.01), 3)))
阴性预测值:("Negative predictive value: "+str(round(tn/(fn+tn+0.01), 3)))

其中:

  • 敏感度=召回率,都是看label标记是阳性中,预测pd有多少真是阳性 ;
  • 特异度是看label标记是阴性中,预测pd有多少是真的阴性,这里的阴性可以是一大类。假设需要评估的类是马路上的人,那除人之外,其他类别均可以作为人相对应的阴性;
  • 在医学领域,敏感度更关注漏诊率(有病之人不能漏),特异度更关注误诊率(无病之人不能误)
  • 假阳性率 = 1 - 特异度,假阳性越多,误诊越多
  • 阳性预测值 = 精确率,是看预测为阳性中,有多少是真阳性
  • 阴性预测值是看预测为阴性中,有多少是真阴性

2.5、F1score

要计算F1score,需要先计算精确率和召回率。其中:

Precision = tp/tp+fpRecall = tp/tp+fn进而计算得到:F1score = 2 * Precision * Recall /(Precision + Recall)

那么,你有没有想过,F1score中,recall和Precision对其的影响是怎么样的。我们用如下代码,绘制出来看看。

import numpy as np
import matplotlib.pyplot as pltfig = plt.figure()  #定义新的三维坐标轴
ax3 = plt.axes(projection='3d')#定义三维数据
precision = np.arange(0.01, 1, 0.1)
recall = np.arange(0.01, 1, 0.1)
X, Y = np.meshgrid(precision, recall)   # 用两个坐标轴上的点在平面上画网格
Z = 2*X*Y/(X+Y)# 作图
ax3.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap='rainbow')
plt.xlabel('precision')
plt.ylabel('recall')
plt.title('F1 score')
plt.show()

数据分布图如下:
1
可以看出,精准度和recall,无论任何一个低,F1score都不会高,只有两个都高的时候,分数才会高,这也能够说明,为啥很多评价都是采用F1 score

三、总结

混淆矩阵和以此计算的敏感度、特异度、精确度等等指标,都是统计学中最基本的,相信这篇文章描述的很详细了,你应该是懂了。有几个注意的点,需要强调下:

  1. 敏感度、特异度、精确度等等指标的计算,前提是要得到混淆矩阵;
  2. 计算混淆矩阵,首先需要知道分类中的阈值,0-1中,是0.5,还是0.3,直接关系到最后的混淆矩阵
  3. 那究竟是选0.5,还是0.3作为计算混淆矩阵的截断阈值呢?那就有很多的方法,其中最常用的,就是ROC曲线

ROC曲线后续就讲到,敬请期待吧。

插播一个小故事:

我们早期在做一个多任务的模型评估时候,一直评估的结果不太好,最后换了个评估指标,一下子就清楚了很多,也能知道最终的结果,相比于之前是好是坏了。主要的改动两处:

  1. 一是通过ROC选择阈值
  2. 二是由准确率,改为使用敏感度和特异度分开评估,尤其是对于测试数据中正负样本极度不均衡的情况,分开评价会一目了然
  3. 所以说,分析任务类型,选择合适的模型评价指标,至关重要

http://chatgpt.dhexx.cn/article/FiB9rbki.shtml

相关文章

ROC曲线的绘制过程/AUC/TPR、FPR、敏感度和特异度

在选择诊断试验时,一些研究学者会在灵敏度和特异度的取舍之间徘徊。那么,是否可以综合灵敏度和特异度之间的特点,选择一个指标来评价诊断实验之间的准确性呢?Lusted在1971年提出了受试者工作特征曲线(receiver operati…

ROC/AUC 简易试验 最佳截断点 混淆矩阵 敏感度 特异度 约登指数 各个指标置信区间

ROC/AUC 简易试验 最佳截断点 敏感度 特异度 约登 召回率 混淆矩阵 学习链接, 鼠标放这里 常规学习下面这个矩阵 金标准-模型True Positives(TP)False Positives(FP)-False Negatives(FN)True Negatives(TN)PN 正确率 Accuracy (TPTN)/(PN) 错误率 Error Rate 1 – Accu…

分类性能度量指标 : ROC曲线、AUC值、正确率、召回率、敏感度、特异度

转自 : https://blog.csdn.net/tanzuozhev/article/details/79109311 https://zhuanlan.zhihu.com/p/66885681 正确率(Precision):真阳性率(True Positive Rate,TPR),灵敏度(Sensitivity),召回率(Recall):…

深度学习之卷积神经网络中常用模型评估指标(混淆矩阵,精确率,召回率,特异度计算方法)——python代码

深度学习之卷积神经网络中常用模型评估指标(混淆矩阵,精确率,召回率,特异度计算方法): 混淆矩阵,精确率,召回率,特异度作为卷积神经网络的模型性能评价指标,它们的计算和绘制具有非常重要的意义,特别是在写论文的时候,我们往往需要这些指标来证明我们模型的优异性,…

深度学习中评估指标:准确率Accuracy、召回率Recall、精确率Precision、特异度(真阴性率)和误报率、灵敏度(真阳性率)和漏报率、F1、PR、ROC、AUC、Dice系数、IOU

目录 准确率(Accuracy) 精确率(Precision,查准率) 召回率(RecallTPR) Precision-Recall曲线 F值(F-Measure,综合评价指标) 特异度TNR(真阴性…

灵敏度和特异度的置信区间怎么算?

很多医学生及医生经常会对诊断实验进行评价,评价诊断试验的常用指标及计算方法都比较容易掌握,但是少有人知道其相应的95%的置信区间的计算方法。我们简单的回顾一下,诊断试验评价的基本方法是用所谓的“金标准”,确诊区分患者和非…

JavaScript基础之缓存机制:HTTP缓存机制

说到前端的缓存机制,无非就是俩中,一种是浏览器缓存机制,一种就是我们今天要说的HTTP缓存机制。那么接下来就说说这HTTP缓存机制。 什么是HTTP缓存? HTTP缓存指的是,当客户端向服务器请求资源时,会先抵达…

面试:HTTP缓存机制

深入理解 HTTP 缓存机制 - 刘星的个人网站 深入理解HTTP缓存机制及原理 - 掘金 面试题 “ 能不能说下 304 的过程,以及影响缓存的头部属性有哪些?” 304 状态码是表示缓存 301 表示被请求 url 永久转移到新的 url;302 表示被请求 url 临时…

HTTP缓存机制--客户端缓存

HTTP缓存机制分为两种,客户端缓存和服务端缓存,本文主要对客户端缓存进行简单的分析。 服务端缓存 服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理、Squid等),其…

【浏览器】HTTP 缓存机制

HTTP 缓存机制 HTTP 缓存存储与请求关联的响应,并将存储的响应复用于后续请求。 分类 私有缓存 & 公有缓存 HTTP Caching 标准中,有两种不同类型的缓存:私有缓存和共享缓存。 私有缓存是绑定至特定客户端的缓存——通常是浏览器缓存&…

http协议+缓存机制

http协议缓存机制 文章目录 http协议缓存机制前言一、http1.http1.0/1.12.http2.03.一个TCP连接可以发送多少个HTTP请求4.浏览器最多可以向同一个host建立几个TCP连接5.其他关于http 二、缓存1.强缓存2.协商缓存3.etag解决了last-modified不能解决的问题4.Nginx如何配置缓存 前…

彻底弄懂HTTP缓存机制及原理

前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能。 但是对于很多前端同学来说,仅仅只是知道浏览器会对…

【网络】http缓存机制

HTTP缓存有多种规则,根据是否需要重新向服务器发起请求来分类,我们将其分为两大类 强制缓存对比缓存 流程 强制缓存流程如下 对比缓存流程如下 强制缓存 我们知道,强制缓存在数据为失效的情况下,可以直接使用缓存数据 在没…

彻底理解浏览器的Http缓存机制

概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种:HTTP请求(Request)报文,报文格式为:请求行 – HTTP头(通用信息头,请求头,实体头) – 请…

彻底理解浏览器的缓存机制(http缓存机制)

一、概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步sau交流学习社区(首发):https://www.mwcxs.top/page/565.html。 1、HTTP请求…

HTTP缓存机制与原理详解

1.1 - 缓存 缓存可以重用已获取的资源能够有效的提升网站与应用的性能。Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间。借助 HTTP 缓存,Web 站点变得更具有响应性。缓存分为两点:强制缓存和协商缓存 1.2 - 强制缓存 概念…

浏览器缓存机制(HTTP缓存机制)

不废话,直接上干货,配图解说 首先浏览器首次请求一个网站,网站除了会返回我们需要资源,同时也会返回一些标识信息,这些标识信息约定了客户端和服务端的一些操作,这里列举重要的: 1.cache-contr…

HTTP的缓存机制

前面的话 缓存机制可以有很多种:比如客户端缓存、服务端缓存、代理服务器缓存等。 而本文主角HTTP的缓存是浏览器缓存。为什么这么说,下面来详细介绍一下。 HTTP缓存分类 HTTP缓存可以分为强缓存 与协商缓存。 强制缓存 当缓存数据库中已经有所请求…

HTTP 缓存机制详解

文章目录 HTTP Cache什么是 HTTP Cache关键字简单流程图代码准备不设置明确禁止缓存private与public缓存过期策略1、三种方式设置服务器告知浏览器缓存过期时间2、两种方式校验资源过期 强制校验缓存性能优化期中总结:HTTP 缓存性能检查清单前端工程化参考附代码 HT…

HTTP缓存机制与CDN

前提:周末看视频了解到一个关键词,http缓存,然后顺带这了解了一下cdn web应用程序的缓存大致分为数据库缓存,服务器端缓存(redis以及CDN 等缓存)、本地缓存。 本地缓存还包含很多内容:http缓存&…