news 2026/6/10 10:00:31

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 2:16:20

Mamba 来了:选择性状态空间模型

原文:towardsdatascience.com/here-comes-mamba-the-selective-state-space-model-435e5d17a451 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/603853a334e124f61fa10eadcb54415c.png 图片由Sascha Kirch提供。 这是我的新多…

作者头像 李华
网站建设 2026/6/10 20:08:09

Codex CLI 安装及使用

安装WIN下安装建议使用 PowerShell 而不是 CMD.npm install -g openai/codex验证codex -V创建 Codex 配置目录删除旧的配置目录(如果存在)Remove-Item-Path"$env:USERPROFILE\.codex"-Recurse-Force-ErrorActionSilentlyContinue创建新的配置目…

作者头像 李华
网站建设 2026/6/9 4:39:06

在 Gemini CLI 中使用 Gemini 3.0

前言最近 Gemini 3.0 想当火爆,但是墙内使用存在各种阻碍,今天教大家无需魔法免费白嫖.在 Gemini CLI中用上Gemini 3.0.安装 Gemini CLI安装教程网上很多,这边简单列举通过node安装步骤,各个操作系统都大差不差.不懂的网上自行查找.安装前提 : Node.js 环境(版本 18…

作者头像 李华
网站建设 2026/6/10 9:15:54

顶刊级研究思路和理论怎么来?利用GPT-5.2和Gemini 3 Pro一键设计与匹配(附AI提示词示例)

选择什么样的研究理论或视角,直接决定了你的研究深度和创新性,而研究思路则是贯穿全文的骨架,它负责把理论或视角落实到具体的实践行动中。 很多科研同仁在选择研究理论与设计研究思路时,难以找到既贴合研究问题又具有创新性的恰当理论;设计研究思路时,又会陷入与实践脱…

作者头像 李华
网站建设 2026/6/11 1:04:53

ArtPlayer.js完整教程:打造专业级HTML5视频播放体验的终极指南

ArtPlayer.js完整教程:打造专业级HTML5视频播放体验的终极指南 【免费下载链接】ArtPlayer :art: ArtPlayer.js is a modern and full featured HTML5 video player 项目地址: https://gitcode.com/gh_mirrors/ar/ArtPlayer ArtPlayer.js是一款功能强大的现代…

作者头像 李华
网站建设 2026/6/10 14:31:21

GLAD:高斯光束的吸收和自聚焦效应

概述当一束强激光入射到介质中后,由于强光场与介质的非线性作用,使得介质的线性折射率上会叠加与入射光强相关的非线性折射率。当入射光束的光强呈现空间上的非均匀分布时,由此引入的非线性折射率也是非均匀的,这将使不同空间位置…

作者头像 李华