我正在使用 keras LSTM 进行时间序列预测。这是一个回归问题,我想预测接下来的 5 个值。数据来自传感器,如下所示,其中 x 轴是采样时间,ordenates 轴是要预测的值:
为了对此提供更好的解释,让我们想象一下实际时刻由红线标记,并且我想预测下一个值(绿色箭头),因此在这种情况下,我可以预期在标记的值之后出现大幅下降红色,长期稳定:
换句话说,我想预测数值大幅下降的情况,例如下图中红色标记的情况,这样我就可以反击这种大幅下降:
到现在为止,我已经能够进行单步预测了。当我进行训练+预测时,结果非常好(蓝色是实际值,橙色是训练集的预测,绿色是验证集的预测):
为了提供 LSTM,我使用以下函数:
# convert an array of values into a dataset matrix valid for keras LSTM format
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
我使用的 LSTM 网络如下所示:
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
其中look_back是预测所基于的值窗口(5个值)。由于我的输出层是一个,我得出结论,这是一个单步预测,因此如果我实时使用它,我将只确定地预测下一个值。问题是我想一次预测多个值。最初,我使用像this这样的递归预测。有了它,我得到了以下预测,其中蓝色是窗口值,橙色是预测值:
我的问题是:
如何从单步转为多步?我想我需要改变密集输出层的大小?我还需要更改 LSTM 输入数据的格式吗?
是的,你说得对。不,也不必更改输入数据。
5 个值的多步预测是否比 5 个值的单步预测更好?
更好地定义。如果你所说的更好是指w.r.t.准确度,那么 5 个单步预测可能会比 5 个步预测更准确,因为单步预测将考虑更近期的历史值(您案例中的
look_back
值)。一般来说,较长的预测比较短的预测更难,因为在长期预测中,当您尝试进一步预测未来的未来值时,误差往往会累积。
最后但并非最不重要的一点是,LSTM 是预测这种大幅下降的最佳方法吗?
这很大程度上取决于您的数据,只有通过实际评估不同的模型,您才能回答这个问题。你可以尝试: