当前位置:   article > 正文

6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现

预测模型lstm可以和什么结合

LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网络,可以解决 RNN 无法处理长距离的依赖的问题,在时间序列预测问题上面也有广泛的应用。

今天我们根据问题的输入输出模式划分,来看一下几种时间序列问题所对应的 LSTM 模型结构如何实现。


1. Univariate

Univariate 是指:

input 为多个时间步,
output 为一个时间的问题。

数例:

  1. 训练集:
  2. X, y
  3. 10, 20, 30 40
  4. 20, 30, 40 50
  5. 30, 40, 50 60
  6. 预测输入:
  7. X,
  8. 70, 80, 90

模型的 Keras 代码:

  1. # define model【Vanilla LSTM】
  2. model = Sequential()
  3. model.add( LSTM(50, activation='relu', input_shape = (n_steps, n_features)) )
  4. model.add( Dense(1) )
  5. model.compile(optimizer='adam', loss='mse')
  6. n_steps = 3
  7. n_features = 1

其中:

n_steps 为输入的 X 每次考虑几个时间步
n_features 为每个时间步的序列数

这个是最基本的模型结构,我们后面几种模型会和这个进行比较。


2. Multiple Input

Multiple Input 是指:

input 为多个序列,
output 为一个序列的问题。

数例:

  1. 训练集:
  2. X, y
  3. [[10 15]
  4. [20 25]
  5. [30 35]] 65
  6. [[20 25]
  7. [30 35]
  8. [40 45]] 85
  9. [[30 35]
  10. [40 45]
  11. [50 55]] 105
  12. [[40 45]
  13. [50 55]
  14. [60 65]] 125
  15. 预测输入:
  16. X,
  17. 80, 85
  18. 90, 95
  19. 100, 105

即数据样式为:

  1. in_seq1: [10, 20, 30, 40, 50, 60, 70, 80, 90]
  2. in_seq2: [15, 25, 35, 45, 55, 65, 75, 85, 95]
  3. out_seq: [in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))]

模型的 Keras 代码:

  1. # define model【Vanilla LSTM】
  2. model = Sequential()
  3. model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
  4. model.add(Dense(1))
  5. model.compile(optimizer='adam', loss='mse')
  6. n_steps = 3
  7. # 此例中 n features = 2,因为输入有两个并行序列
  8. n_features = X.shape[2]

其中:

n_steps 为输入的 X 每次考虑几个时间步
n_features 此例中 = 2,因为输入有两个并行序列

和 Univariate 相比:

模型的结构代码是一样的,只是在 n_features = X.shape[2],而不是 1.


3. Multiple Parallel

Multiple Parallel 是指:

input 为多个序列,
output 也是多个序列的问题。

数例:

  1. 训练集:
  2. X, y
  3. [[10 15 25]
  4. [20 25 45]
  5. [30 35 65]] [40 45 85]
  6. [[20 25 45]
  7. [30 35 65]
  8. [40 45 85]] [ 50 55 105]
  9. [[ 30 35 65]
  10. [ 40 45 85]
  11. [ 50 55 105]] [ 60 65 125]
  12. [[ 40 45 85]
  13. [ 50 55 105]
  14. [ 60 65 125]] [ 70 75 145]
  15. 预测输入:
  16. X,
  17. 70, 75, 145
  18. 80, 85, 165
  19. 90, 95, 185

模型的 Keras 代码:

  1. # define model【Vanilla LSTM】
  2. model = Sequential()
  3. model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
  4. model.add(Dense(n_features))
  5. model.compile(optimizer='adam', loss='mse')
  6. n_steps = 3
  7. # 此例中 n features = 3,因为输入有3个并行序列
  8. n_features = X.shape[2]

其中:

n_steps 为输入的 X 每次考虑几个时间步
n_features 此例中 = 3,因为输入有 3 个并行序列

和 Univariate 相比:

模型结构的定义中,多了一个 return_sequences=True,即返回的是序列,
输出为 Dense(n_features),而不是 1.


4. Multi-Step

Multi-Step 是指:

input 为多个时间步,
output 也是多个时间步的问题。

数例:

  1. 训练集:
  2. X, y
  3. [10 20 30] [40 50]
  4. [20 30 40] [50 60]
  5. [30 40 50] [60 70]
  6. [40 50 60] [70 80]
  7. 预测输入:
  8. X,
  9. [70, 80, 90]

模型的 Keras 代码:

  1. # define model【Vanilla LSTM】
  2. model = Sequential()
  3. model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
  4. model.add(LSTM(100, activation='relu'))
  5. model.add(Dense(n_steps_out))
  6. model.compile(optimizer='adam', loss='mse')
  7. n_steps_in, n_steps_out = 3, 2
  8. n_features = 1

其中:

n_steps_in 为输入的 X 每次考虑几个时间步
n_steps_out 为输出的 y 每次考虑几个时间步
n_features 为输入有几个序列

