news 2025/12/27 13:24:03

Python 中的混淆矩阵热图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 中的混淆矩阵热图

原文:towardsdatascience.com/heatmap-for-confusion-matrix-in-python-20a9fc689665

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eb2deb7880a404f4b9a0ee7d9bc91bc6.png

图片由作者提供

简介

混淆矩阵是展示机器学习模型犯的错误类型的一种便捷方式。它是一个NN列的数字网格,其中 [n, m] 单元格中的值表示被标注为第 n 类并被识别为第 m 类的示例数量。在本教程中,我将重点介绍如何创建混淆矩阵和热图。颜色调色板将用于显示不同组的大小,使其容易注意到组大小之间的相似性或显著差异。当你处理大量类别时,这种可视化方法非常有用。

这里是混淆矩阵元素的一个视觉解释。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/faf37183d53dffbe5ce712e0973bc5e9.png

图片由作者提供

请记住,用于演示混淆矩阵的数据是人工的,并不代表任何真实的分类模型。

现在,我将逐步解释如何使用 Python 模块生成这样的混淆矩阵。


Python 基础

要使用热图创建混淆矩阵,你需要三个模块:

pip install scikit-learn,seaborn,pandas

假设你拥有两个预测列表和真实标签列表,你需要执行以下操作:

  1. 计算混淆矩阵 –confusion_matrix

  2. 将变量转换为数据框 –pd.DataFrame

  3. 创建热图图表 –sn.heatmap

  4. 最后,将图表保存到文件中 –cfm_plot.figure.savefig

importpandasaspdfromsklearn.metricsimportconfusion_matriximportseabornassnif__name__=='__main__':predictions=["None","Dog","Cat",...]true_labels=["None","Dog","Dog",...]cm=confusion_matrix(true_labels,predictions)df_cfm=pd.DataFrame(cm)cfm_plot=sn.heatmap(df_cfm)cfm_plot.figure.savefig("data/confusion_matrix_v1.png")

这里是输出结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/63504d94cbf10f9b97300cff8942aa70.png

图片由作者提供

输出完全不起眼。默认情况下,许多有用的信息和自定义功能被禁用或不适合我们的数据。让我们改进这个图表。


标签

我们需要创建一个显示标签的标签列表。我们可以使用预测和真实标签的信息(第一行)来做这件事。为了提高可读性并保持运行之间的相同顺序,我们将多数类(None)移动到第一个元素,并对剩余的标签进行排序(第二行)。如果不这样做,标签的顺序可能会在每次运行代码时不同。

接下来,我们在confusion_matrix方法中添加labels=label_names,并在数据框的构造函数中添加index=label_names, columns=label_names

label_names=list(set([]+predictions+true_labels))label_names=["None"]+sorted([aforainlabel_namesifa!="None"])cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)cfm_plot=sn.heatmap(df_cfm)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8c112308c0892d1df9d96327bd7dd919.png

图片由作者提供

我们可以看到一个与标签相关的问题。Y 轴上的标签部分被截断。为了解决这个问题,我们可以使用figsize增加绘图画布。

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cfm_plot=sn.heatmap(df_cfm)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/18dfbf3822e2bba1c61611a86c1605b8.png

图片由作者提供


在下一步中,我们将为每个单元格显示一个值。这是一种方便的方法来观察每个类别对的精确错误数量。我们将使用heatmap方法的annot参数来显示这些值。它需要一个与我们的混淆矩阵相同维度的数据框。因此,我们可以再次传递相同的数据框,即df_cfm

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cfm_plot=sn.heatmap(df_cfm,annot=df_cfm)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e69db7d167ba2ba68680975d0faaaf98.png

图片由作者提供

我们可以看到确切的值,但这个图有两个问题。第一个是显示大数的方式很奇怪,另一个是 0 的数量很多,使得图表难以阅读。

为了解决显示数字的问题,我们将更改默认的字符串格式化代码,将其从.2g更改为空字符串,使用fmt参数。

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cfm_plot=sn.heatmap(df_cfm,annot=df_cfm,fmt="")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6f43d0c6cdac16876c572cf397531fba.png

图片由作者提供

为了隐藏 0,我们将复制数据框并将每个 0 替换为空字符串。

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cell_value=df_cfm.applymap(lambdav:vifvelse"")cfm_plot=sn.heatmap(df_cfm,annot=cell_value,fmt="")cfm_plot.figure.savefig("data/confusion_matrix_v6.png")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/20f21596c10ff1a783fb45804723c309.png

图片由作者提供


尺度和颜色

