python 用seaborn库绘制混淆矩阵和概率混淆矩阵


混淆矩阵的含义

1. 分类评估指标定义的符号含义:

TP:将正类预测为正类数,真实为0,预测也为0
FN:将正类预测为负类数,真实为0,预测为1
FP:将负类预测为正类数, 真实为1,预测为0
TN:将负类预测为负类数,真实为1,预测也为1

2. 混淆矩阵的表示含义

混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值。

eg:二分类问题:



eg:多分类问题:



3. 绘制混淆矩阵

以自己乐器识别项目的数据为例
import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt

confusion_matr = confusion_matrix(y_test, preds)
# 其中y_test是测试集真实值的值,preds是模型对测试集的预测值向量

plt.figure(figsize = (16, 9))    # 设定图片大小
sns.heatmap(confusion_matr, cmap="Blues", annot=True, 
           xticklabels = ["clarinet", "guitar", "singer", "flute", "piano", "saxophone", "trumpet", "violin"],
           yticklabels=["clarinet", "guitar", "singer", "flute", "piano", "saxophone", "trumpet", "violin"]);
plt.savefig("conf matrix")

绘制混淆矩阵如下:

上图混淆矩阵的问题

从图片中我们可以看到,对角线上的各标签深浅不一,这是由于数据集各标签的数量分布并不均匀,导致每个标签之间的准确预测数量差异极大,该混淆矩阵也就无法直观体现模型的准确度。对于这种情况,我们需要绘制概率混淆矩阵,用各标签预测准确度来表征图像。

4. 绘制概率混淆矩阵

由混淆矩阵转化为概率混淆矩阵只需以下两个步骤:

  • 对混淆矩阵按行求和
  • 混淆矩阵的每个元素除以该元素所在的行和
    用numpy的sum即可实现。

    import seaborn as sns
    from sklearn.metrics import confusion_matrix
    import numpy as np
    import matplotlib.pyplot as plt
    
    confusion_matr = confusion_matrix(y_test, preds)
    confusion_matr_normalized = confusion_matr.astype('float')/confusion_matr.sum(axis=1)[:,np.newaxis] # 混淆矩阵的每个元素除以所在行和
    plt.figure(figsize = (16, 9))
    sns.heatmap(confusion_matr_normalized, cmap="Blues", annot=True, 
              xticklabels = ["clarinet", "distorted electric guitar", "female singer", "flute", "piano", "tenor saxophone", "trumpet", "violin"],
             yticklabels=["clarinet", "distorted electric guitar", "female singer", "flute", "piano", "tenor saxophone", "trumpet", "violin"]);
    plt.tight_layout()
    plt.savefig("probability conf matrix.jpg")

    绘制概率混淆矩阵如下:

用准确度表征混淆矩阵后,模型的性能表示会直观很多。

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - python 用seaborn库绘制混淆矩阵和概率混淆矩阵


Make Everyday Count