Matplotlib图表中归一化混淆矩阵的颜色条未更新值

我正在尝试使用K近邻算法解决一个多类机器学习问题,并使用Matplotlib.pyplot的imshow函数绘制我的数据中所有10个类别的预测混淆矩阵。数据中某些类别的出现频率明显高于其他类别,最高可达3000次,而其他类别可能仅有50次,因此我对其进行了归一化处理,只显示百分比。图表旁边有一个颜色条,如果不进行归一化处理,它的范围将从1到3000,这是合理的。然而,在归一化后,范围仍然保持在3000。我使用了Scikit Learn在其网站上提供的绘图函数,在这里。我是否遗漏了什么明显的东西,还是需要额外的步骤来减少颜色条的值范围?

代码

virdis = plt.cm.viridisblues = plt.cm.Bluesautumn = plt.cm.autumndef plot_confusion_matrix(cm, classes,                          normalize=False,                          title='Confusion matrix',                          cmap=blues):    """    This function prints and plots the confusion matrix.    Normalization can be applied by setting `normalize=True`.    """    plt.imshow(cm, interpolation='nearest', cmap=cmap)    plt.title(title)    bounds=[0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]    plt.colorbar(boundaries=bounds)    tick_marks = np.arange(len(classes))    plt.xticks(tick_marks, classes, rotation=45)    plt.yticks(tick_marks, classes)    if normalize:        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]        print("Normalized confusion matrix")    else:        print('Confusion matrix, without normalization')    cm = np.around(cm, decimals=3)    thresh = cm.max() / 2.    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):        plt.text(j, i, cm[i, j],                 horizontalalignment="center",                 color="white" if i == 9 and j == 9 else "black")    plt.ylabel('True label')    plt.xlabel('Predicted label')knn = KNeighborsClassifier()knn.fit(X_train, y_train)knn_score = knn.score(X_test, y_test)knn_fold_score = model_selection.cross_val_score(knn, X_test, y_test, cv=10).mean()predictions = knn.predict(X_test)c_matrix = confusion_matrix(y_test, predictions)# Plot normalized confusion matrixplt.figure()plot_confusion_matrix(c_matrix, classes=country_names, normalize=True,                      title='Normalized confusion matrix')plt.show()

enter image description here


回答:

如您所理解,颜色条及其范围应与图表一起保持,即plt.imshow。Scikit Learn的示例和您的示例都在进行或决定是否进行归一化之前绘制矩阵。因此,两个图表及其关联的颜色条看起来完全相同。如果您在绘图之前进行归一化处理,即将以下代码块移到前面:

if normalize:    cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]    print("Normalized confusion matrix")else:    print('Confusion matrix, without normalization')cm = np.around(cm, decimals=3)

plt.imshow(cm, interpolation='nearest', cmap=cmap)之前,归一化图表的颜色条范围将从0到1。再次提醒您,图表本身的颜色也会发生变化。我认为仅更改颜色条的文本标签,使其范围从0到1,而不更改颜色条本身及其关联的图表,这不是一个好主意。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注