如何为Seaborn混淆矩阵添加正确的标签

2024-04-20 11:49:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用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')

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

Confusion matrix

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

有人能帮我吗

谢谢大家!

//拉斯穆斯


Tags: 数据代码testfig绘制plt矩阵数字
2条回答

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

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和级别,作为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))

enter image description here

和具有0,1,2的混淆矩阵:

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

enter image description here

我们返回并使用级别:

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')

enter image description here

标签按字母顺序排列。 因此,使用numpy来区分“真”标签,您将得到一个按字母顺序排序的数组

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}) 

相关问题 更多 >