双向LSTM 对航空乘客预测

2023-11-02

前言

1.LSTM 航空乘客预测 单步预测和多步预测。 简单运用LSTM 模型进行预测分析。
2.加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制,将两者进行结合预测。
3.多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模型进行预测分析。

本文采用双向LSTM网络对其进行预测。

我喜欢直接代码+ 结果展示
先代码可以跑通,才值得深入研究每个部分之间的关系;进而改造成自己可用的数据。

1 数据集

链接: https://pan.baidu.com/s/1jv7A2JvIhA6oqvtYnYh9vQ
提取码: m5j5

2 模型

双向LSTM是传统LSTM的扩展,在输入序列的所有时间步长可用的问题中,双向LSTM在输入序列上训练两个而不是一个LSTM。
输入序列中的第一个是原样的,第二个是输入序列的反转副本。这可以为网络提供额外的上下文,并导致更快,甚至更充分的学习问题

2.1 单步预测 1—》1

  • 代码
# 单变量,1---》1 

import numpy
import matplotlib.pyplot as plt
from pandas import read_csv
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Bidirectional
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
#matplotlib inline

# load the dataset
dataframe = read_csv('airline-passengers.csv', usecols=[1], engine='python')
# print(dataframe)
print("数据集的长度:",len(dataframe))
dataset = dataframe.values
# 将整型变为float
dataset = dataset.astype('float32')

plt.plot(dataset)
plt.show()


# X是给定时间(t)的乘客人数,Y是下一次(t + 1)的乘客人数。
# 将值数组转换为数据集矩阵,look_back是步长。
def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        # X按照顺序取值
        dataX.append(a)
        # Y向后移动一位取值
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY)

# fix random seed for reproducibility
numpy.random.seed(7)


# 数据缩放
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)


# 将数据拆分成训练和测试,2/3作为训练数据
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
print("原始训练集的长度:",train_size)
print("原始测试集的长度:",test_size)



# 构建监督学习型数据
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back) 
print("转为监督学习,训练集数据长度:", len(trainX))
# print(trainX,trainY)
print("转为监督学习,测试集数据长度:",len(testX))
# print(testX, testY )
# 数据重构为3D [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
print('构造得到模型的输入数据(训练数据已有标签trainY): ',trainX.shape,testX.shape)

# create and fit the LSTM network
model = Sequential()
model.add(Bidirectional(LSTM(4, input_shape=(1, look_back))))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)

# 打印模型
model.summary()

# 开始预测
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)

# 逆缩放预测值
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])

# 计算误差
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))


# shift train predictions for plotting
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict

# shift test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict

# plot baseline and predictions
plt.plot(scaler.inverse_transform(dataset))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()
  • 结果
Train Score: 22.97 RMSE
Test Score: 48.23 RMSE

在这里插入图片描述

  • 预测下一个月的数据
# 预测未来的数据

#测试数据的最后一个数据没有预测,这里补上
finalX = numpy.reshape(test[-1:], (1, testX.shape[1], 1))
print(finalX)

#预测得到标准化数据
featruePredict = model.predict(finalX)

#将标准化数据转换为人数
featruePredict = scaler.inverse_transform(featruePredict)

#原始数据是1949-1960年的数据,下一个月是1961年1月份
print('模型预测1961年1月份的国际航班人数是: ',featruePredict)

结果展示:
模型预测1961年1月份的国际航班人数是: [[418.70108]]

2.2 单步预测 3—》1

  • 代码
# 单变量,3---》1 

import numpy
import matplotlib.pyplot as plt
from pandas import read_csv
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Bidirectional
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
#matplotlib inline

# load the dataset
dataframe = read_csv('airline-passengers.csv', usecols=[1], engine='python')
# print(dataframe)
print("数据集的长度:",len(dataframe))
dataset = dataframe.values
# 将整型变为float
dataset = dataset.astype('float32')

plt.plot(dataset)
plt.show()


# X是给定时间(t)的乘客人数,Y是下一次(t + 1)的乘客人数。
# 将值数组转换为数据集矩阵,look_back是步长。
def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        # X按照顺序取值
        dataX.append(a)
        # Y向后移动一位取值
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY)

# fix random seed for reproducibility
numpy.random.seed(7)


# 数据缩放
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)


# 将数据拆分成训练和测试,2/3作为训练数据
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
print("原始训练集的长度:",train_size)
print("原始测试集的长度:",test_size)



