使用递归神经网络格式化时间序列数据以进行短期预测
Posted
技术标签:
【中文标题】使用递归神经网络格式化时间序列数据以进行短期预测【英文标题】:Format time-series data for short term forecasting using Recurrent Neural networks 【发布时间】:2017-07-14 21:03:00 【问题描述】:我想使用循环神经网络 (RNN) 预测日前的功耗。但是,我发现 RNN 所需的数据格式(样本、时间步长、特征)令人困惑。让我用一个例子来解释:
我在 Dropbox 上有 power_dataset.csv,其中包含 6 月 5 日至 6 月 18 日期间每 10 分钟的耗电量(每天 144 次观察)。现在,要使用 rnn R
包检查 RNN 的性能,我按照以下步骤操作
-
使用 6 月 5 日至 16 日的数据训练模型
M
供 6 月 17 日使用
使用 M
预测 6 月 18 日的使用情况并更新 6 月 6 日至 17 日的使用情况
我对RNN数据格式的理解是:
样本数:样本数或观察数。
时间步数:模式重复时的步数。就我而言,一天发生 144 次观察,因此每连续 144 次观察构成时间步长。换句话说,它定义了季节性周期。
特征:特征数,在我的例子中是一个,即历史天数的消费时间序列
因此,我的脚本如下:
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】:改变“seq-to-seq-unsync=TRUE”就足够了 希望有用。
【讨论】:
【参考方案2】:几点:
您需要在训练数据中输入X
和输出Y
具有相同的样本数,在上面的实现中,X
有 1872 个样本,而X
有 144 个样本Y
。此外,您的训练数组 tx
包含重复 144 次的同一列,这没有多大意义。
我们可以考虑通过以下几种方式训练RNN
或LSTM
模型:
在下图中,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)))
-
与特征大小相比,您的数据太小而无法训练 RNN 或 LSTM。这就是为什么训练的两个模型都非常差且无法使用的原因。您可以尝试收集更多数据并学习模型,然后将其用于预测。
【讨论】:
1.接受我在格式化tx
时的错误 2. 同意您的两个模型 3. 同意模型 1 的数据较少,但模型 #2 并非如此。模型 2 出现问题,因为无论时代错误如何都保持不变numepochs
和 hidden_dim
的变化。如本 (***.com/q/41879049/3317829) 问题的 Update #1 中所述,我之前尝试过 Model 2。
如果你改变学习率(让它变小),你会发现模型误差在 epochs 中的下降非常小。我认为您的数据很嘈杂,因此您可能也会考虑删除一些油点作为预处理步骤。最后,即使对于模型 2,您也只有 144 个样本和 12 个时间步长,这可能还不够,请参阅库手册中的示例 rnn,它有 8000 个样本,只有 8 个时间步长,2 个特征,即使 Y~X 之间的关系很简单。
我增加了数据并使用了参数,但变化很微妙。我也认为数据很嘈杂!以上是关于使用递归神经网络格式化时间序列数据以进行短期预测的主要内容,如果未能解决你的问题,请参考以下文章
多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码