小书匠深度学习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. SAS学习笔记56 ODS ESCAPECHAR

    这种内嵌格式独立于style型和table型,它既可以结合二者使用,也可以独立使用.它主要通过下列语句的格式形式来进行调用: ODS ESCAPECHAR ‘^’; 上述符号’^’表示触发条件,如果碰 ...

  2. springboot处理事务

    ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要么同时 ...

  3. VS.NET(C#)--2.8HTML服务器控件

    HTML服务器控件 服务器不处理HTML控件,例如:<h1>.<a>超链接.<input>,直接送到客户端,由浏览器呈现. 把HTML控件转换成HTML服务器控件, ...

  4. TODO-依赖注入与控制反转

    交互框架之Actor与Listener的关系 https://www.cnblogs.com/mq0036/p/7473371.html

  5. java利用反射打印出类的结构

    1 输入一个类名:java.lang.String将打印出String类定义的结构,例如: public final class java.lang.String { public java.lang ...

  6. Subversion和TortoiseSVN,VisualSVN图文教程

    转自:http://www.veryhuo.com/a/view/156054.html 本文为大家介绍一下SVN使用教程,在开始之前,您有必要了解一下为什么要使用SVN?因为程序员在编写程序的过程中 ...

  7. Feign报错'xx.FeignClientSpecification', defined in null, could not be registered.

    解决: 在application.yml中配置: spring: main: allow-bean-definition-overriding: true 参考:https://blog.csdn.n ...

  8. Vue列表动画----自己做的

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. ORA-28547: connection to server failed, probable Oracle Net admin error

    现象 C:\Users\Administrator>sqlplus scott/tiger@192.168.1.11:1521/orcl SQL*Plus: Release 11.2.0.4.0 ...

  10. Linux(一):Linux基础

    1. Linux入门 1.1. Linux概述 Linux是一套免费使用和自由传播的类Unix操作系统.Unix操作系统是上世纪70年代在贝尔实验室诞生的一个强大的多用户.多任务操作系统. Linux ...