小书匠深度学习LSTM

郑重声明,文章大部分翻译自: Time Series Prediction with LSTM Recurrent Neural Networks in Python with Keras


本文目录:

* 1.导入相应库文件及数据情况

* 2.标准化数据,划分数据

* 3.生成样本

* 4.构建LSTM网络

* 5.查看模型效果

* 6.预测未来的数据

* 7.扩展


数据: 1949到1960共12年,每年12个月的数据,一共 144 个数据,单位是 1000, 原文数据下载在这里

目标: 预测国际航班未来 1 个月的乘客数

1.导入相应库文件及数据情况

  1. #导入相应的库 

  2. import numpy 

  3. import matplotlib.pyplot as plt 

  4. from pandas import read_csv 

  5. import math 

  6. from keras.models import Sequential 

  7. from keras.layers import Dense 

  8. from keras.layers import LSTM 

  9. from keras.utils import plot_model 

  10. from sklearn.preprocessing import MinMaxScaler 

  11. from sklearn.metrics import mean_squared_error 

  12. from IPython.display import SVG 

  13. from keras.utils.vis_utils import model_to_dot 


  14. #将数据存储为两个矩阵,一个矩阵的ind位置存储t时刻的值,另一个矩阵存储t+1时刻的值 

  15. def create_dataset(dataset, look_back=1): 

  16. dataX, dataY = [], [] 

  17. for i in range(len(dataset)-look_back-1): 

  18. a = dataset[i:(i+look_back), 0] 

  19. dataX.append(a) 

  20. dataY.append(dataset[i + look_back, 0]) 

  21. return numpy.array(dataX), numpy.array(dataY) 


  22. # fix random seed for reproducibility 

  23. numpy.random.seed(7) 


  24. #读取数据 

  25. dataframe = read_csv('international-airline-passengers.csv', usecols=[1], engine='python', skipfooter=3) 

  26. dataset = dataframe.values 

  27. dataset = dataset.astype('float32') 


  28. #查看数据集 

  29. print('样本中的前面两个数据: \n',dataset[0:2]) 

  30. print('整个样本的规模: ',len(dataset)) 


  31. plt.plot(dataset) 

  32. plt.show() 

输出:

样本中的前面两个数据:

[[112.] [118.]]

整个样本的规模: 144


真实数据在月份上的分布

2.标准化数据,划分数据

  1. #LSTM对输入数据的规模很敏感,特别是在使用sigmoid(默认)或tanh激活函数时。 

  2. #将数据重新调整到0到1的范围(也称为标准化)可能是一种很好的做法。 


  3. scaler = MinMaxScaler(feature_range=(0, 1)) 

  4. dataset = scaler.fit_transform(dataset) 


  5. # 划分训练集与测试集,这里使用67%的原始数据作为训练数据,剩下33%作为测试数据 

  6. train_size = int(len(dataset) * 0.67) 

  7. test_size = len(dataset) - train_size 

  8. train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:] 

  9. print('划分数据集后的得到的训练数据和测试数据(训练数据未有标签): ',train.shape,test.shape) 

输出:

划分数据集后的得到的训练数据和测试数据(训练数据未有标签): (96, 1) (48, 1)


3.生成样本

  1. # 生成[t,t+look_back]时间间隔和t+look_back时刻的两个矩阵 

  2. look_back = 1 

  3. trainX, trainY = create_dataset(train, look_back) 

  4. testX, testY = create_dataset(test, look_back) 


  5. print(trainX[:2], trainY[:2]) 


  6. # 数据被Reshape成 [samples, time steps, features],这是放入LSTM的shape 

  7. trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) 

  8. testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1])) 


  9. print('构造得到模型的输入数据(训练数据已有标签trainY): ',trainX.shape,testX.shape) 

输出:

[[0.01544401] #第一个月份数据

[0.02702703]] #第二个月份数据

[0.02702703 0.05405405] #每个样本在模型上的应该得到的输出

构造得到模型的输入数据(训练数据已有标签trainY): (95, 1, 1) (47, 1, 1)


这里解释下数据为什么这样划分?

前面我们已经说明了,我们是基于历史数据预测下一时刻的数据,但是每次依赖多少历史数据,我们没有说.这个例子的参数look_back=1设置说明历史数据是1,也就是基于前一个月份数据预测下一个月份数据.下面我以第一年的数据说明数据划分情况.


第一年的数据情况

当我们基于1个历史数据预测下一个值时,样本划分就像图示的蓝,红框,蓝色框表示输入模型的数据,红色表示希望模型输出的数据(当然只是希望,会有偏差,后面我们用均方根误差来衡量模型真实输出和这个值的差距).蓝,红框在所有的数据上滑动,得到类似上面的数据划分情况.

