【问题标题】:How to add correct labels for Seaborn Confusion Matrix如何为 Seaborn 混淆矩阵添加正确的标签
【发布时间】:2020-04-30 14:51:46
【问题描述】:

我已经使用 seaborn 将我的数据绘制成一个混淆矩阵,但是我遇到了一个问题。问题是它只在两个轴上显示从 0 到 11 的数字,因为我有 12 个不同的标签。

我的代码如下:

cf_matrix = confusion_matrix(y_test, y_pred)
fig, ax = plt.subplots(figsize=(15,10)) 
sns.heatmap(cf_matrix, linewidths=1, annot=True, ax=ax, fmt='g')

在这里你可以看到我的混淆矩阵:

我得到了我应该得到的混淆矩阵。唯一的问题是未显示的标签名称。我在互联网上搜索了很长时间,但没有运气。是否有任何参数可以附加标签或如何做到这一点?

谁能帮帮我?

谢谢!

//拉斯穆斯

【问题讨论】:

  • 你可以试试sns.heatmap(....., xticklabels=['xlabel1', ...], yticklabels=['ylabel1', ...])
  • 嗨,约翰,感谢您的回答!我已经尝试过了,没关系,但是没有任何自动化方法可以单独识别,例如0 是标签 1 等等?
  • 如果数据来自 pandas 数据框,标签可能会更加自动化。请注意,Python 总是从 0 开始计数。要从 1 开始获取标签,您可以尝试 ``..., xticklabels=range(1, myArray.shape[1]+1))`
  • 是的,数据来自一个数据框,但在将其绘制到混淆矩阵中之前,它已经通过了神经网络。我想最简单的方法就是使用 xticklabels 和 yticklabels 然后手动编写标签。但是,您知道找出哪个标签是哪个数字的简单方法吗?
  • 这里可以看到准确率和召回率。标签在此处的顺序与混淆矩阵中的顺序相同吗?即混淆矩阵中的 0 是“新产品行动”? imgur.com/IvZKCb2

标签: python seaborn confusion-matrix


【解决方案1】:

当您分解类别时,您应该保留级别,因此您可以将其与 pd.crosstab 结合使用而不是 confusion_matrix 来绘制。以鸢尾花为例:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.metrics import classification_report, confusion_matrix

df = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",
                 header=None,names=["s.wid","s.len","p.wid","p.len","species"])
X = df.iloc[:,:4]
y,levels = pd.factorize(df['species'])

在这部分,你得到[0,..1,..2]中的标签y和levels作为0,1,2对应的原始标签:

Index(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype='object')

所以我们适合并喜欢你所拥有的:

clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X,y)
y_pred = clf.predict(X)
print(classification_report(y,y_pred,target_names=levels))

还有一个带有0,1,2的混淆矩阵:

cf_matrix = confusion_matrix(y, y_pred)
sns.heatmap(cf_matrix, linewidths=1, annot=True, fmt='g')

我们返回并使用关卡:

cf_matrix = pd.crosstab(levels[y],levels[y_pred])
fig, ax = plt.subplots(figsize=(5,5))
sns.heatmap(cf_matrix, linewidths=1, annot=True, ax=ax, fmt='g')

【讨论】:

    【解决方案2】:

    标签按字母顺序排序。 因此,使用 numpy 对 ture_label 进行区分,您将获得按字母顺序排序的 ndarray

    cm_labels = np.unique(true_label)
    cm_array = confusion_matrix(true_label, predict_label)
    cm_array_df = pd.DataFrame(cm_array, index=cm_labels, columns=cm_labels)
    sn.heatmap(cm_array_df, annot=True, annot_kws={"size": 12}) 
    

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 2021-10-07
      • 1970-01-01
      • 2020-01-22
      • 2020-07-31
      • 2018-11-06
      • 2018-09-30
      • 1970-01-01
      • 2019-11-23
      相关资源
      最近更新 更多