【Python时序预测系列】建立CNN-LSTM-Transformer融合模型实现多变量时序预测(案例+源码)
这是我的第449篇原创文章。一、引言CNN卷积擅长抓“局部模式”LSTM长短时记忆网络擅长记住“时间上的因果和长期依赖”Transformer自注意力擅长把序列里任意两个时刻相互比较、找全局相关性而且能并行处理。融合方式串联CNN → LSTM → Transformer。先提取局部特征再用 LSTM 建长期状态最后用 Transformer 做全局交互。下面通过一个具体的案例融合CNN LSTM Transformer进行多变量输入单变量输出单步时间序列预测包括模型构建、训练、预测等等。二、实现过程2.1 数据加载核心代码df pd.read_csv(data.csv, parse_dates[Date], index_col[0]) df pd.DataFrame(df)结果原始数据集总数52032.2 数据划分核心代码test_splitround(len(df)*0.20) df_for_trainingdf[:-test_split] df_for_testingdf[-test_split:]训练集4162测试集10412.3 数据归一化核心代码scaler MinMaxScaler(feature_range(0,1)) df_for_training_scaled scaler.fit_transform(df_for_training) df_for_testing_scaledscaler.transform(df_for_testing)2.4 构造时序数据集核心代码train_dataset TimeSeriesDataset(df_for_training_scaled, seq_len30, pred_len1) test_dataset TimeSeriesDataset(df_for_testing_scaled, seq_len30, pred_len1) train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)时序训练集和测试集数组形状2.5 CNN_LSTM_Transformer模型核心代码class CNN_LSTM_Transformer(nn.Module): def __init__(self, input_dim5, cnn_channels16, lstm_hidden32, transformer_dim32, transformer_heads4, transformer_layers1, pred_len1): super().__init__() # CNN self.cnn nn.Conv1d(in_channelsinput_dim, out_channelscnn_channels, kernel_size3, padding1) self.cnn_relu nn.ReLU() # LSTM self.lstm nn.LSTM(input_sizecnn_channels, hidden_sizelstm_hidden, batch_firstTrue) # Transformer Encoder encoder_layer nn.TransformerEncoderLayer(d_modeltransformer_dim, nheadtransformer_heads, batch_firstTrue) self.transformer nn.TransformerEncoder(encoder_layer, num_layerstransformer_layers) # Projection layers self.proj_lstm nn.Linear(lstm_hidden, transformer_dim) self.pred_len pred_len self.fc_out nn.Linear(transformer_dim, pred_len) def forward(self, x): # x: [batch, seq_len, 1] batch_size, seq_len, _ x.shape # CNN expects [batch, channels, seq_len] cnn_out self.cnn_relu(self.cnn(x.transpose(1,2))) # [B, C, T] cnn_out cnn_out.transpose(1,2) # [B, T, C] # LSTM lstm_out, _ self.lstm(cnn_out) # [B, T, hidden] lstm_proj self.proj_lstm(lstm_out) # [B, T, transformer_dim] # Transformer trans_out self.transformer(lstm_proj) # [B, T, transformer_dim] # 取最后时间步输出预测 out self.fc_out(trans_out[:, -1, :]) # [B, pred_len] return out.unsqueeze(-1) # [B, pred_len, 1]2.6 训练模型核心代码def train_model(model, dataloader, num_epochs50, learning_rate1e-3, devicecpu): optimizer torch.optim.Adam(model.parameters(), lrlearning_rate) criterion nn.MSELoss() model.train() loss_history [] for epoch in range(num_epochs): epoch_losses [] for batch_data, batch_targets in dataloader: batch_data batch_data.to(device) batch_targets batch_targets.to(device) optimizer.zero_grad() outputs model(batch_data) loss criterion(outputs, batch_targets) loss.backward() optimizer.step() epoch_losses.append(loss.item()) avg_loss np.mean(epoch_losses) loss_history.append(avg_loss) if (epoch 1) % 10 0: print(fEpoch [{epoch 1}/{num_epochs}], Loss: {avg_loss:.4f}) return loss_history结果2.7 模型测试集评估核心代码def evaluate_model(model, dataloader, devicecpu): model.eval() preds [] trues [] with torch.no_grad(): for batch_data, batch_targets in dataloader: batch_data batch_data.to(device) outputs model(batch_data) preds.append(outputs.cpu().numpy()) trues.append(batch_targets.cpu().numpy()) preds np.concatenate(preds, axis0).squeeze() trues np.concatenate(trues, axis0).squeeze() return preds, trues2.8 结果可视化核心代码def visualize_results(loss_history, preds, trues): sns.set(font_scale1.2) plt.rc(font, family[Times New Roman, Simsun], size12) # 图 1训练损失曲线 # 模型在训练过程中损失的下降情况说明模型不断优化拟合数据。 plt.plot(loss_history, markero, colordodgerblue, linestyle-, linewidth2) plt.title(Training Loss Curve) plt.xlabel(Epoch) plt.ylabel(MSE Loss) plt.tight_layout() plt.savefig(output_image1.png, dpi300, formatpng) plt.show() # 图 2真实值与预测值对比曲线 # 对比曲线直观展示模型预测趋势与真实数据的匹配情况越接近表示模型效果越好。 plt.plot(trues, labelTrue Values, colorlimegreen) plt.plot(preds, labelPredicted Values, colorcrimson) plt.title(True vs. Predicted Values) plt.xlabel(Sample Index) plt.ylabel(Trend Value) plt.legend() plt.tight_layout() plt.savefig(output_image2.png, dpi300, formatpng) plt.show()图 1训练损失曲线图 2真实值与预测值对比曲线2.9 计算误差核心代码testScore1 math.sqrt(mean_squared_error(preds_test, trues_test)) print(Test Score: %.2f RMSE % (testScore1)) testScore2 mean_absolute_error(preds_test, trues_test) print(Test Score: %.2f MAE % (testScore2)) testScore3 r2_score(preds_test, trues_test) print(Test Score: %.2f R2 % (testScore3)) testScore4 mean_absolute_percentage_error(preds_test, trues_test) print(Test Score: %.2f MAPE % (testScore4))结果作者简介读研期间发表6篇SCI数据挖掘相关论文现在某研究院从事数据算法相关科研工作结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创以最简单的方式理解和学习关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

