我不熟悉使用LSTM进行时间序列预测。 我想预测未来的来电到达,我的数据有19个解释变量和一个因变量(来电到达)。一天包含30个观察结果;一周包括180次观察。
我用数值替换了标称变量,将数据归一化并将其分为训练和测试(请忽略1的* 180;我想用for循环(对于52中的i)替换1的后面)预测52次180次观察(一周))
data_LSTM_matrix <- data.matrix(data_LSTM)
train_data <- data_LSTM_matrix[1:(21090+(1*180)),]
mean <- apply(train_data, 2, mean)
std <- apply(train_data, 2, sd)
data_normalized <- scale(data_LSTM_matrix, center = mean, scale = std)
train_y<-as.numeric(data_normalized[1:(21090+(1*180)),20])
train_x<-as.matrix(data_normalized[1:(21090+(1*180)),c(1:19)])
test_y<-as.numeric(data_normalized[(21631+(1*180)):(21631+((1+1)*180)),20])
test_x<-as.matrix(data_normalized[(21631+(1*180)):(21631+((1+1)*180)),c(1:19)])
然后我使用了keras的timeseries_generator()。如前所述,我想预测180个半小时间隔,即一周:
train_data_gen<-timeseries_generator(train_x,train_y,length=180, sampling_rate=1, stride=1, batch_size=30)
test_data_gen<-timeseries_generator(test_x,test_y,length=180, sampling_rate=1, stride=1, batch_size=180)
我的模型如下:
model <- keras_model_sequential() %>%
layer_lstm(units = 128, dropout = 0.4, recurrent_dropout = 0.4,
return_sequences = TRUE,
input_shape = c(180,19)) %>%
layer_dense(units = 1)
model %>% compile(
optimizer = optimizer_rmsprop(),
loss = "mae"
)
history <- model %>% fit_generator(
train_data_gen,
epochs = 30,
steps_per_epoch=5,
verbose=2
)
我的预测是这样生成的:
testpredict<-predict_generator(model, test_data_gen, steps=1)
但是,我的预测确实很糟糕(在反转归一化之后),并且其形状为[1,1:180,1];我想知道它是否还能预测呼叫的到来。
这些是我的问题: 1.我的timeseries_generators()是否正确定义?我想知道我是否真的必须在长度参数中输入180。是否只考虑180个过去的时间步长,而不考虑整个训练集? 2.输出的形状([1,1:180,1])是否正确?我希望得到一个向量。