专栏首页杨熹的专栏6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现

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

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

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


1. Univariate

Univariate 是指:

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

数例:

训练集:
X,          y
10, 20, 30      40
20, 30, 40      50
30, 40, 50      60
…


预测输入:
X,
70, 80, 90

模型的 Keras 代码:

# define model【Vanilla LSTM】

model = Sequential()
model.add( LSTM(50,  activation='relu',  input_shape = (n_steps, n_features)) )
model.add( Dense(1) )
model.compile(optimizer='adam', loss='mse')

n_steps = 3
n_features = 1

其中:

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

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


2. Multiple Input

Multiple Input 是指:

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

数例:

训练集:
X,       y
[[10 15]
 [20 25]
 [30 35]] 65
[[20 25]
 [30 35]
 [40 45]] 85
[[30 35]
 [40 45]
 [50 55]] 105
[[40 45]
 [50 55]
 [60 65]] 125
…


预测输入:
X,
80,  85
90,  95
100,     105

即数据样式为:

in_seq1: [10, 20, 30, 40, 50, 60, 70, 80, 90]
in_seq2: [15, 25, 35, 45, 55, 65, 75, 85, 95]

out_seq: [in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))]

模型的 Keras 代码:

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

n_steps = 3
# 此例中 n features = 2,因为输入有两个并行序列
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 也是多个序列的问题。

数例:

训练集:
X,          y
[[10 15 25]
 [20 25 45]
 [30 35 65]] [40 45 85]
[[20 25 45]
 [30 35 65]
 [40 45 85]] [ 50  55 105]
[[ 30  35  65]
 [ 40  45  85]
 [ 50  55 105]] [ 60  65 125]
[[ 40  45  85]
 [ 50  55 105]
 [ 60  65 125]] [ 70  75 145]
…


预测输入:
X,
70, 75, 145
80, 85, 165
90, 95, 185

模型的 Keras 代码:

# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')

n_steps = 3
# 此例中 n features = 3,因为输入有3个并行序列
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 也是多个时间步的问题。

数例:

训练集:
X,          y
[10 20 30] [40 50]
[20 30 40] [50 60]
[30 40 50] [60 70]
[40 50 60] [70 80]
…


预测输入:
X,
[70, 80, 90]

模型的 Keras 代码:

# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')

n_steps_in, n_steps_out = 3, 2
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 结构实现:

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

5. Multivariate Multi-Step

Multivariate Multi-Step 是指:

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

数例:

训练集:
X,          y
[[10 15]
 [20 25]
 [30 35]] [65 
          85]
[[20 25]
 [30 35]
 [40 45]] [ 85
           105]
[[30 35]
 [40 45]
 [50 55]] [105 
         125]
…


预测输入:
X,
[40 45]
 [50 55]
 [60 65]

模型的 Keras 代码:

# define model
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')

n_steps_in, n_steps_out = 3, 2
# 此例中 n features = 2,因为输入有2个并行序列  
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 也是多个序列 & 多个时间步的问题。

数例:

训练集:
X,          y
[[10 15 25]
 [20 25 45]
 [30 35 65]] [[ 40  45  85]
          [ 50  55 105]]
[[20 25 45]
 [30 35 65]
 [40 45 85]] [[ 50  55 105]
          [ 60  65 125]]
[[ 30  35  65]
 [ 40  45  85]
 [ 50  55 105]] [[ 60  65 125]
             [ 70  75 145]]
…


预测输入:
X,
[[ 40  45  85]
 [ 50  55 105]
 [ 60  65 125]]

模型的 Keras 代码:

# define model【Encoder-Decoder model】
model = Sequential()
model.add(LSTM(200, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(200, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')

n_steps_in, n_steps_out = 3, 2
# 此例中 n features = 3,因为输入有3个并行序列   
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, 喜欢人工智能,没事儿写写机器学习干货, 欢迎关注我!


推荐阅读历史技术博文链接汇总 http://www.jianshu.com/p/28f02bb59fe5 也许可以找到你想要的: [入门问题][TensorFlow][深度学习][强化学习][神经网络][机器学习][自然语言处理][聊天机器人]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原创思维者的惊人特质

    亚当·格兰特: 原创思维者的惊人特质 之前看过几个关于拖延症的TED,这次的又是从一个新的角度来说拖延症的,当听到拖延症,不全是坏处,也有好处,这种以主题式的听...

    杨熹
  • 为什么要用交叉验证

    本文结构: 什么是交叉验证法? 为什么用交叉验证法? 主要有哪些方法?优缺点? 各方法应用举例? ---- 什么是交叉验证法? 它的基本思想就是将原始数据(da...

    杨熹
  • 机器学习面试题集 - 详解四种交叉验证方法

    它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。

    杨熹
  • python数据分析——在python中实现线性回归

    线性回归是基本的统计和机器学习技术之一。经济,计算机科学,社会科学等等学科中,无论是统计分析,或者是机器学习,还是科学计算,都有很大的机会需要用到线性模型。建议...

    刘早起
  • 通过扩展的沟MIDI数据集提高鼓转录的感知质量(CS.SD)

    分类器指标(例如准确性和F量度得分)通常充当下游任务性能的代理。对于使用预测标签作为输入的生成系统而言,只有在其与生成的输出的感知质量一致的情况下,准确性才是一...

    蔡小雪7100294
  • ElasticSearch权威指南学习(索引管理)

    "char_filter": { "&_to_and": { "type": "mapping", "ma...

    老梁
  • bitfinex币 接口翻译整理

    code_horse
  • python获取当前路径

    机器学习和大数据挖掘
  • Python基础

    Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。

    用户7678152
  • Solidus(3)

    以下内容接着讲Solidus的核心协议。在之前的笔记中,我们学习到了Circuit ORAM的构造,其实具体的算法我没有研究,但是大概意思是明白了。把它当做黑盒...

    安包

扫码关注云+社区

领取腾讯云代金券