小书匠深度学习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. Yii2 redis 使用方法

    /** * 基于 yii2.0 redis使用方法 *///项目根目录命令行执行 composer require --prefer-dist yiisoft/yii2-redis; //在配置文件中 ...

  2. weui中的picker滑动报错

    html { touch-action: none; } 在页面插入上述代码即可解决

  3. input 被checked时和label配合的妙用

    input 和label配合的妙用 1:作为文字隐藏与否的开关: 如下代码:对div里面所包含的文字较多,一开始只展示小部分,当用户点击按钮时,进行全部内容的展示(按钮是以向下隐藏箭头的图片) htm ...

  4. Vue学习官网和Vue的书籍 目录结构

    Vue基础知识学习网站[中文] https://cn.vuejs.org/v2/guide/ Vue路由知识学习网站[中文] https://router.vuejs.org/zh/guide/  V ...

  5. Servlet快速入门:第一个Servlet程序

    Servlet是整个JavaWeb开发的核心,同时也是一套规范,即公共接口.用于处理客户端发来的请求并作出响应.通常情况下我们会发送不同的请求并交由不同的处理程序来处理,例如处理用户信息和处理订单信息 ...

  6. Python函数Day3

    一.函数名的应用 函数名类似于特殊的变量,打印函数名就是打印函数的内存地址 ① 函数名就是函数的内存地址 def func(): pass >>>func <function ...

  7. kali linux Desktop Environemt types and kali linux install virualbox

    1.we know the kali linux desktop environmet can also be costomized ,Desktop environmet can use GNOME ...

  8. Python使用xlrd、pandas包从Excel读取数据

    #coding=utf-8 # pip install xlrd import xlrd def read_from_xls(filepath,index_col_list): #filepath:读 ...

  9. nginx连接php测试

    1 nginx连接php [root@web01 /application/nginx/conf/conf.d]# cat docs.conf server { server_name docs.ol ...

  10. 目录-java并发基础知识

    ====================== 1.volatile原理 2.ThreadLocal的实现原理(源码级) 3.线程池模型以及核心参数 4.HashMap的实现以及jdk8的改进(源码级) ...