You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras分类模型总是预测样本数最高的类别,准确率仅30%如何解决?

问题原因分析
  • 核心原因:数据集严重类别不平衡
    从统计结果可以看到,类别4样本量达472,占总样本比例约32.7%,样本量最少的类别4096仅1个样本。模型只需全部预测为类别4就能达到接近30%的准确率,此时交叉熵损失已经处于较低的局部最优值,模型不会继续学习少数类的区分特征。
  • 代码配置bug
    代码中自定义了带学习率、动量参数的SGD优化器变量sgd,但在model.compile时传入的是字符串'sgd',自定义的优化器参数完全未生效,使用的是Keras默认SGD配置(默认学习率仅0.01),模型收敛速度慢,更容易卡在局部最优。
  • 训练配置不合理
    仅设置10轮训练,轮次过少,模型还未充分学习数据特征就停止训练;同时较小的batch size(batch_size=2)也会加剧训练过程的波动,不利于稳定收敛。
  • 特征预处理缺失(大概率)
    代码中未体现输入特征的归一化/标准化步骤,若不同特征尺度差异过大,会进一步降低模型的学习效率。
解决方案

数据层面调整

  • 做样本重采样:可以对少数类做过采样(如SMOTE算法、对少数类样本加微小噪声生成新样本),或对多数类做欠采样(随机删除部分多数类样本),也可以两种方法结合使用,平衡各类的样本占比。
  • 补充少数类样本:如果有条件可以进一步采集少数类的标注数据,从根源缓解不平衡问题。

损失函数调整

  • 使用加权交叉熵损失:给每个类别设置损失权重,权重与该类的样本量成反比,例如权重计算公式为权重 = 总样本数 / (类别数 * 该类样本数),增大少数类分错时的惩罚力度,倒逼模型学习少数类特征。
  • 替换为Focal Loss:该损失会自动降低易分类样本(多数类)的损失权重,让模型更关注难分类的少数类样本,非常适合类别不平衡场景。

训练与代码调整

  • 修正优化器配置bug:将model.compile中的optimizer='sgd'改为optimizer=sgd,让自定义的优化器参数生效。
  • 调整训练参数:将训练轮次提升到50~100轮,同时加入EarlyStopping回调,监控验证集损失,防止过拟合;可以适当调大batch_size到8或16,提升训练稳定性。
  • 补充特征预处理:对输入的train_x和test_x做标准化或归一化处理,将所有特征缩放到相同尺度,加快模型收敛速度。
  • 调整评估指标:类别不平衡场景下准确率无法反映真实模型效果,换用F1值、各类召回率、混淆矩阵、AUC等指标做评估。
  • 适当扩容模型:如果调整后效果仍不理想,可以适当增大隐藏层的神经元数量,或增加隐藏层层数,提升模型的特征拟合能力。

内容的提问来源于stack exchange,提问作者404notfound

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:27:03