TensorFlow神经网络验证集准确率高但测试及未见数据表现差如何优化
问题排查与优化方案
核心遗漏问题
- 时序数据随机划分导致测试准确率虚高:你的数据集包含DAY、WEEK_DAY、HOUR时间特征,属于时序场景,你使用
train_test_split随机划分的方式会引入数据泄露(训练集包含未来时间的数据),导致划分得到的测试集准确率和真实业务场景的未见数据表现完全脱节。 - 预处理逻辑不一致:
- 分类特征词表构造违规:你构造分类特征的vocabulary时使用了全量
deep_df的唯一值,包含了测试集的信息,会导致划分出的测试集效果虚高,真实未见数据中出现全量数据集里没有的分类值时,模型无法正确处理。 - 预测数据未走统一预处理管道:
test_predict不会自动执行和训练集一致的预处理逻辑,你需要确保预测数据和训练数据走完全相同的特征构造、归一化流程,不能直接将原始DataFrame传入model.predict。
- 分类特征词表构造违规:你构造分类特征的vocabulary时使用了全量
- 评价指标选择错误:你的测试集准确率0.89和所有预测结果都低于0.5的表现高度匹配类别不平衡场景,即训练集中install=1的正样本占比极低,模型只要全预测为负就能拿到很高的准确率,此时accuracy指标完全没有参考价值。
优化建议
数据侧调整
- 把数据集划分方式改为按时间切分:取更早时间段的数据作为训练集,较晚时间段的数据作为验证/测试集,完全模拟真实未见数据的分布。
- 修正预处理逻辑:
- 所有分类特征的vocabulary只取训练集的唯一值,禁止使用测试集或全量数据集的统计信息。
- 封装统一的预处理函数,训练、验证、测试、预测数据全部走同一套预处理逻辑,确保数值归一化、分桶、编码逻辑完全一致。
- 解决类别不平衡问题:
- 统计训练集正负样本比例,通过上采样正样本、下采样负样本,或者在损失函数中添加类权重(
class_weight参数)缓解不平衡影响。 - 更换评价指标,使用AUC、F1值、Precision、Recall替代accuracy评估模型效果。
- 统计训练集正负样本比例,通过上采样正样本、下采样负样本,或者在损失函数中添加类权重(
模型侧调整
- 调整分类阈值:根据验证集的Precision、Recall表现,将分类阈值从默认的0.5下调到匹配你的输出分布的数值,比如0.2,即可得到合理的分类结果。
- 优化训练配置:可以将优化器更换为自适应优化器(如Adam),调整学习率,适当训练更多轮次,同时可以根据验证集表现添加早停(EarlyStopping)策略防止过拟合。
内容的提问来源于stack exchange,提问作者Ibrahim
相关产品推荐
相关产品推荐

