多元 LSTM 模型的预测缺乏变异性

问题描述 投票:0回答:1

我一直在研究用于时间序列预测的多元 LSTM 模型,但遇到了一个问题,即预测输出没有表现出足够的可变性或“起伏”。预测往往过于平滑或平坦,尤其是在第一个预测点之后。以下是我的模型架构的简要概述:

model.add(tf.keras.layers.InputLayer(input_shape=(60,25)))
model.add(LSTM(256,return_sequences=True))
model.add(tf.keras.layers.LayerNormalization())
model.add(Dropout(0.2))
model.add(LSTM(256,return_sequences=True))
model.add(tf.keras.layers.LayerNormalization())
model.add(Dropout(0.2))
model.add(LSTM(256,return_sequences=False))
model.add(tf.keras.layers.LayerNormalization())
model.add(Dropout(0.2))
model.add(Dense(30 * 3,activation=tf.keras.layers.LeakyReLU(alpha=0.1))
model.add(Reshape([30, 3]))

我想要实现的是让输出层预测 90 个点,这将进一步重塑为三个变量。关于数据:

  • 670 000 行,25 个特征
  • 使用过去的 60 个点 - 针对 3 个目标特征预测未来 30 个点
  • 首先使用滑动窗口将数据集分为训练、验证和测试(70:20:10)
  • 每个滑动窗口移位一行 - 移位 1
  • 使用 StandardScaler 进行缩放,因为我想在之后的结果中检测到数据中的一些异常情况
  • 可以看到以下一项功能的预测值与真实值的图表:

我的问题是:我是否正确处理了 LSTM 的最后一层?我的目标是一次性预测 3 个特征的 30 个值。

我尝试过的:

  • 超参数调优包含
    • 层数
    • 优化器(RMSprod、Adam、SGD)
    • LSTM/GRU 中的单元数量
    • 辍学率
    • 学习率(0.01,0.001,0.005)
    • 滑动窗口的批量大小(64、128、256)
  • 前 4 层热身
  • 使用其他缩放方法(Quantile、MinMaxScaler、PowerTransformer)

LSTM 文档链接 https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM

tensorflow lstm forecasting multivariate-time-series gru
1个回答
0
投票

输出激活功能: 首先,对我来说最引人注目的一个(@DrSnoopy 的评论中也已经提到) - 确保输出激活函数适合您的回归任务。由于您要预测连续值,因此使用线性激活通常是一个不错的选择。

model.add(Dense(30 * 3, activation='linear'))

损失函数: 确认您的损失函数适合回归。均方误差 (MSE) 通常用于回归任务。你没有提到你正在使用什么,但这确实是一个重要的选择。

model.compile(loss='mean_squared_error', optimizer=optimizer)

标准化/缩放: 你说你正在尝试进行一些正常化。 a) 确保在训练和推理过程中一致应用缩放。 b) 标准化过程应基于仅根据训练集计算的统计数据。这绝对是您应该始终执行的操作,因为它很容易执行,并且可以帮助您的模型更快、更稳定地收敛。

模型复杂度: 考虑您的模型是否足够复杂以捕获数据中的基础模式。如果预测过于平滑,则可能表明模型无法捕获数据中的变异性。 #添加图层。

或者..

序列长度: 试验输入序列的长度(在您的例子中为 60)。您可以尝试减少它,看看它是否对模型捕获模式的能力有影响(同时保持容量/单位数量不变)。

© www.soinside.com 2019 - 2024. All rights reserved.