首页 文章

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

提问于
浏览
2

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

我在Dropbox上有power_dataset.csv,其中包含6月5日至6月18日的10分钟费率(每天144次观察) . 现在,为了使用rnn R 包检查RNN的性能,我遵循这些步骤

  • 使用6月17日至6月17日的数据训练模型 M

  • 使用 M 预测6月18日的使用情况,并在6月6日至17日更新使用情况

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

Samples: 样本或观察数量 .

timesteps: 模式重复的步骤数 . 在我的情况下,144个观测值在一天内发生,因此每个连续的144个观测值构成时间步长 . 换句话说,它定义了季节性时期 .

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 回答

  • 2

    几点:

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

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

    enter image description here

    # 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 . 这就是为什么训练的模型都非常差并且无法使用的原因 . 您可以尝试收集更多数据并学习模型,然后将其用于预测 .

相关问题