当然,你也可以改动这个look_back这个值,基于历史多少数据来预测下一个数据可以自己设定.

注意:本来训练数据和测试数据分别有96,48个,但是经过这样划分后都减少1个,分别为95,47.这是因为最后一个数据没有标签.但是测试数据没有必要这样分,因为他不需要标签,这里分的意思是利用分到的标签用于计算模型在测试数据上的均方根误差.


4.构建LSTM网络

  1. #构建LSTM网络 

  2. model = Sequential() 

  3. model.add(LSTM(4, input_shape=(1, look_back))) 

  4. model.add(Dense(1)) 


  5. #编译训练LSTM网络 

  6. model.compile(loss='mean_squared_error', optimizer='adam') 

  7. model.fit(trainX, trainY, epochs=50, batch_size=1, verbose=1) 


  8. #打印模型 

  9. model.summary() 


  10. #保存模型 

  11. SVG(model_to_dot(model,show_shapes=True).create(prog='dot', format='svg')) 

输出:

  1. Epoch 1/50 

  2. 95/95 [==============================] - 2s 18ms/step - loss: 0.0406 

  3. Epoch 2/50 

  4. 95/95 [==============================] - 1s 6ms/step - loss: 0.0199 

  5. Epoch 3/50 

  6. 95/95 [==============================] - 1s 6ms/step - loss: 0.0147 

  7. ........后面直到50次省略 


  8. ______________________________________________________________________________________ 

  9. Layer (type) Output Shape Param #  

  10. ====================================================================================== 

  11. lstm_7 (LSTM) (None, 4) 96  

  12. ______________________________________________________________________________________ 

  13. dense_7 (Dense) (None, 1) 5  

  14. ====================================================================================== 

  15. Total params: 101 

  16. Trainable params: 101 

  17. Non-trainable params: 0 

  18. ______________________________________________________________________________________ 


模型图示

5.查看模型效果

  1. # 使用已训练的模型进行预测 

  2. trainPredict = model.predict(trainX) 

  3. testPredict = model.predict(testX) 


  4. # 预测的值是[0,1]这样的标准化数据,需要将该值转换回原始值 

  5. trainPredict = scaler.inverse_transform(trainPredict) 

  6. trainY = scaler.inverse_transform([trainY]) 

  7. testPredict = scaler.inverse_transform(testPredict) 

  8. testY = scaler.inverse_transform([testY]) 



  9. # 计算预测的均方根误差 

  10. trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0])) 

  11. print('Train Score: %.2f RMSE' % (trainScore)) 

  12. testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0])) 

  13. print('Test Score: %.2f RMSE' % (testScore)) 


  14. # 画图:对训练数据的预测 

  15. trainPredictPlot = numpy.empty_like(dataset) 

  16. trainPredictPlot[:, :] = numpy.nan 

  17. trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict 



  18. # 画图:对测试数据的预测 

  19. testPredictPlot = numpy.empty_like(dataset) 

  20. testPredictPlot[:, :] = numpy.nan 

  21. #testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict 

  22. testPredictPlot[len(trainPredict)+look_back:len(dataset)-1, :] = testPredict 


  23. # 显示图片 

  24. plt.plot(scaler.inverse_transform(dataset),color='blue',label='Raw data') 

  25. plt.plot(trainPredictPlot,color='red',label='Train process') 

  26. plt.plot(testPredictPlot,color='green',label='Test process') 


  27. #在折线图上显示标签 

  28. leg = plt.legend(loc='best', ncol=1, fancybox=True) 

  29. leg.get_frame().set_alpha(0.5) 


  30. plt.show() 

输出:

Train Score: 23.39 RMSE #训练数据的均方根误差

Test Score: 46.92 RMSE #测试数据的均方根误差


模型效果图示

蓝色线是原始数据,红色是训练数据的预测情况,绿色是测试数据的预测情况,红色和绿色线越靠近蓝色线,表示模型对数据拟合能力越好.


6.预测未来的数据

最后一个数据集的下一个月情况没有被预测,现把它拿到后进行预测.

  1. #测试数据的最后一个数据没有预测,这里补上 

  2. finalX = numpy.reshape(test[-1], (1, 1, testX.shape[1])) 


  3. #预测得到标准化数据 

  4. featruePredict = model.predict(finalX) 


  5. #将标准化数据转换为人数 

  6. featruePredict = scaler.inverse_transform(featruePredict) 


  7. #原始数据是1949-1960年的数据,下一个月是1961年1月份 

  8. print('模型预测1961年1月份的国际航班人数是: ',featruePredict) 

输出:

模型预测1961年1月份的国际航班人数是: [[430.27188]]


7.扩展

