使用递归神经网络格式化时间序列数据以进行短期预测

Format time-series data for short term forecasting using Recurrent Neural networks

我想使用递归神经网络 (RNN) 预测日前的功耗。但是,我发现 RNN 所需的数据格式(样本、时间步长、特征)令人困惑。让我用一个例子来解释:

我有 power_dataset.csv on dropbox, which contains power consumption from 5 June to 18 June at 10 minutely rate (144 observations per day). Now, to check the performance of RNN using rnn R 包,我正在按照这些步骤操作

  1. 使用 6 月 5-16 日的数据训练模型 M 用于 6 月 17 日的使用情况
  2. 使用 M 预测 6 月 18 日的使用情况并更新 6 月 6-17 日的使用情况

我对RNN数据格式的理解是:

样本:样本或观测值的数量。

timesteps: 模式重复时的步数。在我的例子中,一天发生 144 次观察,因此每连续 144 次观察构成时间步长。换句话说,它定义了季节性周期。

features: features个数,我这里是一个,即历史天数的消费时间序列

因此,我的脚本如下:

library(rnn)
df <- read.csv("power_dataset.csv")
train <- df[1:2016,] # train set from 5-16 June
test <- df[145:dim(df)[1],] # test set from 6-18 June
# prepare data to train a model
trainX <- train[1:1872,]$power # using only power column now
trainY <- train[1873:dim(train)[1],]$power
# data formatting acc. to rnn as [samples, timesteps, features]
tx <-  array(trainX,dim=c(NROW(trainX),144,1))
ty <-  array(trainY,dim=c(NROW(trainY),144,1))
model <- trainr(X=tx,Y=ty,learningrate = 0.04, hidden_dim = 10, numepochs = 100)

错误输出为:

The sample dimension of X is different from the sample dimension of Y.

错误是由于错误的数据格式造成的。如何正确格式化数据?

几点:

  1. 您需要在输入 X 和输出 Y 的训练数据中具有相同数量的样本才能开始,在上面的实现中您有 1872 个样本XY 的 144 个样本。此外,您的训练数组 tx 包含重复 144 次的相同列,这没有多大意义。

  2. 我们可以考虑通过以下几种方式训练 RNNLSTM 模型: 在下图中,Model1 尝试捕获 10 分钟时间间隔内的重复模式,而 Model2 尝试捕获(前)几天的重复模式。

# Model1
window <- 144
train <- df[1:(13*window),]$power
tx <- t(sapply(1:13, function(x) train[((x-1)*window+1):(x*window)]))
ty <- tx[2:13,]
tx <- tx[-nrow(tx),]
tx <-  array(tx,dim=c(NROW(tx),NCOL(tx),1))
ty <-  array(trainY,dim=c(NROW(ty),NCOL(ty),1))
model <- trainr(X=tx,Y=ty,learningrate = 0.01, hidden_dim = 10, numepochs = 100)
test <- sapply(2:13, function(x) train[((x-1)*window+1):(x*window)])
pred  <- predictr(model,X=array(test,dim=c(NROW(test),NCOL(test),1)))

# Model2
window <- 144
train <- df[1:(13*window),]$power
tx <- sapply(1:12, function(x) train[((x-1)*window+1):(x*window)])
ty <- train[(12*window+1):(13*window)]
tx <-  array(tx,dim=c(NROW(tx),NCOL(tx),1))
ty <-  array(trainY,dim=c(NROW(ty),1,1))
model <- trainr(X=tx,Y=ty,learningrate = 0.01, hidden_dim = 10, numepochs = 100, seq_to_seq_unsync=TRUE)
test <- sapply(2:13, function(x) train[((x-1)*window+1):(x*window)])
pred  <- predictr(model,X=array(test,dim=c(NROW(test),NCOL(test),1)))
  1. 与特征大小相比,您的数据太小,无法训练 RNN 或 LSTM。这就是为什么训练的两个模型都非常非常差且无法使用的原因。您可以尝试收集更多数据并学习模型,然后使用它们进行预测。

足以改变"seq-to-seq-unsync=TRUE" 希望有用。