我无法理解使用 argmax() 删除 OHE 后得到的混淆矩阵

我无法解释我的混淆矩阵。我遇到了低于价值的错误。


ValueError:不支持多标签指示器


阅读大量帖子后,我意识到该问题可能是由于预测中的OHE(一种热门编码)造成的。因此,为了解决这个问题,我按照各种帖子中的建议使用了 argmax() 。下面是我的代码:


from sklearn.metrics import confusion_matrix

print(Y.shape)

print(predictions.shape)

print(Y)

print(predictions)

# print(confusion_matrix(Y, predictions))

print(confusion_matrix(Y.argmax(axis = 1), predictions.argmax(axis = 1)))


(1, 200)

(1, 200)

[[1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0

  0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1

  0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1

  0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 1 0

  0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1

  0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0]]

[[1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0

  0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 1 1 1 1 0 0 1

  0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1

  0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0

  0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0

  0 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1]]

[[1]]

从输出中可以看出,我得到的[[1]]是混淆矩阵。我不知道如何解释它。我期待一个 2x2 混淆矩阵,然后我会继续计算精度、召回率、F1 分数等,以了解我的模型的性能。请建议我做错了什么?


智慧大石
浏览 102回答 2
2回答

芜湖不芜

IIUC 的问题在于输入数组的形状。你需要先把它们压平。这是重现您的案例的示例:from sklearn.metrics import confusion_matrixY = np.random.choice([0,1],size=(1,10))pred = np.random.choice([0,1],size=(1,10))由于两个数组都是二维的,如您的示例所示,confusion_matrix因此解释您具有多标签输出,但它不支持:confusion_matrix(Y, pred)ValueError: multilabel-indicator is not supported您需要展平两个数组:confusion_matrix(Y.ravel(), pred.ravel())

一只斗牛犬

考虑到其他信息,输出是正确的。由于 Y 形状为 (1,200),这表明您有 1 个样本,其中有 200 个类。当你对此执行 argmax() 时,你将得到大小为 (1,1) 的输出。混淆矩阵的大小为 (n_classes, n_classes)。由于只有一个样本,因此混淆矩阵的大小将为 (1,1)。为了解决这个问题,要么您需要传递多个样本,要么确保 argmax 正在执行预期的操作(即您确定输出是 OHE)?如果您的输出不是 OHE,那么您只需在获得混淆矩阵之前重新调整预测即可。from sklearn.metrics import confusion_matrixY = np.squeeze(Y) #should result in shape (200,)predictions = np.squeeze(predictions) #should result in shape (200,)cf = confusion_matrix(Y, predictions) #should result in shape (2, 2) if 2 classes 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python