Keras LSTM二分类类别1指标全零、预测全为负类问题求助
问题根因
- 核心错误出在预测结果的类别转换逻辑:你的模型最后一层是单神经元+sigmoid激活,输出形状为
(样本数, 1),每个样本仅返回1个0~1区间的概率值,代表样本属于类别1(垃圾邮件)的概率。你生成分类报告时调用np.argmax(result, axis=1),对长度为1的向量取最大值索引,返回值永远是0,相当于强制把所有样本判定为类别0,这就是无论数据集怎么调整、模型训练指标多好,预测结果全是负类的直接原因。 - 你观察到的现象完全可以印证这个问题:
- 原始不平衡测试集共900个样本,其中类别0共754个,全预测为0时准确率恰好是754/900≈0.84,和你给出的测试准确率完全一致
- 平衡后的测试集共300个样本,其中类别0共142个,全预测为0时准确率恰好是142/300≈0.47,和你给出的平衡后测试准确率完全一致
- AUC能达到0.99以上,说明模型输出的概率排序能力正常,模型本身已经学到了有效特征,和类别不平衡、模型结构缺陷没有核心关系。
修复方案
- 替换错误的类别转换代码,单输出sigmoid场景不需要用argmax,直接通过分类阈值把概率转为类别标签即可,默认阈值取0.5:
result = model.predict(x_test) # 概率大于0.5判定为垃圾邮件,小于等于0.5判定为正常邮件,拉平为一维数组匹配标签格式 y_pred = (result > 0.5).astype(int).flatten() print(classification_report(y_test, y_pred, zero_division=0))
- (可选优化)如果修复后类别1的召回、精度表现不符合预期,再针对性调整,不需要盲目下采样删除多数类样本:
- 训练时在
model.fit()中传入class_weight={0: 1, 1: 2500/499},提高少数类(垃圾邮件)的损失权重,缓解类别不平衡的影响 - 模型选择和早停不要以准确率为核心依据,优先参考验证集的F1值、召回率、AUC指标
- 若0.5阈值下效果不佳,可以基于验证集的ROC曲线选择最优分类阈值,不需要固定使用0.5。
- 训练时在
内容的提问来源于stack exchange,提问作者Walid Torfa
相关产品推荐
相关产品推荐