和 Univariate 相比:

模型结构的定义中,多了一个 return_sequences=True,即返回的是序列,
而且 input_shape=(n_steps_in, n_features) 中有代表输入时间步数的 n_steps_in
输出为 Dense(n_steps_out),代表输出的 y 每次考虑几个时间步.

当然这个问题还可以用 Encoder-Decoder 结构实现:

  1. # define model【Encoder-Decoder Model】
  2. model = Sequential()
  3. model.add(LSTM(100, activation='relu', input_shape=(n_steps_in, n_features)))
  4. model.add(RepeatVector(n_steps_out))
  5. model.add(LSTM(100, activation='relu', return_sequences=True))
  6. model.add(TimeDistributed(Dense(1)))
  7. model.compile(optimizer='adam', loss='mse')

5. Multivariate Multi-Step

Multivariate Multi-Step 是指:

input 为多个序列,
output 为多个时间步的问题。

数例:

  1. 训练集:
  2. X, y
  3. [[10 15]
  4. [20 25]
  5. [30 35]] [65
  6. 85]
  7. [[20 25]
  8. [30 35]
  9. [40 45]] [ 85
  10. 105]
  11. [[30 35]
  12. [40 45]
  13. [50 55]] [105
  14. 125]
  15. 预测输入:
  16. X,
  17. [40 45]
  18. [50 55]
  19. [60 65]

模型的 Keras 代码:

  1. # define model
  2. model = Sequential()
  3. model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
  4. model.add(LSTM(100, activation='relu'))
  5. model.add(Dense(n_steps_out))
  6. model.compile(optimizer='adam', loss='mse')
  7. n_steps_in, n_steps_out = 3, 2
  8. # 此例中 n features = 2,因为输入有2个并行序列
  9. n_features = X.shape[2]

其中:

n_steps_in 为输入的 X 每次考虑几个时间步
n_steps_out 为输出的 y 每次考虑几个时间步
n_features 为输入有几个序列,此例中 = 2,因为输入有 2 个并行序列

和 Univariate 相比:

模型结构的定义中,多了一个 return_sequences=True,即返回的是序列,
而且 input_shape=(n_steps_in, n_features) 中有代表输入时间步数的 n_steps_in
输出为 Dense(n_steps_out),代表输出的 y 每次考虑几个时间步,
另外 n_features = X.shape[2],而不是 1,
相当于是 Multivariate 和 Multi-Step 的结构组合起来。


6. Multiple Parallel Input & Multi-Step Output

Multiple Parallel Input & Multi-Step Output 是指:

input 为多个序列,
output 也是多个序列 & 多个时间步的问题。

数例:

  1. 训练集:
  2. X, y
  3. [[10 15 25]
  4. [20 25 45]
  5. [30 35 65]] [[ 40 45 85]
  6. [ 50 55 105]]
  7. [[20 25 45]
  8. [30 35 65]
  9. [40 45 85]] [[ 50 55 105]
  10. [ 60 65 125]]
  11. [[ 30 35 65]
  12. [ 40 45 85]
  13. [ 50 55 105]] [[ 60 65 125]
  14. [ 70 75 145]]
  15. 预测输入:
  16. X,
  17. [[ 40 45 85]
  18. [ 50 55 105]
  19. [ 60 65 125]]

模型的 Keras 代码:

  1. # define model【Encoder-Decoder model】
  2. model = Sequential()
  3. model.add(LSTM(200, activation='relu', input_shape=(n_steps_in, n_features)))
  4. model.add(RepeatVector(n_steps_out))
  5. model.add(LSTM(200, activation='relu', return_sequences=True))
  6. model.add(TimeDistributed(Dense(n_features)))
  7. model.compile(optimizer='adam', loss='mse')
  8. n_steps_in, n_steps_out = 3, 2
  9. # 此例中 n features = 3,因为输入有3个并行序列
  10. n_features = X.shape[2]

其中:

n_steps_in 为输入的 X 每次考虑几个时间步
n_steps_out 为输出的 y 每次考虑几个时间步
n_features 为输入有几个序列

这里我们和 Multi-Step 的 Encoder-Decoder 相比:

二者的模型结构,只是在最后的输出层参数不同,
TimeDistributed(Dense(n_features)) 而不是 Dense(1)


好啦,这几种时间序列的输入输出模式所对应的代码结构就是这样,如果您还有更有趣的,欢迎补充!


大家好!
我是 不会停的蜗牛 Alice,
喜欢人工智能,没事儿写写机器学习干货,
欢迎关注我!

推荐 阅读原文
也许可以找到你想要的:
[入门问题][TensorFlow][深度学习][强化学习][神经网络][机器学习][自然语言处理][聊天机器人]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/167874
推荐阅读
相关标签
  

闽ICP备14008679号