# 构建监督学习型数据
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back) 
print("转为监督学习,训练集数据长度:", len(trainX))
# print(trainX,trainY)
print("转为监督学习,测试集数据长度:",len(testX))
# print(testX, testY )
# 数据重构为3D [samples, time steps, features]
# trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
# testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))

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

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

# create and fit the LSTM network
model = Sequential()
# model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Bidirectional(LSTM(4, input_shape=( look_back,1)))) # 与上面的重构格式对应,要改都改,才能跑通代码
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)

# 打印模型
model.summary()

# 开始预测
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)

# 逆缩放预测值
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])

# 计算误差
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))


# shift train predictions for plotting
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict

# shift test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict

# plot baseline and predictions
plt.plot(scaler.inverse_transform(dataset))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()
  • 结果展示
Train Score: 23.13 RMSE
Test Score: 88.55 RMSE

在这里插入图片描述

  • 预测下一个月的数据
# 预测未来的数据

#测试数据的最后一个数据没有预测,这里补上
finalX = numpy.reshape(test[-3:], (1, testX.shape[1], 1))
print(finalX)

#预测得到标准化数据
featruePredict = model.predict(finalX)

#将标准化数据转换为人数
featruePredict = scaler.inverse_transform(featruePredict)

#原始数据是1949-1960年的数据,下一个月是1961年1月份
print('模型预测1961年1月份的国际航班人数是: ',featruePredict)

结果展示:
模型预测1961年1月份的国际航班人数是: [[337.3761]]

3 总结

  • 双向LSTM的预测效果在一些情况下,确实比单向LSTM的好,要具体看什么数据,什么情况下
  • 对LSTM网络的进一步扩充,就代码内部来看,改变了LSTM的输入格式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双向LSTM 对航空乘客预测 的相关文章

  • Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)

    575 分糖果 给定一个偶数长度的数组 其中不同的数字代表着不同种类的糖果 每一个数字代表一个糖果 你需要把这些糖果平均分给一个弟弟和一个妹妹 返回妹妹可以获得的最大糖果的种类数 示例 1 输入 candies 1 1 2 2 3 3 输出
  • Unity Navigation详解

    Unity Navigation详解 前言 从事unity相关行业以来始终看不清自己的路该怎么走 到今天才明白不需要花时间去迷茫 只管努力莫问前程 从今天开始每天写一点小东西 记录与整理自己走过的路 也一边寻找自己的路 便从unity的自动
  • BuildaFlightTrackerwithCesiumforUnreal_译

    BuildaFlightTrackerwithCesiumforUnreal 译 这个教程会使用真实世界飞机数据控制一个飞机飞过从圣弗朗西斯科到哥本哈根 你会学到怎样 1 输入真实数据到UnrealEngine 2 使用数据和USpline
  • 活动如何造势推广?会议软件帮您忙

    会议管理者辛苦策划了一场活动 如果推广宣传跟不上 那策划的心血岂不白费 如何使用有效且高效的方法为活动推广造势呢 传统推广方式耗费人力大 成本高 但通过会议软件便可以快速推广活动并有效宣传 下面为您介绍如何使用会议软件实现有效推广 01 社

