LSTM / GRU RNN,用于使用keras和张量流进行时间序列分析

时间:2019-01-23 22:57:31

标签: r tensorflow keras time-series

我正在尝试使用Rkeras包中的tensorflow中的LSTM和GRU神经元的递归神经网络实现对外源变量进行时间序列预测。

数据集如下所示:

Date | Y | X1 | X2 | X3 | ... | X19 |
-----|---|----|----|----|-----|-----|

其中Y是实值输出,而X1...X19是外生预测变量。

数据集大约有1200个数据点(时间= 0至时间= 1199)。我想在第一批1000个数据点(时间= 0到时间= 999)上训练神经网络,然后使用单步提前预测重新估计来预测剩余的数据点。即预测Y'从时间= 1000到时间= 1199,但是每次我计算一个新数据点时都会重新估计权重。

培训和测试过程如下:

  1. 使用所有历史Y值以及所有历史外生变量值对从时间= 0到时间= 999的1000个观测值进行分批训练NN。在1000个时间步的批量训练情节之后,仅更新一次权重。
  2. 根据训练序列的权重以及时间= 1000时的实际外生预测变量,预测时间= 1000时的Y'。将时间= 1000时的实际Y与时间为Y'的情况进行比较时间= 1000,并根据损失更新权重。
  3. 使用更新的权重和时间= 1001的实际外生预测变量来预测时间= 1001的Y'。将时间= 1001的实际Y与时间= 1001的Y'进行比较,并更新权重基于损失。
  4. 重复。

我已经研究了以下示例,但是它们似乎都不满足我的要求,因为它们不使用外生变量,尝试预测外生变量(我将不需要预测外生变量,并假设它们每天给出),或者不要将批处理训练块与单步预测和重新估计结合起来。

https://blogs.rstudio.com/tensorflow/posts/2017-12-20-time-series-forecasting-with-recurrent-neural-networks/

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个输入(YX1...X19)的单个LSTM或GRU神经元,它按顺序处理1000个训练观察值中的每个,然后在处理之后更新权重所有这1000个训练观察结果中。

最后,在测试阶段,我希望神经网络成为具有20个输入(YX1...X19)的单个LSTM或GRU神经元,并在每次测试观察后更新权重。我认为这不符合我的建议结构。

任何帮助将不胜感激。谢谢!

0 个答案:

没有答案