我正在尝试使用R
和keras
包中的tensorflow
中的LSTM和GRU神经元的递归神经网络实现对外源变量进行时间序列预测。
数据集如下所示:
Date | Y | X1 | X2 | X3 | ... | X19 |
-----|---|----|----|----|-----|-----|
其中Y
是实值输出,而X1...X19
是外生预测变量。
数据集大约有1200个数据点(时间= 0至时间= 1199)。我想在第一批1000个数据点(时间= 0到时间= 999)上训练神经网络,然后使用单步提前预测重新估计来预测剩余的数据点。即预测Y'
从时间= 1000到时间= 1199,但是每次我计算一个新数据点时都会重新估计权重。
培训和测试过程如下:
Y
值以及所有历史外生变量值对从时间= 0到时间= 999的1000个观测值进行分批训练NN。在1000个时间步的批量训练情节之后,仅更新一次权重。Y'
。将时间= 1000时的实际Y
与时间为Y'
的情况进行比较时间= 1000,并根据损失更新权重。Y'
。将时间= 1001的实际Y
与时间= 1001的Y'
进行比较,并更新权重基于损失。我已经研究了以下示例,但是它们似乎都不满足我的要求,因为它们不使用外生变量,尝试预测外生变量(我将不需要预测外生变量,并假设它们每天给出),或者不要将批处理训练块与单步预测和重新估计结合起来。
https://blogs.rstudio.com/tensorflow/posts/2018-06-25-sunspots-lstm/
https://blogs.rstudio.com/tensorflow/posts/2018-01-11-keras-customer-churn/
我最初的想法是尝试如下操作: 到目前为止,我已经尝试过:
dim(data)
[1] 1128 20
training_pcg = 0.7
test_pcg = 1 - training_pcg
train_data = data[1:floor(training_pcg * nrow(data) - 1),]
test_data = data[floor(training_pcg * nrow(data)):nrow(data),]
mean <- apply(train_data, 2, mean)
std <- apply(train_data, 2, sd)
# scale only training data, then scale each test example as it is received
# by the network (i.e. streaming / on-line normalization)
train_data = scale(train_data, center = mean, scale = std)
model = keras_model_sequential() %>%
layer_flatten(input_shape = c(1, dim(data)[-1])) %>%
layer_dense(units = nrow(train_data), activation = "relu") %>%
layer_dense(units = 1)
model %>% compile(
optimizer = optimizer_rmsprop(),
loss = "mae"
)
但我担心这并不完全正确。
我希望神经网络是具有20个输入(Y
和X1...X19
)的单个LSTM或GRU神经元,它按顺序处理1000个训练观察值中的每个,然后在处理之后更新权重所有这1000个训练观察结果中。
最后,在测试阶段,我希望神经网络成为具有20个输入(Y
和X1...X19
)的单个LSTM或GRU神经元,并在每次测试观察后更新权重。我认为这不符合我的建议结构。
任何帮助将不胜感激。谢谢!