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

单变量LSTM预测5天降雨是否欠拟合?如何优化?

问题诊断

你当前的模型确实存在欠拟合问题,但根源不是单纯的模型容量不足,而是任务配置错配、输入结构错误、数据偏态未处理、训练逻辑不合理四个问题叠加导致的:

  • 任务类型完全错配:你要做的是二分类任务(未来5天是否降雨),但当前用的MSE损失、无激活的单Dense输出是标准回归任务配置,模型从优化目标上就没有在拟合分类边界,损失无法稳定下降是必然结果。
  • LSTM输入维度逻辑错误:第一层的input_shape=(1, look_back)相当于把2个月共1440个小时的时序数据拍平成单个时间步的1440维特征,完全违背LSTM处理时序依赖的输入要求——正确的时序输入形状应为(时间步长, 单步特征数),当前配置下LSTM根本提取不到时序规律,等效于用单层全连接层硬训,自然抓不住降雨的季节特征。
  • 零偏态/类别不平衡问题完全没处理:小时级降雨数据里无雨样本占比通常在80%以上,结合你提到的降雨仅集中在5个月份,实际降雨样本占比可能更低,属于极端类别不平衡。当前配置下模型只要全量输出“无雨”就能拿到很低的MSE,完全没有动力学习降雨相关的特征,这是损失卡在高位的核心原因之一。
  • 训练配置不合理:100万行样本仅训15个epoch、batch size设为4096会导致参数迭代次数严重不足,加上shuffle=False的设置会让模型优先拟合前段数据的规律,难以泛化到全时段;同时你仅用单变量建模,丢掉了温度、气压、湿度、风速这些和降雨强相关的特征,模型能获取的有效信息本身就不足。

另外你提到Prophet、autoarima效果差属于预期内的问题,这类统计时序模型本身适配单变量平滑连续值预测,既处理不了极端不平衡的分类任务,也很难捕捉降雨对应的强非线性气象规律,不用在这类方法上额外耗费精力。

可落地的优化步骤

按优先级从高到低调整即可:

  • 先修正任务配置
    • 标签做二值化处理:未来5天内任意小时出现降雨即标为1,否则标为0,不要用连续降水量值作为训练标签
    • 模型输出层改为1个神经元加sigmoid激活函数,损失函数替换为binary_crossentropy,训练时监控AUC、精确率、召回率指标,不要用MSE作为分类任务的优化目标
    • 针对类别不平衡,在model.fit()中传入class_weight参数,给降雨类设置更高的权重(权重值可按「无雨样本数/降雨样本数」计算),也可以对训练集做随机下采样,丢弃部分无雨样本,避免模型靠全猜多数类拿到虚假的低损失。
  • 修正LSTM输入结构
    • 调整输入形状:如果用单变量降水量建模,input_shape应设为(look_back, 1),即look_back个时间步、每个时间步1个特征;如果加入温度、气压等多变量特征,把最后一维改成对应的特征总数即可。
    • 当前2个月的look_back无法覆盖年度季节规律,不用硬靠拉长窗口让LSTM记长程周期,直接在特征中加入月份、季节的离散标识,效率远高于单纯堆LSTM层。
  • 调整模型和训练配置
    • 不要一开始就堆3层LSTM,先从「1层128神经元LSTM + 1个sigmoid输出Dense」的轻量结构开始试,确认模型能学到有效特征后再考虑加深层数,避免多层LSTM带来的梯度消失问题。
    • batch size降到1024或2048,epoch数提升到30-50,训练时设置shuffle=True(注意只打乱样本顺序,不要打乱单个样本内部的时间步顺序),同时加EarlyStopping回调监控验证集AUC,防止过拟合。
  • 针对性处理零偏态数据
    • 不要直接把原始小时级降水量作为唯一输入,先做特征聚合:比如统计过去1/3/7/15天的累计降水量、降雨天数、平均气压变化率、湿度增幅、温度降幅这类强信号特征,比零散的原始0值更容易让模型学到规律。
    • 衍生二值化特征:比如过去N小时是否有降雨、连续无雨天数这类特征,能帮模型快速捕捉降雨前后的模式,降低LSTM的学习难度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:09:16