热图的思路是使用颜色来直观地展示数值。在我们的例子中,我们可以看到只有一个不同的值,即 None 类中真正阳性的数量,而其他类别(狗和猪)的数值,而其他类别看起来相同。问题是我们的数值范围,从 0 到 1413,其中大多数数值接近 0。为了使数值更引人注目,我们可以将颜色的尺度从线性改为对数。这可以通过设置norm参数为LogNorm()来实现。

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cell_value=df_cfm.applymap(lambdav:vifvelse"")cfm_plot=sn.heatmap(df_cfm,annot=cell_value,fmt="",norm=LogNorm())

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/298ac1ede57d679eb5d4704d8678774c.png

图片由作者提供

使用颜色的对数尺度,图表看起来要好得多。移除空单元格后,分析非空单元格更容易,因为干扰更少。在某些情况下,可能很难跟随行和列。为了解决这个问题,我们可以使用linewidthlinecolor参数添加垂直和水平线。

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cell_value=df_cfm.applymap(lambdav:vifvelse"")cfm_plot=sn.heatmap(df_cfm,annot=cell_value,fmt="",norm=LogNorm(),linewidths=0.5,linecolor="grey")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5f5a2fb2c3c08da7d0b0f9a068f1dc9e.png

图片由作者提供

最后一步是选择首选的颜色调色板。Seaborn 有几个现成的调色板,在此处展示:seaborn.pydata.org/tutorial/color_palettes.html。要更改颜色调色板,将调色板的名称提供给cmap参数。这里是一个使用crest调色板的示例。

cm=confusion_matrix(true_labels,predictions,labels=label_names)df_cfm=pd.DataFrame(cm,index=label_names,columns=label_names)plt.figure(figsize=(10,7))cell_value=df_cfm.applymap(lambdav:vifvelse"")cfm_plot=sn.heatmap(df_cfm,annot=cell_value,fmt="",norm=LogNorm(),linewidths=0.5,linecolor="grey",cmap="crest")

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ca4d95d6df506ff81cd5ad64b72fd1d3.png

图片由作者提供:调色板徽标

这里是一些其他调色板的示例:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2226d8593fc161d197ab8e9c16cc4b73.png

图片由作者提供:调色板 viridis

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7938bfded6915acaf2306b2d8479339b.png

图片由作者提供:调色板 magma

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/30c4a728a5872d4ebe96370287bb9dab.png

图片由作者提供:调色板 rocket_r


结论

在颜色和格式上玩耍可能看起来是浪费时间,因为数字才是最重要的。然而,合适的图表可能会显著提高我们数据的可读性和可访问性,尤其是在我们向一个对我们所熟悉的数据不那么熟悉的客户展示时。花一些额外的时间来弄清楚是否有更好的方式来展示原始数据和从分析中获得的见解是值得的。


参考文献

[1]seaborn.pydata.org/

[2]scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/21 14:16:47

【网络】UDP 协议深度解析:从五元组标识到缓冲区

目录 一、引言:UDP——轻量级传输层协议 1.1 UDP的核心定位 1.2 传输层的核心职责 1.3 UDP与TCP的核心差异(对比) 二、端口号:应用通信的“身份标识” 2.1 端口号的核心作用 2.2 通信标识:五元组…

作者头像 李华
网站建设 2025/12/21 13:20:08

Kotaemon与Neo4j图数据库结合实现关系推理

Kotaemon与Neo4j图数据库结合实现关系推理 在企业级智能问答系统日益复杂的今天,一个普遍存在的挑战是:用户的问题不再局限于单一事实的查询,而是越来越多地涉及多跳逻辑、上下文依赖和实体间的隐性关联。比如,“张三所在的团队最…

作者头像 李华
网站建设 2025/12/21 20:54:04

Kotaemon PDF解析优化:准确提取表格与段落结构

Kotaemon PDF解析优化:准确提取表格与段落结构 在企业知识库、智能客服和合规审查等高要求场景中,一个常见的痛点是:用户上传了一份结构复杂的PDF文档——可能是年度财报、科研论文或产品手册——系统却只能返回支离破碎的文本片段。提问“20…

作者头像 李华
网站建设 2025/12/21 14:57:23

BW-C116T十六串口服务器-有效解决多设备联网的复杂性难题!

在工业自动化、智能楼宇、环境监测等领域的数字化转型浪潮中,海量的传统串口设备(如PLC、传感器、控制器、电表等)如何高效、稳定、安全地接入以太网和物联网系统,是许多工程师与系统集成商面临的核心挑战。分散的布线、复杂的协议…

作者头像 李华
网站建设 2025/12/22 7:33:51

33.一篇讲完keil调试

1.准备条件1.确认系统主频方法1:看cubmux配置方法2:调试时读出将SystemCoreClock加入变量观察窗口。SystemCoreClock2.调试配置仿真时的配置:设置优化等级:不优化二.调试总结1.断点断点可设置/删除/使能/失能2.调试工具条详解这几…

作者头像 李华