草庐IT

机器学习之混淆矩阵 confusion_matrix

caesaryun 2025-05-20 原文

1.这里介绍由 sklearn.metrics.ConfusionMatrixDisplay 所给出的关于混淆矩阵的一个小例子,来进行理解混淆矩阵及如何应用混淆矩阵来对数据进行分析

2.先了解混淆矩阵的一些基本信息,这里规定正类为1,负类为0

TP(True Positives): 预测为1,而真实的也为1 (即正类判断为正类,1判断为1)

TN(True Negatives): 预测为0,真实的也为0   (即负类判断为负类,0判断为0)

FP(False Positives): 预测为1,真实的为0       (即负类判断为正类,将0判断为了1)

FN(False Negatives): 预测为0,真实为1        (即正类判断为负类,将1判断为了0) 

样本总数=25 预测为:0预测为:1
真实为:0TN = 12FP = 1真实的0总数:13
真实为:1FN = 2TP = 10真实的1总数:12
预测的0总数:14预测的1总数:11

上方表格中,说明一下FN = 2 ,即表示预测为0的样本总的有14个,但是其中有2个样本咱预测成了0不过其真实的情况是为1,所以得到了FN = 2,即将本来是1的预测成了0(正类预测成了负类)。

为了便于理解,还可以将1理解成患病的情况,0是没病的情况,那么上面FN=2,则可理解成,将本来是患病的2个人预测成了没病,所以自然预测出问题了,他俩本来有病,但计算机预测他俩没病。

这个预测的数据,并非人为的凭空捏造,而是通过相关模型的建立及训练后,传入相关测试数据后,得到的预测数据。

而我们会想如果预测的数据和真实的数据情况一样的情况呢,即假设咱建立的模型很牛掰,预测的很准达到了100%正确,那么TN、FP、FN、TP的取值又该如何呢?即如下表情况:我们规定其真实的0的个数和上表一样还是13个,真实的1的个数仍旧为12,然后预测情况如下:

样本总数=25 预测为:0预测为:1
真实为:0130真实的0总数:13
真实为:1012真实的1总数:12
预测的0总数:13预测的1总数:12

可以看到预测情况和真实的情况一样,即这种情况毫无疑问,预测准确率达到了100%,当然一般情况下,预测能力可达不到100%正确。

除上述外还需了解召回率(recall score)的相关信息,可从sklearn.metrics.recall_score 中进行了解,即使用TN、FP、FN、TP的相关值来计算的一个分数,进而评估该预测效果

3.接下来了解通过代码及运行结果来进行相关信息的理解及应用

3.1  基于SVC的方式来进行训练及预测

# 混淆矩阵 confusion matrix

import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import make_classification
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

from sklearn.metrics._classification import recall_score





X, y = make_classification(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0)

print("真实的 Y值:",y_test)


# SVC 方式

clf = SVC(random_state=0)


clf.fit(X_train, y_train)


predictions = clf.predict(X_test)


print("预测的 Y值:",predictions)

# SVC
#Y: [1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0]
#p: [1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1 0 0]
#      x             x                       x     





cm = confusion_matrix(y_test, predictions)

disp = ConfusionMatrixDisplay(confusion_matrix=cm)

r = recall_score(y_test,predictions,average='macro')


print("\n","recall score:" , r)



disp.plot()

plt.show()




控制台输出:recall score = 0.8782051282051282

 混淆矩阵图像:

为了方便理解,不妨将混淆矩阵的各个模块添加上坐标,所以可以看到下图的各个模块坐标,坐标为(0,0)的模块样本数量有12个,(0,1)的有1个,(1,0)的有2个,(1,1)的有10个

首先通过对控制台输出的真实的 Y 值及预测的Y值进行分析,可以看到下图中打上红叉的地方,预测的Y值与真实值并不一样,所以可以看到混淆矩阵图上(1,0)的地方有2个,其代表的意思就是预测为0但实际为1的样本数量有2个,即 FN = 2;

又有(0,1)的模块有1个样本,即 FP = 1,表示为预测为 1但实际上是 0(将负类预测成了正类,0预测成了1);

又有(0,0)的模块为12个,即 TN = 12,表示为预测为0,真实的也为0的有12个样本(负类预测成负类,0预测成了0);

之后有(1,1)的模块为10个,即 TP = 10,表示为预测成1,真实的也为1的有10个样本(正类预测成正类,1预测成了1)。

3.2 基于逻辑回归的方式训练及预测

# 添加如下代码,且将SVC方式注释掉使用逻辑回归方式即可


from sklearn.linear_model import LogisticRegression



# SVC 方式
# clf = SVC(random_state=0)

# 逻辑回归方式
clf = LogisticRegression(random_state=0)

 可以发现recall score 分数较SVC的提高了些

 可以发现对比之前的混淆矩阵,逻辑回归方式,(1,1)即 TP = 11,从TP = 10 提高到了 11,略有上升。

3.3 线性回归的方式训练及预测

# 添加线性回归的库,即调用线性回归的代码

from sklearn.linear_model import LinearRegression


# SVC 方式
# clf = SVC(random_state=0)

# 逻辑回归方式
# clf = LogisticRegression(random_state=0)

# 采用线性回归
clf = LinearRegression()


clf.fit(X_train, y_train)


predictions = clf.predict(X_test)

predictions = predictions.astype(int)   # 将预测数据转为int类型

可以看到线性回归方式进行预测效果有些不太理想,recall score 降低了很多

 

 从混淆矩阵来看,预测的效果,在预测为1且实际为1时的情况即TP的值下降了许多,该方式进行预测有点不太理想。

4.以上便为混淆矩阵的一些简单理解,总体来说,混淆矩阵表示相关数据情况,还是比较直观的。

有关机器学习之混淆矩阵 confusion_matrix的更多相关文章

  1. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  2. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  9. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  10. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

随机推荐