当前位置: 首页 > article >正文

手把手教你用Keras搭建Seq2Seq LSTM模型:以航空公司乘客数据预测为例

从零构建Seq2Seq LSTM模型航空乘客预测的工程实践当我们需要预测未来三个月航空公司的乘客数量时传统的时间序列分析方法往往捉襟见肘。这正是Seq2Seq LSTM模型大显身手的场景——它能够捕捉长期依赖关系实现端到端的多步预测。不同于简单的单步预测模型Seq2Seq结构通过编码器-解码器框架将输入序列编码为固定长度的上下文向量再解码为目标序列这种架构特别适合解决多输入多输出的时序预测问题。1. 理解Seq2Seq架构的核心组件Seq2Seq模型由两大核心部分组成编码器(Encoder)和解码器(Decoder)。编码器负责将输入序列压缩为一个固定维度的上下文向量(context vector)这个向量理论上包含了输入序列的所有信息解码器则根据这个上下文向量逐步生成输出序列。在Keras中实现这一架构时我们需要特别关注几个关键层LSTM层作为编码器和解码器的基础LSTM能够有效捕捉时间序列中的长期依赖关系。设置return_stateTrue可以获取LSTM的隐藏状态和细胞状态这些状态将作为解码器的初始状态。RepeatVector层这是连接编码器和解码器的桥梁。由于解码器需要逐步生成多个时间步的输出RepeatVector将编码器的最后一个隐藏状态重复n次n为预测步长为解码器提供统一的初始输入。TimeDistributed层包装在普通的Dense层外面使其能够处理序列数据。对于每个时间步的输出都应用相同的全连接层确保输出序列的每个时间步都经过相同的变换。实际工程中常见的误区是忽略了状态传递的重要性。编码器的最终状态必须正确传递给解码器作为初始状态否则模型将失去对输入序列的记忆能力。2. 数据准备与特征工程航空乘客数据集是时间序列预测的经典案例包含1949年至1960年每月国际航空乘客数量。高质量的数据准备是模型成功的前提。2.1 数据加载与预处理import pandas as pd from sklearn.preprocessing import MinMaxScaler # 加载数据 data pd.read_csv(airline-passengers.csv) data[Month] pd.to_datetime(data[Month]) data.set_index(Month, inplaceTrue) # 划分训练集和测试集 train_size int(len(data) * 0.8) train_data data[:train_size] test_data data[train_size:] # 归一化处理 scaler MinMaxScaler() train_scaled scaler.fit_transform(train_data) test_scaled scaler.transform(test_data)提示时间序列数据必须按时间顺序划分训练集和测试集随机划分会破坏时间依赖性。2.2 构造监督学习格式Seq2Seq模型需要将时间序列转换为监督学习问题。我们需要定义滑动窗口的大小将过去N个月的乘客数量作为输入预测未来M个月的数值。import numpy as np def create_dataset(series, n_past, n_future): X, y [], [] for i in range(len(series)-n_past-n_future1): X.append(series[i:(in_past)]) y.append(series[(in_past):(in_pastn_future)]) return np.array(X), np.array(y) n_past 12 # 使用过去12个月的数据 n_future 3 # 预测未来3个月 n_features 1 # 单变量时间序列 X_train, y_train create_dataset(train_scaled, n_past, n_future) X_test, y_test create_dataset(test_scaled, n_past, n_future) # 调整形状为LSTM需要的格式(样本数, 时间步长, 特征数) X_train X_train.reshape((X_train.shape[0], n_past, n_features)) y_train y_train.reshape((y_train.shape[0], n_future, n_features)) X_test X_test.reshape((X_test.shape[0], n_past, n_features)) y_test y_test.reshape((y_test.shape[0], n_future, n_features))3. 构建Seq2Seq模型架构现在进入核心环节——用Keras构建完整的编码器-解码器结构。我们将采用函数式API因为它提供了更大的灵活性来定义复杂模型。3.1 编码器部分实现编码器接收形状为(n_past, n_features)的输入序列通过LSTM层提取特征并输出最终的状态。from tensorflow.keras.layers import Input, LSTM from tensorflow.keras.models import Model # 编码器 encoder_inputs Input(shape(n_past, n_features)) encoder_lstm LSTM(128, return_stateTrue) encoder_outputs, state_h, state_c encoder_lstm(encoder_inputs) # 保留状态用于解码器 encoder_states [state_h, state_c]3.2 解码器部分实现解码器使用编码器的最终状态作为初始状态并通过RepeatVector和TimeDistributed层生成多步预测。from tensorflow.keras.layers import RepeatVector, TimeDistributed, Dense # 解码器 decoder_inputs RepeatVector(n_future)(encoder_outputs) decoder_lstm LSTM(128, return_sequencesTrue) decoder_outputs decoder_lstm(decoder_inputs, initial_stateencoder_states) decoder_dense TimeDistributed(Dense(n_features)) decoder_outputs decoder_dense(decoder_outputs) # 完整模型 model Model(encoder_inputs, decoder_outputs)3.3 模型编译与训练选择合适的损失函数和优化器对模型性能至关重要。对于时间序列预测Huber损失是一个稳健的选择它对异常值不那么敏感。from tensorflow.keras.optimizers import Adam from tensorflow.keras.losses import Huber model.compile(optimizerAdam(learning_rate0.001), lossHuber(), metrics[mae]) history model.fit(X_train, y_train, epochs100, batch_size16, validation_data(X_test, y_test), verbose1)4. 模型评估与预测技巧训练完成后我们需要系统地评估模型性能并掌握一些实用的预测技巧。4.1 预测结果反归一化由于我们对数据进行了归一化预测结果也需要反归一化才能得到实际的乘客数量。# 在测试集上进行预测 predictions model.predict(X_test) # 反归一化 predictions_actual scaler.inverse_transform(predictions.reshape(-1, 1)) y_test_actual scaler.inverse_transform(y_test.reshape(-1, 1))4.2 多步预测可视化将预测结果与真实值对比可视化可以直观评估模型性能。import matplotlib.pyplot as plt plt.figure(figsize(12, 6)) plt.plot(y_test_actual, labelActual) plt.plot(predictions_actual, labelPredicted) plt.title(Airline Passengers: Actual vs Predicted) plt.xlabel(Time Steps) plt.ylabel(Passenger Count) plt.legend() plt.show()4.3 模型性能指标除了可视化我们还需要量化指标来评估模型指标公式说明MAE$\frac{1}{n}\sum_{i1}^ny_i - \hat{y}_iRMSE$\sqrt{\frac{1}{n}\sum_{i1}^n (y_i - \hat{y}_i)^2}$均方根误差MAPE$\frac{100%}{n}\sum_{i1}^n \left\frac{y_i - \hat{y}_i}{y_i}\right计算这些指标的Python实现from sklearn.metrics import mean_absolute_error, mean_squared_error def mean_absolute_percentage_error(y_true, y_pred): return np.mean(np.abs((y_true - y_pred) / y_true)) * 100 mae mean_absolute_error(y_test_actual, predictions_actual) rmse np.sqrt(mean_squared_error(y_test_actual, predictions_actual)) mape mean_absolute_percentage_error(y_test_actual, predictions_actual) print(fMAE: {mae:.2f}) print(fRMSE: {rmse:.2f}) print(fMAPE: {mape:.2f}%)5. 高级技巧与模型优化基础模型构建完成后我们可以通过多种方式进一步提升预测性能。5.1 注意力机制增强传统的Seq2Seq模型依赖固定长度的上下文向量这可能成为信息瓶颈。引入注意力机制可以让解码器在生成每个时间步的输出时关注编码器不同时间步的隐藏状态。from tensorflow.keras.layers import Dot, Concatenate, Activation # 注意力层实现 def attention_block(encoder_outputs, decoder_outputs): score Dot(axes[2, 2])([decoder_outputs, encoder_outputs]) attention_weights Activation(softmax)(score) context_vector Dot(axes[2, 1])([attention_weights, encoder_outputs]) return context_vector # 修改解码器部分 context_vector attention_block(encoder_outputs, decoder_outputs) decoder_combined_context Concatenate(axis-1)([decoder_outputs, context_vector]) decoder_outputs TimeDistributed(Dense(n_features))(decoder_combined_context)5.2 超参数调优模型性能很大程度上取决于超参数的选择。我们可以使用Keras Tuner来自动搜索最佳超参数组合。import keras_tuner as kt def build_model(hp): # 可调超参数 lstm_units hp.Int(lstm_units, min_value64, max_value256, step64) learning_rate hp.Choice(learning_rate, values[1e-2, 1e-3, 1e-4]) # 模型构建 inputs Input(shape(n_past, n_features)) encoder_lstm LSTM(lstm_units, return_stateTrue) encoder_outputs, state_h, state_c encoder_lstm(inputs) decoder_inputs RepeatVector(n_future)(encoder_outputs) decoder_lstm LSTM(lstm_units, return_sequencesTrue) decoder_outputs decoder_lstm(decoder_inputs, initial_state[state_h, state_c]) outputs TimeDistributed(Dense(n_features))(decoder_outputs) model Model(inputs, outputs) model.compile(optimizerAdam(learning_ratelearning_rate), lossHuber(), metrics[mae]) return model tuner kt.RandomSearch( build_model, objectiveval_loss, max_trials10, executions_per_trial2, directorytuning, project_nameairline_passengers ) tuner.search(X_train, y_train, epochs50, validation_data(X_test, y_test), verbose1)5.3 模型集成与鲁棒性提升单一模型的预测可能不够稳定我们可以训练多个Seq2Seq模型并集成它们的预测结果。from tensorflow.keras.wrappers.scikit_learn import KerasRegressor from sklearn.ensemble import VotingRegressor # 创建多个模型变体 def create_seq2seq_model(): inputs Input(shape(n_past, n_features)) encoder_lstm LSTM(128, return_stateTrue) encoder_outputs, state_h, state_c encoder_lstm(inputs) decoder_inputs RepeatVector(n_future)(encoder_outputs) decoder_lstm LSTM(128, return_sequencesTrue) decoder_outputs decoder_lstm(decoder_inputs, initial_state[state_h, state_c]) outputs TimeDistributed(Dense(n_features))(decoder_outputs) model Model(inputs, outputs) model.compile(optimizerAdam(learning_rate0.001), lossHuber(), metrics[mae]) return model # 创建集成模型 models [(model1, KerasRegressor(build_fncreate_seq2seq_model, epochs100, batch_size16, verbose0)), (model2, KerasRegressor(build_fncreate_seq2seq_model, epochs100, batch_size16, verbose0)), (model3, KerasRegressor(build_fncreate_seq2seq_model, epochs100, batch_size16, verbose0))] ensemble VotingRegressor(models) ensemble.fit(X_train.reshape(X_train.shape[0], -1), y_train.reshape(y_train.shape[0], -1))6. 生产环境部署考量当模型开发完成后我们需要考虑如何将其部署到生产环境中实现实时预测。6.1 模型序列化与加载# 保存模型 model.save(seq2seq_airline.h5) # 加载模型 from tensorflow.keras.models import load_model loaded_model load_model(seq2seq_airline.h5)6.2 构建预测API使用Flask可以快速构建一个预测API服务from flask import Flask, request, jsonify import numpy as np app Flask(__name__) model load_model(seq2seq_airline.h5) app.route(/predict, methods[POST]) def predict(): data request.json[data] scaled_data scaler.transform(np.array(data).reshape(-1, 1)) X scaled_data[-n_past:].reshape(1, n_past, n_features) prediction model.predict(X) prediction_actual scaler.inverse_transform(prediction.reshape(-1, 1)) return jsonify({prediction: prediction_actual.flatten().tolist()}) if __name__ __main__: app.run(host0.0.0.0, port5000)6.3 持续监控与再训练生产环境中模型性能会随着时间推移而下降需要建立监控和再训练机制记录预测结果和实际值的偏差设置性能阈值当指标超过阈值时触发再训练实现自动化数据管道定期用新数据重新训练模型采用影子部署(Shadow Deployment)测试新模型不影响生产流量

