基于datetime的温度概率分布预测模型准确率低问题排查
核心问题排查方向
- 先查代码低级错误
- 你的网络第一层
Dense(512)没有设置激活函数,这一层仅做线性变换,大幅削弱模型非线性拟合能力,是最直接的效果差原因。 - 你给出的数据集样例里存在重复列名:出现了两个
hour_sin、缺失hour_cos,先核对全量特征列,确认月、小时、星期三类特征的sin/cos值共6个字段全部正确读取,没有列名错位、值匹配错误的问题。 - 核对标签编码逻辑:确认
cat.codes生成的类别编码是0-45连续整数,没有把空值、异常值识别为单独类别,也没有出现编码跳号的问题。
- 你的网络第一层
- 查数据逻辑问题
- 统计训练集、测试集的标签分布:46个类别随机猜测的基准准确率约为2.2%,7%的准确率仅略高于随机猜。如果数据中存在占比超过10%的头部温度类别,说明模型完全没有学到规律,等价于随机输出。
- 核对输入特征范围:虽然sin/cos特征值域固定在[-1,1],但要确认X中没有混入其他值域异常的字段,也没有把标签相关的泄露字段(比如原始未取整的温度值)误放入特征。
- 查训练配置问题
- 你现在用
train_test_split随机打乱拆分时间序列,虽然这种方式会让评估结果虚高、不会直接拉低准确率,但会导致模型学到“未来时间点”的规律,完全不符合时序预测的真实场景,评估结果没有参考价值。 - 检查训练时的输入格式:确认
y_train、y_test是一维numpy数组,不是带列索引的pandas DataFrame,避免维度不匹配导致的训练异常。 - 观察训练过程的loss曲线:如果训练集loss全程不下降,说明学习率设置不合理、或者特征/标签存在错误;如果训练集loss下降但准确率不动,说明模型没有学到有效规律。
- 你现在用
建模优化建议
- 先修复基础代码问题
给第一层全连接层加上ReLU激活,修改为:
修正特征列名错误后,对所有输入特征做标准化处理,用训练集拟合model.add(layers.Dense(512, input_shape=(X_train.shape[1],), activation='relu'))StandardScaler后同步转换训练、测试集,不要用全量数据拟合scaler避免数据泄露。 - 调整数据拆分方式
放弃随机拆分,改用时间顺序拆分:比如用前2.5年的数据做训练集,剩余0.5年数据做测试集,保证训练数据时间全部早于测试数据,得到的评估结果才具备参考性。 - 补充有效特征
你现在仅用时间循环特征,只能学到“某类时间点的平均温度规律”,但温度存在极强的时序自相关性:前1小时、前3小时、前1天、前7天同一时刻的温度、近24小时的温度统计值(均值、最高、最低)对当前温度的影响远大于时间周期特征,缺失这类特征的情况下,模型不可能输出精准的概率分布。 - 调整任务与模型设计
- 温度是有序连续值,普通多分类任务会把46个温度值当成独立平等的类别,浪费了温度的序信息(预测偏差1度和偏差20度的错误程度完全不同)。可以在softmax交叉熵损失基础上加入有序性正则项,或者把任务调整为概率回归(比如预测正态分布的均值和方差),更适配温度的连续属性。
- 当前模型结构对于6维输入来说过于臃肿,容易过拟合,可以调整为128->64->32的三层全连接结构,每层后加0.2-0.3的Dropout层抑制过拟合;训练时加EarlyStopping机制监控验证集loss,patience设为5,避免无效训练。
- 更换评估指标:46分类任务的Top-1准确率参考价值很低,可以把预测结果映射回温度值后计算平均绝对误差(MAE),同时评估预测概率分布和真实经验分布的相似度,更能反映模型效果。
- 低成本基线方案
如果你的需求只是拿到给定时间下的温度经验概率,不需要复杂时序依赖,直接按「月份+小时+星期几」维度分组统计各温度值的出现频率,得到的经验分布效果大概率优于当前调优不当的神经网络,且不存在训练收敛问题。
内容的提问来源于stack exchange,提问作者Zara
相关产品推荐
相关产品推荐