随机推荐

  • python开发面试题

    python基础 1 Python类中的方法类型 在Python类中有四种方法类型 分别是实例方法 静态方法 类方法和普通方法 实例方法 即对象方法 需要实例化对象之后才能调用 接受的第一个参数self就是对象本身 必须使用实例化对象才可以
  • linux 图形分区工具,Linux下的图形分区工具

    在Linux下的许多情况下 分区将不足 这时 我们将需要调整分区 Windows下有很多工具 Linux下也有 您可以使用gparted进行分区 Gparted是parted的前端 图形化 linux下分区工具 通常包含在官方资源中 可以直
  • 2020年校赛网络赛

    51假期那段时间因为水了一段时间的数模校赛 加上专业课的坑越欠越多 因而已经很久很久没有补过题目了 从近到远 先把西电校赛的坑填起来 再把之前的CF牛客Atcoder补起来 qaq C 发现交换律后就显然了 D 双指针 好像第一天晚上还有个
  • 蓝桥杯2022真题:统计子矩阵、字符统计、排列字母、顺子日期、特殊时间、三角回文数、2022、星期计算

    目录 1 统计子矩阵 2 字符统计 3 排列字母 4 顺子日期 5 特殊时间 6 三角回文数 7 2022 8 星期计算 1 统计子矩阵 import os import sys 请在此输入您的代码 n m k map int input
  • chrome扩展结构

    每个打开的页面都运行在web页面环境中 一个正常的web页面环境 会先初始化css 然后建立DOM树 接着加载图片和frame等子资源 然后顺序执行所有js l chrome扩展本身运行在一个进程中 称之为background环境 back
  • 【软件测试学习笔记】白盒测试

    文章目录 一 白盒测试概述 二 分类 1 静态测试 2 动态测试 三 白盒测试原则 四 白盒测试类别 五 不同阶段不同侧重点 1 单元测试 2 集成测试 3 系统测试 4 验收测试 六 测试覆盖率 1 功能点覆盖 2 结构覆盖率 七 逻辑覆
  • LVGL在linux环境搭建篇

    LVGL环境搭建 1 环境准备 1 下载源码 https github com lvgl lvgl https github com lvgl lvgl 2 新建lvgl 文件夹 把src 和lvgl h 和lv conf template
  • 疯狂的采药(完全背包例题详解)

    题目 每种草药可以无限制地采摘 每种草药对应采药时间 草药价值 求在一定的采药时间下 采出的药最大总价值是多少 输入格式 输入第一行有两个整数 分别代表总共能够用来采药的时间 t 和代表山洞里的草药的数目 m 第 2 到第 m 1 行 每行
  • Entity Framework Core系列教程-18-断开模式下删除数据

    Entity Framework Core 断开模式下删除数据 EF Core API会为EntityState为Deleted的实体建立并执行数据库中的DELETE语句 在EF Core中已连接和已断开连接的场景中删除实体没有什么区别 E
  • 【数据结构】二叉树接口的实现及OJ题

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 二叉树的接口 1 二叉树的结构体 2 手动造一颗二叉树
  • 防止Sql注入拦截

    这两天在做一个sql注入拦截 期间遇到了不少问题 最大的问题是在 拦截sql注入后利用response 重定向到错误页面 始终无法实现跳转 发现原因是 ajax 异步请求时并不会对response重定向做处理 当然包括response ge
  • vite 配置路径别名@和动态引入assets资源

    vite 配置路径别名 vite config js配置 import fileURLToPath URL from node url 如果是ts 则需下载 types node以来 import defineConfig from vit
  • 解决socket.error: [Errno 98] Address already in use问题

    一 基本设置 如果python中socket 绑定的地址正在使用 往往会出现错误 在linux下 则会显示 socket error Errno 98 Address already in use 在windows下 则会显示 socket
  • linux访问有域名的ftp,Linux安装了ftp服务怎么用域名访?

    ftp directory怎么配置根 请自行准备好华为交换机和电脑 并且让你的电脑和交换机连接上 不管是telnet还是terminal都是可以的 首先需要在 Quidway 下启动ftp服务 Quidway ftp server enab
  • GPU比较(1285Lv4&1245v5)

    1285Lv4 Intel Iris Pro Graphics P6300 Iris Graphics 6200 P6300 EU 48 核心代号 GT3e 1245v5 HD Graphics P530 EU 48 核心代号 GT3e
  • 网络安全面试题

    IT面试 前言 首先 从底层的环境 计算机基础 即网络 系统方面开始 网络从交换 路由的基本认知到排错 系统从命令查看方面 其次 最后 通过编程语言 如python 提供自动化运维的方法 提高办公 简历方面 专业技能模块可以写成 1 熟悉网
  • sql-labs闯关26~31

    sql labs闯关26 31 友善爱国平等诚信民主富强爱国友善自由友善爱国平等诚信民主爱国爱国爱国 复习笔记1 第29 31关先跳过 回头再做 内容 sql labs第26关 GET请求 基于错误 过滤空格和注释 sql labs第26a
  • 报错解决:PermissionError

    在linux环境中安装jupyter notebook的时候遇到的错误 记录一下 PermissionError Errno 13 Permission denied run user 1002 jupyter 解决办法 chmod 777
  • 一文读懂深度学习中的矩阵微积分

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文转自 视学算法 想要真正了解深度神经网络是如何训练的 免不了从矩阵微积分说起 虽然网络上已经有不少关于多元微积分和线性代数的在线资料 但它们通常都被视作两门独立的课程
  • 双向LSTM 对航空乘客预测

    前言 1 LSTM 航空乘客预测 单步预测和多步预测 简单运用LSTM 模型进行预测分析 2 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制 将两者进行结合预测 3 多层 LSTM 对航空乘客预测 简单运用多层