我正在尝试使用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()
回答:
如您所理解,颜色条及其范围应与图表一起保持,即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,而不更改颜色条本身及其关联的图表,这不是一个好主意。