代码整理自 《Hands On Machine Learning with sklearn,Keras and TensorFlow》Chapter 15: Processing Sequences Using RNNs and CNNs。

@[toc]

1.生成模拟数据



import



模拟数据大致模样如下图所示:




VAR python时间序列预测 时间序列预测代码_VAR python时间序列预测


2.朴素预测方法作为基准预测方法

预测结果约为 mse=0.019979032。


####朴素预测方法(naive forecast)作为预测效果比较


3.预测未来的1个值

3.1 TensorFlow线性回归预测

预测结果约为 mse=0.003~0.004,比基准预测效果好得多。


#### linear regression


3.2 SimpleRNN

预测结果约为 mse=0.011左右, 只用一个RNN神经元的一层RNN,准确率不如LR。


#### simple RNN


3.3 多层 SimpleRNN

预测结果约为 mse=0.0037 。


#### deep rnn #1


3.4 多层 LSTM

预测结果约为 mse=0.002 左右,要好于多层SimpleRNN


#### deep RNN:LSTM


3.5 多层GRU

预测结果约为 mse=0.002 左右,和多层LSTM差不多。


# deep RNN:GRU


4. 预测未来的10个值

亦即 Forecasting Several Time Steps Ahead。下述代码的预测误差mse比上述方法预测mse大,是因为预测未来的多个点是更困难的任务。

4.1 10次预测10个值:Sequence-to-Vector RNN

基本思路是要预测第10个点,先用模型预测未来的第1个点;然后未来的第1个点的预测值当做已知的,预测第2个点,以此类推......

下述代码中,预测结果取决于训练好的单个模型的准确度。


#### Forecasting Several Time Steps Ahead:forecast a point one time


4.2 1次预测10个值:Sequence-to-Vector RNN

将RNN的输出改为10,一次预测未来10个点,此时需要重构训练集的构造:label变为10维。

下述代码,结果约为 mse=0.0188 左右。


#### Forecasting Several Time Steps Ahead:forecast 10 points one time,sequence-to-vector model


4.3 1次预测10个值:Sequence-to-Sequence RNN

【自己的理解,供参考】6.2中损失函数计算时候最用了RNN最后输出的向量和标签来计算梯度优化模型,还可以更进一步。每一个time step都给模型一个标签,这样可以更充分的优化模型,进一步提高模型的准确率。此时需要重构标签:在6.2标签的基础上添加time step维度。

下述代码中,last_time_step_mse=0.0067 左右,要比4.2要好。


#### Forecasting Several Time Steps Ahead:forecast 10 points one time,sequence-to-sequece model


4.4 1次预测10个值:1-d-CNN+Sequence-to-Sequence RNN

在4.3的模型开头加上一层1-d cnn,会提高准确率。

需要注意的是:输入维度为[7000,50,1],经过下面代码中的CNN之后,输出的维度为[7000,24,20](因为kernel_size=4,stride=2),这个维度再经过后面的两层SimpleRNN,模型的输出维度为[7000,24,10],因此此时需要将原来的label(尺寸为[7000,50,10]),进行截取操作,由Ytrain[:, 3::2]之后,得到的维度就是[7000,24,10]。Y_valid同理。

下述代码中,last_time_step_mse=0.0039左右。


#### 1d-CNN+RNN


5. 总结

在本实验中:

(1)预测未来1个值的时候:LSTM和GRU预测准确度最高,线性回归训练速度比二者快一些;

(2)预测未来10个值的时候:准确率的关系CNN+RNN>S-to-S RNN> S-to-V RNN,而且CNN+RNN训练速度快。