代码整理自 《Hands On Machine Learning with sklearn,Keras and TensorFlow》Chapter 15: Processing Sequences Using RNNs and CNNs。
@[toc]
1.生成模拟数据
import
模拟数据大致模样如下图所示:
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训练速度快。