全面解析混淆矩阵:分类模型性能评估的重要工具

[[id_534393940]d_911738925]id_377540359]

全面解析混淆矩阵:分类模型性能评估的重要工具

[id_14903[id_1376210414]604]

真正例(True Positive, TP)指的是,模型做出了正例的预测,而且实际上这确实是正例,其数量就是真正例的数量。

真反例(True Negative, TN):指的是模型做出预测,预测结果为反例,而且实际上它确实是反例,这样的情况的数量。

假正例指的是,模型预测为正例,然而实际上却是反例的数量。它也被称作“误报”。

假反例(False Negative, FN)指的是,模型预测为反例,然而实际上却是正例的数量,它也被称作"漏报"。

混淆矩阵的一般形式如下:

使用混淆矩阵,能够计算多个衡量分类器性能的指标,像准确率、精确率、召回率,召回率也被称作敏感度或真正例率,还有F1值等 。这些指标可借助混淆矩阵里的各个元素计算得到:

准确率是分类器预测正确的样本占总样本数的比例,其计算公式为(TP + TN) / (TP + TN + FP + FN) 。

精确率是正例预测正确的比例,其计算公式为TP / (TP + FP) 。

召回率:是正例被正确预测为正例的比例,其计算公式为TP / (TP + FN) 。

F1值是一个综合考虑了精确率和召回率的指标,它的计算公式为2 (Precision Recall) / (Precision + Recall) 。

混淆矩阵具备更详细且全面地评估分类模型性能的能力,它能帮助我们知晓预测里的误报与漏报状况。借助对混淆矩阵的分析,我们能够获取与分类器在每个类别上的表现相关的宝贵见解,还能对分类结果予以优化。

废话不多数,上代码:

def draw_confusion_matrix(label_true, label_pred, label_name, normlize, title="Confusion Matrix", pdf_save_path=None, dpi=100):
    """
@param label_true: 为真实标签,例如[0,1,2,7,4,5,...]
@param label_pred为预测标签,例如[0,5,4,2,1,4,...]
@param label_name: 标签的名称,例如['cat','dog','flower',...]
    @param normlize: 是否设元素为百分比形式
    @param title: 图标题
@param pdf_save_path: 表示是否进行保存,若进行保存,其值为保存路径,pdf_save_path 的值可以是 xxx.png ,也可以是 xxx.pdf ,或者是其他 plt.savefig 所支持的保存格式 。
@param dpi,它指的是保存到文件时的分辨率,在论文方面通常有至少300dpi的要求。
    @return:
[id_1300592799]
绘制混淆矩阵,真实标签为y_gt ,
                          label_pred=y_pred,
标签名称包括,“愤怒”,“厌恶”,“恐惧”,“高兴”,“悲伤”,“惊讶”,“中性”,
                          normlize=True,
标题是“关于Fer2013的混淆矩阵”
pdf保存路径为“Confusion_Matrix_on_Fer2013.png”
                          dpi=300)
    """
    cm1=confusion_matrix(label_true, label_pred)
    cm = confusion_matrix(label_true, label_pred)
    if normlize:
        row_sums = np.sum(cm, axis=1)
        cm = cm / row_sums[:, np.newaxis]
    cm=cm.T
    cm1=cm1.T
    plt.imshow(cm, cmap='Blues')
    plt.title(title)
    plt.xlabel("Predict label")
    plt.ylabel("Truth label")
    plt.yticks(range(label_name.__len__()), label_name)
    plt.xticks(range(label_name.__len__()), label_name, rotation=45)
    plt.tight_layout()
    plt.colorbar()
    for i in range(label_name.__len__()):
        for j in range(label_name.__len__()):
            color = (1, 1, 1) if i == j else (0, 0, 0)	# 对角线字体白色,其他黑色
            value = float(format('%.1f' % (cm[i, j]*100)))
            value1=str(value)+'%\n'+str(cm1[i, j])
            plt.text(i, j, value1, verticalalignment='center', horizontalalignment='center', color=color)
    # plt.show()
    if not pdf_save_path is None:
        plt.savefig(pdf_save_path, bbox_inches='tight',dpi=dpi)