相关文章:

手把手教你用Keras搭建Seq2Seq LSTM模型:以航空公司乘客数据预测为例

从零构建Seq2Seq LSTM模型:航空乘客预测的工程实践 当我们需要预测未来三个月航空公司的乘客数量时,传统的时间序列分析方法往往捉襟见肘。这正是Seq2Seq LSTM模型大显身手的场景——它能够捕捉长期依赖关系,实现端到端的多步预测。不同于简单…...

AI接口文档生成已进入工业级阶段:2026奇点大会公布的7项实测指标颠覆传统DevOps流程

第一章:2026奇点智能技术大会:AI接口文档生成 2026奇点智能技术大会(https://ml-summit.org) 技术背景与行业痛点 随着微服务架构和API经济的深度演进,企业平均每年新增API数量超过1200个,但其中67%缺乏及时、准确、可执行的文档…...

5个高效方案:用NavMeshPlus实现Unity 2D智能导航的完整实践

5个高效方案:用NavMeshPlus实现Unity 2D智能导航的完整实践 【免费下载链接】NavMeshPlus Unity NavMesh 2D Pathfinding 项目地址: https://gitcode.com/gh_mirrors/na/NavMeshPlus NavMeshPlus作为Unity NavMesh系统的2D增强插件,为游戏开发者提…...

从命令行到图形化:给开发者的ZeNmap保姆级教程,5分钟搞定API服务端口安全检查

开发者必备:用ZeNmap快速排查API服务端口安全隐患 最近在调试一个Spring Boot微服务时,遇到件怪事——本地测试一切正常,但联调时前端死活连不上我的API。折腾半天才发现是防火墙规则把8080端口给拦了。这种问题如果有个趁手的端口检查工具&a…...

MATLAB 2020b 中文版安装避坑指南:断网、杀软、中文路径,一个都不能错

MATLAB 2020b 中文版安装避坑指南:断网、杀软、中文路径,一个都不能错 每次打开MATLAB都卡在启动界面?安装进度条走到99%就再也不动了?这些让人抓狂的问题,很可能是因为忽略了几个关键安装细节。作为一款功能强大的数学…...

LeetCode HOT 100 —— 矩阵置零(多种解法详解)

题目描述 LeetCode 73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: text 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,…...

DeerFlow 系列教程 第十五篇 | Guardrails 安全防护与可观测性

DeerFlow 系列教程 第十五篇 本篇教程继续模块四:高级功能与扩展,全面剖析 DeerFlow 的安全防护机制和可观测性体系。我们将深入理解 Guardrails 防护栏的策略执行架构、SandboxAuditMiddleware 的 Bash 命令审计、路径遍历防护与沙箱隔离机制、技能安全扫描、循环检测中间件…...

拯救混乱的日志:用NLog配置变量和规则,让你的.NET项目日志管理清晰10倍

从日志泥潭到清晰航道:NLog结构化配置的工程化实践 当你的.NET项目日志开始呈现指数级增长时,是否经历过这样的困境?凌晨三点被报警叫醒,却要在数十个混杂的日志文件中大海捞针;团队新成员面对错综复杂的日志配置望而…...

100个小工具挑战 #002 | 做了个能直接编辑树形视图的 JSON 格式化工具

起因 今年给自己定了个目标:做 100 个小工具页面。 不是为了流量,就是想把平时开发中遇到的痛点一个个解决掉。这是第 2 个。 第 1 个是发票批量识别工具,这次做的是 JSON 格式化。 为什么要自己做,不用现成的? 用…...

手把手教你用YOLOv11和PyAutoGUI实现屏幕目标自动追踪(附完整Python代码)

基于YOLOv11与PyAutoGUI的屏幕目标自动化追踪技术实战 在数字化办公与自动化测试领域,屏幕目标识别与自动化操作正成为提升效率的关键技术。本文将深入探讨如何利用YOLOv11这一前沿目标检测算法,结合PyAutoGUI这一轻量级自动化工具,构建一个高…...

MiniCPM-V-2_6电商应用实战:商品图多角度比对+卖点文案自动生成

MiniCPM-V-2_6电商应用实战:商品图多角度比对卖点文案自动生成 1. 引言:电商内容创作的痛点与解决方案 电商卖家每天都要面对一个头疼的问题:商品上架需要大量图片和文案。同一个商品要从不同角度拍摄,还要写出吸引人的卖点描述…...

生成式AI对接知识库总卡壳?揭秘92%企业失败的4个底层架构缺陷及实时修复方案

第一章:生成式AI应用知识库集成 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用与企业知识库的深度集成,正从“文档检索增强”迈向“语义化决策协同”。这一演进依赖于结构化知识注入、实时上下文对齐与可审计推理链构建三大支柱。现代知识…...

你的企业还在靠人工做合规检查?同行已经用 AI 自动预警了 | 实在Agent企业级风险防控方案

进入2026年,企业面临的合规环境已发生质变。随着《数据安全法》深度落地以及AIGC相关强制标准(如GB45438-2025)的严格执行,合规检查不再是每季度的“例行公事”,而是关系到企业生存的“实时防线”。 然而,这…...

为什么说企业的效率差距,核心在自动化能力的差距?2026企业数字化转型:实在Agent重塑人机协同新范式

进入2026年,全球商业竞争的底层逻辑发生了深刻位移。 根据普华永道与麦肯锡的联合调研显示,领先企业与跟随者之间的财务表现差距已拉大至7.2倍。 这种鸿沟的本质,不再是简单的技术有无,而是自动化能力的系统性代差。 当多数企业仍…...

同样的招聘工作,别人 AI 一周筛选千份简历,你的 HR 要加班一个月:2026企业级实在Agent深度实践

在2026年的春招赛道上,企业间的竞争早已从“人才争夺”演变为“筛选效率”的降维打击。 根据最新的行业观察,头部企业通过部署智能体(Agent)技术,已实现从简历抓取、逻辑初筛到面试预约的全链路自动化。 相比之下&…...

3分钟!玩转游戏下载站系统!蜘蛛池seo功能完善部署!

从复杂的建站流程到全自动部署游戏站下载站养站系统,整个流程只要3分钟!养站系统中的每个网站URL路径有2000 0000 0000条!(不需要发文章,自动更新文章,解决seo站长文章问题)游戏站养站功能简述&…...

从SD卡到EMMC:手把手教你用U-Boot的tftp和update_mmc命令完成系统引导迁移

从SD卡到EMMC:U-Boot引导迁移全流程实战指南 当开发板通过SD卡成功启动U-Boot后,如何将引导程序永久写入板载EMMC?这不仅关乎设备能否独立启动,更直接影响产品化部署的可靠性。本文将手把手带你完成从临时启动到永久固件部署的关键…...

Vue3数字动画实战:用vue3-count-to打造数据大屏动态效果(附完整代码)

Vue3数字动画实战:用vue3-count-to打造数据大屏动态效果 数据可视化大屏已经成为企业展示核心指标的重要窗口,而动态数字效果则是其中最抓眼球的元素之一。想象一下,当领导带着客户参观时,大屏上的关键数据从0开始流畅增长到百万级…...

告别环境配置焦虑:在Ubuntu 22.04上为ESP32-S3搭建esp-idf v5.4.2的保姆级避坑指南

告别环境配置焦虑:在Ubuntu 22.04上为ESP32-S3搭建esp-idf v5.4.2的保姆级避坑指南 第一次在Ubuntu上配置ESP-IDF开发环境时,我盯着终端里密密麻麻的报错信息发了半小时呆——明明是按照官方文档一步步操作,为什么总是卡在奇怪的环节&#xf…...

儿童护眼大路灯哪个牌子好用?全网高赞的护眼大路灯十大品牌排行

护眼大路灯通过上下发光能够呈现出舒适且接近太阳光的光线,这样也伴随着护眼落地灯迅速得到众多人的认可火爆市场,护眼灯品牌越来越多,质量参差不齐,存在着一些可能会造成刺眼、眩光以及频闪的劣质护眼灯,所以我们不能…...

别再纠结了!MySQL和PostgreSQL到底怎么选?从CPU核数到索引类型,一次给你讲透

MySQL与PostgreSQL技术选型指南:从架构差异到业务场景适配 当项目面临数据库选型时,技术决策者常常陷入两难境地。作为开源关系型数据库的双雄,MySQL和PostgreSQL各有拥趸,但真正的专业选择应当基于客观的技术特性和实际业务需求。…...

战略仪表盘:搜极星如何成为AI时代品牌竞争的新坐标

战略仪表盘:搜极星如何成为AI时代品牌竞争的新坐标 当前,品牌营销正经历一场静默但剧烈的“底层代码”更换。过往以搜索引擎为核心、以关键词和链接为枢纽的传统范式,在生成式AI的冲击下加速瓦解。当用户不再输入关键词列表,而是…...

从‘删库跑路’到安全操作:详解SQL中DROP SCHEMA/TABLE的CASCADE和RESTRICT到底怎么选

从‘删库跑路’到安全操作:详解SQL中DROP SCHEMA/TABLE的CASCADE和RESTRICT到底怎么选 在数据库管理的日常工作中,DROP命令就像一把双刃剑——它既能快速清理无用数据,也可能因误操作导致灾难性后果。想象一下这样的场景:你在生产…...

深度解析SukiUI Avalonia主题库架构设计与技术实现

深度解析SukiUI Avalonia主题库架构设计与技术实现 【免费下载链接】SukiUI UI Theme for AvaloniaUI 项目地址: https://gitcode.com/gh_mirrors/su/SukiUI SukiUI是基于AvaloniaUI框架构建的现代化UI主题库,专为桌面和移动应用程序提供完整的组件系统与主题…...

深度解析高性能Windows AirPlay 2接收器:架构设计与实现原理

深度解析高性能Windows AirPlay 2接收器:架构设计与实现原理 【免费下载链接】airplay2-win Airplay2 for windows 项目地址: https://gitcode.com/gh_mirrors/ai/airplay2-win AirPlay 2 for Windows 是一个完整的跨平台投屏解决方案,通过逆向工…...

如何快速打造精简Windows 11系统:tiny11builder终极完整指南

如何快速打造精简Windows 11系统:tiny11builder终极完整指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统日益臃肿&…...

解密MAA:如何用计算机视觉技术解放明日方舟玩家的双手?

解密MAA:如何用计算机视觉技术解放明日方舟玩家的双手? 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址:…...

MiniMax M2.7 上手体验:国产大模型的“推理派“选手

前两天用阿里的接口感觉慢了很多,国外的模型也被封了,实在受不了一个任务卡半天,瞧着MiniMax上市的股票涨的那么猛,是不是可以试试?于是我把我的龙虾的模型换成了MiniMax-M2.7,和之前的GLM-5执行同样的任务对比了一下效…...

BaiduPCS-Go深度调优指南:10个高级配置技巧提升下载速度与稳定性

BaiduPCS-Go深度调优指南:10个高级配置技巧提升下载速度与稳定性 【免费下载链接】BaiduPCS-Go iikira/BaiduPCS-Go原版基础上集成了分享链接/秒传链接转存功能 项目地址: https://gitcode.com/GitHub_Trending/ba/BaiduPCS-Go BaiduPCS-Go作为一款强大的百度…...

基本数据结构的定义要自己会手写1(二叉树)

(C版本)struct TreeNode {int val;TreeNode *left;TreeNode *right;// 写三个构造函数,提供多种创建节点的方式// 1、无参构造TreeNode() : val(0),left(nullptr),right(nullptr){}// 2、单参构造TreeNode(int x) : val(x),left(nullptr),rig…...