模型有些参数可以自己手动调一下,看看模型在不同参数下的效果(虽然我估计数据量太少,可能调参带来的变化不是很大,但是可以体验调参的过程),下面我就可以调的参数说明:

(1)损失函数现在使用的是mean_squared_error,可以调成别的

(2)优化器是adam,也可以调,甚至对优化器内的参数进行调整(比如学习率)

(3)训练次数是50,可以调低点(因为我看后面模型的损失不下降了)

(4)基于历史多少数据的参数look_back可调,你可以设置为3,5.....

全部代码可以在这里找到.

LSTM-航班人数预测的更多相关文章

  1. 用 LSTM 做时间序列预测的一个小例子(转自简书)

    问题:航班乘客预测 数据:1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000 下载地址 目标:预测国际航班未来 1 个月的乘客数 import nu ...

  2. 86、使用Tensorflow实现,LSTM的时间序列预测,预测正弦函数

    ''' Created on 2017年5月21日 @author: weizhen ''' # 以下程序为预测离散化之后的sin函数 import numpy as np import tensor ...

  3. 矩池云 | 利用LSTM框架实时预测比特币价格

    温馨提示:本案例只作为学习研究用途,不构成投资建议. 比特币的价格数据是基于时间序列的,因此比特币的价格预测大多采用LSTM模型来实现. 长期短期记忆(LSTM)是一种特别适用于时间序列数据(或具有时 ...

  4. Python中利用LSTM模型进行时间序列预测分析

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...

  5. 基于 Keras 用 LSTM 网络做时间序列预测

    目录 基于 Keras 用 LSTM 网络做时间序列预测 问题描述 长短记忆网络 LSTM 网络回归 LSTM 网络回归结合窗口法 基于时间步的 LSTM 网络回归 在批量训练之间保持 LSTM 的记 ...

  6. Tensorflow实例:利用LSTM预测股票每日最高价(一)

    RNN与LSTM 这一部分主要涉及循环神经网络的理论,讲的可能会比较简略. 什么是RNN RNN全称循环神经网络(Recurrent Neural Networks),是用来处理序列数据的.在传统的神 ...

  7. 时间序列深度学习:状态 LSTM 模型预测太阳黑子

    目录 时间序列深度学习:状态 LSTM 模型预测太阳黑子 教程概览 商业应用 长短期记忆(LSTM)模型 太阳黑子数据集 构建 LSTM 模型预测太阳黑子 1 若干相关包 2 数据 3 探索性数据分析 ...

  8. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  9. 基于 lstm 的股票收盘价预测 -- python

    开始导入 MinMaxScaler 时会报错 “from . import _arpack ImportError: DLL load failed: 找不到指定的程序.” (把sklearn更新下) ...

随机推荐

  1. EF Core 2.0 执行原始查询如何防止SQL注入

    using (var context = new EFCoreDbContext()) { var searchString = "Jeffcky Wang"; Formattab ...

  2. Tomcat HTTP connector和AJP connector

    Tomcat服务器通过Connector连接器组件与客户程序建立连接,“连接器”表示接收请求并返回响应的端点.即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户. ...

  3. SringMVC笔记

    SpringMvc主要是三个Servlet:HttpServletBean,FramwworkServlet,DispatcherServlet,它们是依次继承的关系,其处理过程大致功能如下: 1.H ...

  4. 2..net core 和.net framework 版本

    同一台机器上可以安装多个版本的.net core runtime.比如: 每个.net core项目都可以指定自己所用的版本,所以改变某个项目的target version不会影响到其他的.安装新的r ...

  5. vue 将时间戳转换成日期格式 (一)

    (1)创建一个处理时间格式的js,内容如下: ../../utils/formatDate.js export function formatDate(date, fmt) { if (/(y+)/. ...

  6. Linux命令——uptime

    参考:linux中uptime命令查看linux系统负载 Linux uptime command 简介 uptim告诉你系统运行了多长时间.uptime命令提供单行显示的输出,包含如下信息: 当前时 ...

  7. DNS服务——搭建企业内网DNS服务器的作用

    前言 DNS服务——服务端 和 客户端 配置 介绍了如何在DNS安装DNS服务,更改一下配置文件就可以依据根提示解析全球域名.既然使用互联网上的DNS服务器就可以解析全球域名,为何还要自掏腰包搭建DN ...

  8. Python_逻辑运算符

    1.逻辑运算符

  9. HTML&CSS基础-相对定位

    HTML&CSS基础-相对定位 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> &l ...

  10. 版本问题---Bazel与tensorflow的对应关系

    源码安装tf的时候,会用到Bazel,版本不对应,后面会引起好多麻烦. echo "deb [arch=amd64] http://storage.googleapis.com/bazel- ...