深度学习分类任务报错:分类指标无法处理二值与连续目标混合
报错原因
触发ValueError: Classification metrics can't handle a mix of binary and continuous targets的核心原因是:confusion_matrix等分类评估指标要求传入的预测值是离散类别标签,但你传入的y_pred是模型输出的0~1区间连续概率值,和0/1格式的离散真实标签类型不匹配。
从你贴的运行输出可以看到,y_pred是[0.00791603, 0.52200854, 0.53883666]这类浮点数概率,不是分类要求的0/1整数值,自然无法计算混淆矩阵。
修复方法
把连续概率值按照分类阈值转换为离散的0/1类别标签即可,二分类场景默认阈值为0.5:概率≥0.5判定为正类(标签1),<0.5判定为负类(标签0)。
替换原有计算混淆矩阵的代码为如下内容:
import numpy as np from sklearn.metrics import confusion_matrix y_pred = model.predict(seq_array, batch_size=200, verbose=1) y_true = label_array # 概率转二分类标签,同时把二维列向量压平为一维数组,避免维度不匹配报错 y_pred_label = (y_pred >= 0.5).astype(int).flatten() y_true = y_true.flatten() print('Confusion matrix\n- x-axis is true labels.\n- y-axis is predicted labels') confusion_m = confusion_matrix(y_true, y_pred_label) print(confusion_m)
补充说明
- 0.5是通用阈值,你可以根据实际任务对精确率、召回率的要求灵活调整:如果需要降低漏判率就适当调低阈值,如果需要降低误报率就适当调高阈值。
- 代码中加入
.flatten()是因为你当前的y_pred和y_true都是shape为(样本数, 1)的二维列向量,部分sklearn版本对这种格式的标签输入也会抛出维度不匹配错误,压平为一维(样本数,)格式兼容性更好。 - 如果后续做多分类任务,不需要用阈值切分,直接取概率最大的类别下标作为预测标签即可,对应转换代码为
y_pred_label = np.argmax(y_pred, axis=1)。
内容的提问来源于stack exchange,提问作者yusuf hamzah
相关产品推荐
相关产品推荐

