Matplotlib Scikit学习:标签不';混淆矩阵中的t匹配

Matplotlib Scikit学习:标签不';混淆矩阵中的t匹配,matplotlib,scikit-learn,confusion-matrix,Matplotlib,Scikit Learn,Confusion Matrix,假设我有一个数组,其中(可能)有43个不同的值,例如 import pandas as pd Y_test = pd.Series([4,4,4,42,42,0,1,1,19], dtype=int) Y_hat = pd.Series([4,4,2,32,42,0,5,5,19], dtype=int) 每当我试图用以下方法绘制混淆矩阵时: def create_conf_mat(index, y_test, y_hat): cm = confusion_matrix(y_test,

假设我有一个数组,其中(可能)有43个不同的值,例如

import pandas as pd
Y_test = pd.Series([4,4,4,42,42,0,1,1,19], dtype=int)
Y_hat = pd.Series([4,4,2,32,42,0,5,5,19], dtype=int)
每当我试图用以下方法绘制混淆矩阵时:

def create_conf_mat(index, y_test, y_hat):
    cm = confusion_matrix(y_test, y_hat)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    cax = ax.matshow(cm)
    plt.title(f'Confusion Matrix ({index} features, 1 outcome)')
    fig.colorbar(cax)
    plt.xlabel('Predicted')
    plt.ylabel('Actual')
    plt.savefig(f'confm_{index}.png')
    plt.savefig(f'confm_{index}.svg')
    plt.savefig(f'confm_{index}.pdf')
    return
我没有得到标签[0,1,2,4,5,19,32,42],而是[0,1,2,3,4,5,6,7]。 我试图通过使用y_test/y_hat中的唯一值作为labels参数来显式设置标签,但它也不起作用。我甚至尝试将整数值转换为字符串,但通过这样做,sklearn抱怨至少有一个标签必须为y_true。 有人知道我怎样才能得到y_test和y_pred中的实际值,并将其作为混淆矩阵中的标签绘制出来吗

如中所示,关于
标签
参数到
混淆矩阵

如果未给出任何值,则在y_true或y_pred中至少出现一次的值将按排序顺序使用

因此,我们需要将这两个列表放在一起,并提取唯一数字列表:

labels = np.unique(np.concatenate([y_test.values, y_hat.values]))
plt.xticks(range(len(labels)), labels)
plt.yticks(range(len(labels)), labels)

请注意,最新版本的“scikit学习”现在包括一个with.

,如中所示,关于
标签
参数到
混淆矩阵

如果未给出任何值,则在y_true或y_pred中至少出现一次的值将按排序顺序使用

因此,我们需要将这两个列表放在一起,并提取唯一数字列表:

labels = np.unique(np.concatenate([y_test.values, y_hat.values]))
plt.xticks(range(len(labels)), labels)
plt.yticks(range(len(labels)), labels)


请注意,最新版本的“scikit learn”现在包含一个with。

您可以在返回语句
plt.xticks(range(len(y_test)),y_test)
plt.yticks(range(len(y_hat)),y_hat)之前添加以下两行。
您可以在返回语句
plt.xticks(range(len)之前添加以下两行(y_test)),y_test)
plt.yticks(range(len(y_hat)),y_hat)
这个答案有用吗?非常感谢!但是,标题和X标签现在重叠了,设置va/verticalalignment='bottom'不会在混淆矩阵的底部打印XTick。你知道任何解决方法吗?:)使用类似于
plt.title(…,fontsize=…,pad=20)
的方法来控制标题和x记号标签之间的距离。要获取底部的刻度,请使用
ax.xaxis.tick\u bottom()
这个答案有用吗?很有用,谢谢!但是,标题和X标签现在重叠,设置va/verticalalignment='bottom'不会在混淆矩阵底部打印XTICK。你知道什么解决办法吗?:)使用类似于
plt.title(…,fontsize=…,pad=20)
的方法来控制标题和x记号标签之间的距离。要获取底部的刻度,请使用
ax.xaxis.tick\u bottom()