如何让 LSTM 提前预测多个时间步长?

机器算法验证 时间序列 lstm 循环神经网络
2022-03-14 06:51:37

我正在尝试使用 LSTM 进行时间序列预测。数据每分钟流一次,但我想提前一个小时预测。我可以想到两种方法来解决这个问题:

  1. 将数据压缩为每小时数据,将每 60 分钟时间段的平均值作为一个数据点。
  2. 对于每个(X, y)训练数据对,让X是从t - 120到的时间序列t - 60,让是从y的时间序列强制 LSTM 提前 60 个时间步进行预测,并将其作为预测。t - 60ty[-1]

有没有解决这个问题的最佳实践?

2个回答

有不同的方法

  • 递归策略

    • 一对多模型

      prediction(t+1) = model(obs(t-1), obs(t-2), ..., obs(t-n))
      prediction(t+2) = model(prediction(t+1), obs(t-1), ..., obs(t-n)) 
      
  • 直接战略

    • 多个多对一模型

      prediction(t+1) = model1(obs(t-1), obs(t-2), ..., obs(t-n))
      prediction(t+2) = model2(obs(t-2), obs(t-3), ..., obs(t-n))`
      
  • 多输出策略

    • 一对多模型

      prediction(t+1), prediction(t+2) = model(obs(t-1), obs(t-2), ..., obs(t-n))`
      
  • 混合策略

    • 结合以上两种或多种策略

参考:多步时间序列预测

来自https://machinelearningmastery.com/multi-step-time-series-forecasting-long-short-term-memory-networks-python/

train = [[t-120,t-199...t,t+1...t+60],[...],[...]]

# fit an LSTM network to training data
def fit_lstm(train, n_lag, n_seq, n_batch, nb_epoch, n_neurons):
    # reshape training into [samples, timesteps, features]
    X, y = train[:, 0:n_lag], train[:, n_lag:]
    X = X.reshape(X.shape[0], 1, X.shape[1])
    # design network
    model = Sequential()
    model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(y.shape[1]))
    model.compile(loss='mean_squared_error', optimizer='adam')
    # fit network
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=n_batch, verbose=0, shuffle=False)
        model.reset_states()
    return model