ValueError分类指标报错:无法处理multilabel-indicator与continuous-multioutput混合目标
报错原因
ValueError: Classification metrics can't handle a mix of multilabel-indicator and continuous-multioutput targets
这个报错是两个问题共同导致的:
- 你调用
confusion_matrix、classification_report等sklearn分类评估函数时,传入的真实标签y_test是OneHot编码后的二维数组,属于sklearn定义的multilabel-indicator类型;而模型输出的predictions是每个类别的预测概率,属于continuous-multioutput类型,sklearn的分类指标不支持直接对这两种类型做匹配计算。 - 你代码最后一行的
y_lab是未定义的变量,即使解决了类型问题也会抛出变量不存在的错误。
解决方法
你可以选择以下任意一种方法修复问题:
- 方法1:将真实标签和预测结果都转为一维的类别标签后再传入评估函数
在调用评估函数前新增以下代码即可:
import numpy as np # 预测概率转类别标签:取概率最高的类别对应的索引 y_pred = np.argmax(predictions, axis=1) # 独热编码的真实标签转成原始类别标签 y_true = np.argmax(y_test, axis=1) # 替换原来的评估代码 print(confusion_matrix(y_true, y_pred)) print(classification_report(y_true, y_pred))
- 方法2:训练时不使用OneHot编码标签,改用稀疏分类交叉熵损失
修改训练流程,省去对标签做OneHot编码的步骤,同时把模型损失函数替换为sparse_categorical_crossentropy,适配整数类型的类别标签:
# 删掉原来OneHot编码的相关代码,y_train和y_test直接用train_test_split输出的整数标签即可 # 编译模型时修改损失函数 model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 预测后还是需要把概率转成类别标签 import numpy as np y_pred = np.argmax(model.predict(X_test), axis=1) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))
内容的提问来源于stack exchange,提问作者Md. Imrul Kayes
相关产品推荐
相关产品推荐