labels_name = ['bananaquit', 'Black Skimmer', 黑喉雀鹛, 'Cockatoo']
y_gt=[]
y_pred=[]
model_weight_path = "./best_CBAM_model.pth"
models = Xception(num_classes = 4)
models.load_state_dict(torch.load(model_weight_path))
models.eval()
for index, (imgs, labels) in enumerate(test_dl):
    labels_pd = models(imgs)
    predict_np = np.argmax(labels_pd.cpu().detach().numpy(), axis=-1).tolist()
    labels_np = labels.numpy().tolist()
    y_pred.extend(predict_np)
    y_gt.extend(labels_np)
print("预测标签为:", y_pred)
print("真实标签为", y_gt)
draw_confusion_matrix(label_true=y_gt,
                      label_pred=y_pred,
                      label_name=labels_name,
                      normlize=True,
                      title="Confusion Matrix",
                      pdf_save_path="Confusion_Matrix.jpg",
                      dpi=300)

结果如下:

更新

这里大佬给我提供了一种生成混淆矩阵的方法,这种方法更加简单,它是基于机器学习sklearn里的库confusion_matrix以及seaborn库。原文参考深度学习100例-卷积神经网络(CNN)识别眼睛状态 | 第17天

Seaborn是Python数据可视化库,它基于Matplotlib ,它提供高层次接口,用于绘制统计图形,这些图形具有吸引力且信息丰富,Seaborn的设计目标是让数据可视化更简单,同时更具吸引力,以便更好理解和传达数据含义。它具有许多内置的图表类型,它具有许多内置的图表样式,这些可用于探索数据分布,这些可用于比较多个变量之间的关系,这些可用于绘制分类数据,这些可用于在统计模型中的可视化等。它还提供了许多自定义选项,这些选项使您能够根据自己的需求进行图形的修改,这些选项使您能够根据自己的需求进行图形的美化。

sklearn.metrics是Scikit-learn库中的一个模块,它用于评估机器学习模型的性能和预测结果,该模块提供了各种函数,这些函数用于计算模型性能指标,比如准确度、精确度、召回率、F1值等,它还提供了工具函数,这些工具函数用于绘制混淆矩阵、ROC曲线、学习曲线等 。

混淆矩阵是用于衡量分类模型性能的一种方式,它以矩阵形态展现模型预测结果与真实标签间的差异,混淆矩阵的行代表真实标签,列代表预测标签,每个单元格里的值是对应标签的样本数量,借助分析混淆矩阵,我们能够得出模型的准确性、错误类型以及偏差等信息。

利用Seaborn库的heatmap函数,我们能够把混淆矩阵可视化为热力图,借此更直观地呈现模型预测结果的分布状况。热力图里每个单元格的颜色深浅,体现着对应标签的样本数量或者其他统计指标 。

from sklearn.metrics import confusion_matrix
import seaborn as sns
import pandas as pd
# 定义一个绘制混淆矩阵图的函数
def plot_cm(labels, predictions):
    
    # 生成混淆矩阵
    conf_numpy = confusion_matrix(labels, predictions)
    # 将矩阵转化为 DataFrame
    conf_df = pd.DataFrame(conf_numpy, index=class_names ,columns=class_names)  
    
    plt.figure(figsize=(8,7))
    
    sns.heatmap(conf_df, annot=True, fmt="d", cmap="BuPu")
    
    plt.title('混淆矩阵',fontsize=15)
    plt.ylabel('真实值',fontsize=14)
    plt.xlabel('预测值',fontsize=14)

val_pre   = []
val_label = []
for images, labels in val_ds:#这里可以取部分验证数据(.take(1))生成混淆矩阵
    for image, label in zip(images, labels):
        # 需要给图片增加一个维度
        img_array = tf.expand_dims(image, 0) 
        # 使用模型预测图片中的人物
        prediction = model.predict(img_array)
        val_pre.append(class_names[np.argmax(prediction)])
        val_label.append(class_names[label])
plot_cm(val_label, val_pre)

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读