【论文必用】Python绘制混淆矩阵

一、混淆矩阵介绍

  混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目。每一列中的数值表示真实数据被预测为该类的数目。

  以下图为例,第一行的数值总和为2+0+0=2,表示ant类别共有2个样本,其中,有2个样本被预测为ant类别,0个样本被预测为bird类别,0个样本被预测为cat类别,即ant类别的图像全预测正确了。其他行同理。
在这里插入图片描述
  上面这个混淆矩阵并没有归一化,对其进行归一化后的结果如下。以第三行为例进行解释:0.33表示有33%的cat图像被预测为了ant,0%的cat图像被预测为bird,也即没有cat图像被预测为bird,67%的cat图像被预测为cat。
在这里插入图片描述
  上面说这么多,主要是想让大家直观地理解混淆矩阵到底是怎么一回事。总是,混淆矩阵可以让我们清晰地看到网络的错分情况

二、绘制混淆矩阵

  在下面这个代码中,主要用到的两个函数分别是:库函数confusion_matrix自定义函数plot_confusion_matrix。其中,库函数只需要安装【scikit】包,具体安装命令如下。

在这里插入图片描述
  自定义函数plot_confusion_matrix大家直接粘贴下面的代码就行。

  实际应用时,大家只需要 改一下 下述代码中的 真实标签y_true预测标签y_pred ,及 标签名称label_name 即可。需要注意的是 label_name的顺序是按0,1,2的顺序排的 ,即因为ant的数字标签为0,因此它在第一位,bird的数字标签为1,因此它在第二位,cat的数字标签为2,因此它在第三位。以此类推。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix



# 绘制混淆矩阵的函数
def plot_confusion_matrix(cm, labels_name, title="Confusion Matrix",  is_norm=True,  colorbar=True, cmap=plt.cm.Blues):
    if is_norm==True:
        cm = np.around(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis],2)  # 横轴归一化并保留2位小数

    plt.imshow(cm, interpolation='nearest', cmap=cmap)  # 在特定的窗口上显示图像
    for i in range(len(cm)):
        for j in range(len(cm)):
            plt.annotate(cm[j, i], xy=(i, j), horizontalalignment='center', verticalalignment='center') # 默认所有值均为黑色
            # plt.annotate(cm[j, i], xy=(i, j), horizontalalignment='center', color="white" if i==j else "black", verticalalignment='center') # 将对角线值设为白色
    if colorbar:
        plt.colorbar() # 创建颜色条

    num_local = np.array(range(len(labels_name)))
    plt.xticks(num_local, labels_name)  # 将标签印在x轴坐标上
    plt.yticks(num_local, labels_name)  # 将标签印在y轴坐标上
    plt.title(title)  # 图像标题
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

    if is_norm==True:
        plt.savefig(r'.\cm_norm_' + '.png', format='png')
    else:
        plt.savefig(r'.\cm_' + '.png', format='png')
    plt.show() # plt.show()在plt.savefig()之后
    plt.close()



y_true = [2, 0, 2, 2, 0, 1] # 真实标签
y_pred = [0, 0, 2, 2, 0, 2] # 预测标签
label_name = ['ant', 'bird', 'cat']
cm = confusion_matrix(y_true, y_pred) # 调用库函数confusion_matrix
plot_confusion_matrix(cm, label_name, "Confusion Matrix", is_norm=False) # 调用上面编写的自定义函数
plot_confusion_matrix(cm, label_name, "Confusion Matrix", is_norm=True) # 经过归一化的混淆矩阵

三、在深度学习代码中添加绘制混淆矩阵模块

  在上述代码中,真实标签和预测标签都给定好了,那么如何在深度学习中根据图像真实标签和预测标签,从而对每个Epoch的错分情况进行绘制呢?具体做法如下,只需要在模型主函数的测试模块中,加入下述几行代码,即可。(注:笔者是做表情识别方向的,因此类别数总共有7种。)

在这里插入图片描述

  至此,本博文就结束了。如果本文对你有所帮助的话,欢迎订阅本专栏。永远相信美好的事情即将发生。

  • 12
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Python中调用混淆矩阵,你可以使用sklearn.metrics库中的confusion_matrix函数。首先,你需要导入该函数,然后将真实标签和预测标签作为参数传递给该函数。以下是一个示例代码来展示如何调用混淆矩阵: from sklearn.metrics import confusion_matrix y_true = [1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1] y_prediction = [1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1] cm = confusion_matrix(y_true, y_prediction) 在这个例子中,y_true是包含真实标签的列表,y_prediction是包含预测标签的列表。调用confusion_matrix函数后,你将得到一个混淆矩阵,它的值会存储在名为cm的变量中。 注意,为了更好地可视化混淆矩阵,你可以使用ConfusionMatrixDisplay类中的plot方法。 引用中的代码展示了如何绘制混淆矩阵形: from sklearn.metrics import confusion_matrix from sklearn.metrics import ConfusionMatrixDisplay y_true = [1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1] y_prediction = [1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1] cm = confusion_matrix(y_true, y_prediction) cm_display = ConfusionMatrixDisplay(cm).plot() 这段代码中,我们首先导入了ConfusionMatrixDisplay类,然后使用混淆矩阵创建了一个ConfusionMatrixDisplay对象cm_display。最后,我们调用了plot方法来绘制混淆矩阵形。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【论文必用Python绘制混淆矩阵](https://blog.csdn.net/qq_40968179/article/details/129548439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python数据分析:混淆矩阵](https://blog.csdn.net/liujingwei8610/article/details/123470276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信小海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值