相关新闻

17.设置笔记本电脑不休眠

17.设置笔记本电脑不休眠

有时候,需要让笔记本电脑一直开着,不休眠。 记录下设置方法: 快捷键win i键。 搜索框:输入电源

2026/7/6 15:25:42 阅读更多 →
救命神器10个AI论文网站,助你搞定研究生毕业论文!

救命神器10个AI论文网站,助你搞定研究生毕业论文!

救命神器10个AI论文网站,助你搞定研究生毕业论文! AI 工具如何成为论文写作的得力助手 在研究生阶段,撰写毕业论文是一项既重要又充满挑战的任务。面对繁重的研究内容和严格的格式要求,许多同学都感到无从下手。而随着 AI 技术的…

2026/7/3 19:05:58 阅读更多 →
高标准康复理疗实训室,夯实职业技能基础

高标准康复理疗实训室,夯实职业技能基础

一、 建设标准是康复理疗实训室的核心前提建设标准决定了康复理疗实训室的起点与效能。高标准康复理疗实训室在空间规划上,严格区分评估、训练及治疗区域。高标准康复理疗实训室在设备选型上,对接行业主流技术与临床规范。这种对硬件与环境的精细要求&am…

2026/7/5 12:08:21 阅读更多 →

最新新闻

PyTorch 2.0 深度可分离卷积实战:MobileNet 模块参数量减少 8-9 倍

PyTorch 2.0 深度可分离卷积实战:MobileNet 模块参数量减少 8-9 倍

PyTorch 2.0深度可分离卷积实战:MobileNet模块参数量优化策略 当我们在移动设备上部署深度学习模型时,模型大小和计算效率往往成为关键瓶颈。传统卷积神经网络在参数数量和计算量上的高需求,使得它们在资源受限的环境中难以高效运行。深度可分…

2026/7/6 15:24:23 阅读更多 →
HOScrcpy:鸿蒙开发者必备的远程真机投屏终极解决方案

HOScrcpy:鸿蒙开发者必备的远程真机投屏终极解决方案

HOScrcpy:鸿蒙开发者必备的远程真机投屏终极解决方案 【免费下载链接】鸿蒙远程真机工具 该工具主要提供鸿蒙系统下基于视频流的投屏功能,帧率基本持平真机帧率,达到远程真机的效果。 项目地址: https://gitcode.com/OpenHarmonyToolkitsPl…

2026/7/6 15:24:23 阅读更多 →
Oracle TNS监听器远程投毒漏洞CVE-2012-1675复现与防御指南

Oracle TNS监听器远程投毒漏洞CVE-2012-1675复现与防御指南

1. 项目概述与背景解析最近在整理一些老漏洞的复现笔记,翻到了Oracle数据库历史上一个挺有意思的漏洞——CVE-2012-1675,业内也常称之为“TNS Listener远程数据投毒漏洞”。这个漏洞虽然年份久远,但它的原理和影响范围在今天看来依然具有很高…

2026/7/6 15:24:23 阅读更多 →
3步搞定PHP代码自动化重构:Rector让你告别手动升级的烦恼 [特殊字符]

3步搞定PHP代码自动化重构:Rector让你告别手动升级的烦恼 [特殊字符]

3步搞定PHP代码自动化重构:Rector让你告别手动升级的烦恼 😊 【免费下载链接】rector Instant Upgrades and Automated Refactoring of any PHP 5.3 code 项目地址: https://gitcode.com/GitHub_Trending/re/rector 还在为PHP版本升级而头疼吗&am…

2026/7/6 15:22:21 阅读更多 →
Apollo Save Tool:PS4游戏存档管理的本地化技术解决方案

Apollo Save Tool:PS4游戏存档管理的本地化技术解决方案

Apollo Save Tool:PS4游戏存档管理的本地化技术解决方案 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 在PlayStation 4游戏生态中,存档管理一直是玩家面临的技术挑战。跨账号迁移…

2026/7/6 15:20:19 阅读更多 →
Iron Node完全指南:如何用Chrome开发者工具调试Node.js代码

Iron Node完全指南:如何用Chrome开发者工具调试Node.js代码

Iron Node完全指南:如何用Chrome开发者工具调试Node.js代码 【免费下载链接】iron-node Debug Node.js code with Chrome Developer Tools. 项目地址: https://gitcode.com/gh_mirrors/ir/iron-node 想要提升Node.js调试效率吗?Iron Node是一个终…

2026/7/6 15:16:13 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