LSTM与RNN公交延误预测精度对比及最优RMSE获取方法
LSTM与RNN公交到站时间预测系统开发问题及解决方案
问题背景
当前开发基于LSTM、SimpleRNN的公交到站时间预测系统,核心预测目标为数据集中delay_in_min(公交延误分钟数)字段,用于对比两类模型的预测效果,开发过程中遇到两类技术问题。
问题1:模型训练效果不达预期,验证集指标波动无稳定下降
已知训练配置
- 数据集参数:预处理后特征维度
X.shape = (315, 5, 21),标签维度y.shape = (315,),按200条训练集、50条验证集、65条测试集拆分;标签真实值仅分布在0、5、10三个离散值上 - 模型结构:LSTM、SimpleRNN采用完全一致的结构,即2层256单元的循环层搭配单输出Dense层
- 训练参数:损失函数为
MeanSquaredError,优化器为学习率0.0001的Adam,评估指标为RootMeanSquaredError;配置ModelCheckpoint回调保存验证集效果最优的模型,总训练轮次设置为1000轮 - 异常表现:训练得到的最低RMSE仅为2.4580,训练到一定阶段后1000轮内指标无持续提升,部分预测值与真实值偏差较大;调整网络层单元数等参数时无法确定合理调整方向,训练日志显示后期验证集RMSE波动明显,无稳定下降趋势
对应解决方案
- 修正任务类型匹配度:标签为0/5/10三个离散值,本质是三分类任务而非回归任务,当前用MSE做损失、单神经元Dense输出做回归是适配性错误,也是效果差的核心原因。需将输出层改为3神经元+softmax激活,损失函数替换为
SparseCategoricalCrossentropy(标签未做one-hot编码的前提下),可将分类结果映射回0/5/10数值后计算RMSE,用于跨模型效果对比。 - 下调模型规模抑制过拟合:总样本量仅315条,2层256单元的循环层参数量远大于样本承载能力,是后期验证集波动大的核心原因。建议将循环层单元数下调至32/64量级,同时在循环层后加入Dropout层(丢弃率0.2-0.3),或设置循环层
recurrent_dropout参数为0.2,降低过拟合风险。 - 优化训练回调配置:1000轮训练轮次过高,建议加入
EarlyStopping回调,监控验证集指标,设置patience为15-20,即连续20轮验证集指标无提升就停止训练,避免无效训练和过拟合;当前学习率0.0001对于小样本训练偏保守,可上调至0.001,同时加入ReduceLROnPlateau回调,验证集指标停滞时自动下调学习率。 - 校验标签分布:检查315条样本中0/5/10三类标签的占比,如果存在某类样本占比过低的情况,需要设置类别权重或做针对性数据增强,避免模型偏向多数类。
问题2:读取ModelCheckpoint保存的最优模型对应RMSE指标
需求说明
ModelCheckpoint回调配置为逐轮对比验证集指标、保存效果最优的模型至/model1路径,需要获取该最优模型对应的RMSE值,用于量化对比LSTM与RNN的预测精度。
对应解决方案
两种方法可直接落地,无需额外依赖:
- 方法1:从训练历史记录中直接提取
模型训练返回的history对象会记录每一轮的训练、验证集指标,直接遍历验证集RMSE序列取最小值,就是保存的最优模型对应的RMSE,参考代码:import numpy as np # 模型训练时接收history对象:history = model.fit(...) val_rmse_seq = history.history['val_root_mean_squared_error'] best_rmse = np.min(val_rmse_seq) best_epoch = np.argmin(val_rmse_seq) + 1 # 轮次计数从1开始 print(f"最优验证集RMSE:{best_rmse:.4f},对应训练轮次:第{best_epoch}轮") - 方法2:加载保存的模型后在验证集上重算
如果训练记录已丢失,直接加载/model1路径下的最优模型,用训练时拆分的同源验证集做一次评估,得到的结果就是该模型的真实RMSE,参考代码:import tensorflow as tf # 加载保存的最优模型 best_model = tf.keras.models.load_model('/model1') # 传入训练时使用的验证集特征X_val、标签y_val评估 val_loss, val_rmse = best_model.evaluate(X_val, y_val, verbose=0) print(f"最优模型验证集RMSE:{val_rmse:.4f}")注意:该方法需保证评估用的验证集和模型训练时的验证集完全一致,结果才会和训练时监控的最优指标匹配。
内容的提问来源于stack exchange,提问作者NOOR SYAFIKAH BINTI ABDUL RAHI
相关产品推荐
相关产品推荐

