Keras电影喜好分类模型准确率上限低、波动大优化咨询
问题成因
- 数据划分逻辑错误:代码中训练集取数据集前75%,验证集取数据集从25%位置到末尾的部分,存在50%的重叠数据,训练集和验证集数据不独立,直接导致验证指标剧烈波动,准确率无法有效评估。
- 特征编码不合理:对导演、演员、体裁、出品公司等无序类别特征使用
LabelEncoder编码,会引入不存在的顺序关系(如编码为2的类别会被模型认为比编码为1的类别“更大”),误导模型学习;此外体裁为多标签属性,直接整体编码完全丢失了多体裁的特征信息。 - 特征未做归一化:数值特征(时长、年份、投票数、电影评分)量级差异极大,比如投票数可达十万级,年份仅为四位数字,量级差异会导致模型训练过程不稳定,收敛效果差。
- 数据集规模过小:仅900条样本还要划分三类预测,样本量不足以支撑模型学习有效规律,同时很容易出现过拟合。
- 模型结构过于复杂:仅900条样本使用4层全连接网络,总参数量过大,远超过小数据集的拟合需求,极易出现过拟合,导致验证集准确率波动大、上限低。
- 训练参数不合理:batch size设置为64,训练集仅600余条样本时单个epoch仅更新10次左右,更新步长太少会导致训练过程震荡;默认优化器学习率偏高也会加剧训练不稳定。
优化方案
- 修正数据划分逻辑:将验证集调整为数据集从75%位置到末尾的部分,确保训练集和验证集无重叠:
x_val = dataset[math.floor(l * 0.75):] y_val = labels[math.floor(l * 0.75):]
- 优化特征编码:对无序类别特征改用
OneHotEncoder编码,样本量允许的情况下也可以使用嵌入层处理;拆分体裁字段为多标签特征,每个体裁单独作为一个二值特征输入。 - 特征归一化:对所有数值特征使用
StandardScaler或者MinMaxScaler进行缩放,统一特征量级。 - 优化模型结构:大幅简化网络结构,小样本下仅保留1-2层全连接层即可,单层神经元数量控制在16-32之间;加入
Dropout层、L2正则化策略抑制过拟合:
from tensorflow.keras import regularizers model = models.Sequential() model.add(layers.Dense(32, activation='relu', input_dim=11, kernel_regularizer=regularizers.l2(0.001))) model.add(layers.Dropout(0.3)) model.add(layers.Dense(16, activation='relu', kernel_regularizer=regularizers.l2(0.001))) model.add(layers.Dropout(0.2)) model.add(layers.Dense(3, activation='softmax'))
- 调整训练参数:调小batch size到8-16,增加单epoch的更新次数稳定训练过程;降低优化器学习率,可改用Adam优化器设置学习率为1e-4;加入早停回调,监控验证集损失,停止下降时提前终止训练避免过拟合。
- 优化数据利用逻辑:使用K折交叉验证替代简单的训练验证划分,小样本下可以更充分利用数据,同时得到更稳定的评估结果;如果条件允许可补充更多样本提升模型上限。


内容的提问来源于stack exchange,提问作者WholesomeGhost
相关产品推荐
相关产品推荐

