基于keras的LSTM时间序列预测

详细代码见github: https://github.com/pjgao/lstm_helloworld/

1 简介

针对时间序列预测问题传统方法如ARIMA算法来拟合序列,综合考虑趋势、循环、季节等因素。
随着深度学习的飞速发展,基于RNN的方法在时间序列中的应用越来越广泛。
本文使用air passenger航空公司乘客数据集,来测试LSTM在时间序列中的预测:

2 问题

这里我们使用前n个月的乘客量来预测下一个月的乘客量

3 数据分析

航空公司乘客数据集为1949年1月到1960年12月每月乘客的数量
乘客数据
从图中可以看出该序列有一定的周期性。
这里写图片描述

4 数据处理

这里一定要注意,需要先对数据进行归一化处理,否则结果惨不忍睹!
这里我们使用sklearn中的MinMaxScaler对数据进行归一化处理。这里使用过去10个月的数据来推断下一个月的数据,因此infer_seq_length设置为10

#将数据归一化
scaler_minmax = MinMaxScaler()
data = scaler_minmax.fit_transform(df)
infer_seq_length = 10#用于推断的历史序列长度

d = []
for i in range(data.shape[0]-infer_seq_length):
    d.append(data[i:i+infer_seq_length+1].tolist())
d = np.array(d)

d的shape为(134, 11, 1),前10维为已知序列,最后一维为预测值。
数据d

5 lstm模型

这里使用了两层lstm来搭建模型,lstm不宜太多。

  • 因为有两层,所以第一层lstm的return_sequences要设置为True,否则两层不会连接到一起。
  • 因为我们预测的只有乘客数量一个变量,因此第一层lstm的输入shape为1
  • lstm完了之后一般会接一个全连接层Dense用于输出,这里Dense的激活函数为Linear
def create_model():
    model = Sequential()
    #输入数据的shape为(n_samples, timestamps, features)
    #隐藏层设置为256, input_shape元组第二个参数1意指features为1
    #下面还有个lstm,故return_sequences设置为True
    model.add(LSTM(units=256,input_shape=(None,1),return_sequences=True))
    model.add(LSTM(units=256))
    #后接全连接层,直接输出单个值,故units为1
    model.add(Dense(units=1))
    model.add(Activation('linear'))
    model.compile(loss='mse',optimizer='adam')
    return model

这里写图片描述

6 训练模型

我们在选择前面一些天的数据作为训练集,在训练集上训练模型。

model.fit(X_train, y_train, batch_size=20,epochs=100,validation_split=0.1)

训练过程:
这里写图片描述

7 预测结果

红色虚线是LSTM在整个序列上的预测结果:
这里写图片描述

放大后观测部分:
这里写图片描述

  • 9
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值