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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:27:13