DLinear 模型滚动预测实战:5步配置实现ETTh1数据集96步预测(附完整代码)

发布时间:2026/7/8 21:59:07

DLinear 模型滚动预测实战:5步配置实现ETTh1数据集96步预测(附完整代码)
DLinear 模型滚动预测实战5步配置实现ETTh1数据集96步预测附完整代码时间序列预测一直是数据分析领域的核心挑战之一。在众多预测方法中DLinear模型以其简洁高效的架构脱颖而出特别适合需要快速验证模型效果的中级开发者。本文将带您从零开始通过5个关键步骤完成ETTh1数据集上的96步滚动预测任务并提供可直接运行的Python代码和可视化方案。1. 环境准备与数据加载首先需要配置Python环境和安装必要的依赖库。建议使用Python 3.8版本并创建独立的虚拟环境conda create -n dlinear python3.8 conda activate dlinear pip install torch1.12.1 pandas matplotlib scikit-learnETTh1数据集是电力变压器温度监测的经典时间序列数据集包含7个特征列和1个目标列OT表示油温。我们可以直接从GitHub获取预处理好的数据import pandas as pd # 加载ETTh1数据集 data pd.read_csv(https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh1.csv) print(data.head()) # 可视化前1000个时间点的OT值 import matplotlib.pyplot as plt data[OT][:1000].plot(figsize(12,4)) plt.title(ETTh1 Oil Temperature (First 1000 Points)) plt.xlabel(Time Index) plt.ylabel(Temperature) plt.show()关键参数说明seq_len输入序列长度建议设置为96pred_len预测步长本文设置为96features预测模式MS表示多变量预测单变量2. 数据预处理与滚动窗口构建时间序列预测需要将原始数据转换为监督学习格式。我们实现滚动窗口生成函数import numpy as np from sklearn.preprocessing import StandardScaler def create_rolling_windows(data, seq_len, pred_len): X, Y [], [] for i in range(len(data)-seq_len-pred_len1): X.append(data[i:iseq_len]) Y.append(data[iseq_len:iseq_lenpred_len]) return np.array(X), np.array(Y) # 数据标准化 scaler StandardScaler() data_scaled scaler.fit_transform(data[[OT]]) # 生成滚动窗口 X, y create_rolling_windows(data_scaled, seq_len96, pred_len96) print(f生成窗口形状X{X.shape}, y{y.shape}) # 划分训练集和测试集8:2比例 split int(0.8*len(X)) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:]提示滚动预测的关键在于保持时间顺序切勿在划分数据集前进行随机打乱操作。3. DLinear模型实现DLinear的核心思想是将时间序列分解为趋势项和季节项分别用线性层处理。以下是PyTorch实现import torch import torch.nn as nn class MovingAvg(nn.Module): def __init__(self, kernel_size, stride): super(MovingAvg, self).__init__() self.kernel_size kernel_size self.avg nn.AvgPool1d(kernel_sizekernel_size, stridestride, padding0) def forward(self, x): # 序列两端填充 front x[:, 0:1, :].repeat(1, (self.kernel_size-1)//2, 1) end x[:, -1:, :].repeat(1, (self.kernel_size-1)//2, 1) x torch.cat([front, x, end], dim1) x self.avg(x.permute(0,2,1)) x x.permute(0,2,1) return x class DLinear(nn.Module): def __init__(self, seq_len, pred_len, individualFalse): super(DLinear, self).__init__() self.seq_len seq_len self.pred_len pred_len # 序列分解模块 self.decomposition MovingAvg(kernel_size25, stride1) # 趋势和季节线性层 self.linear_trend nn.Linear(seq_len, pred_len) self.linear_seasonal nn.Linear(seq_len, pred_len) def forward(self, x): # x形状: [Batch, SeqLen, Channel] seasonal, trend self.decomposition(x) seasonal seasonal.permute(0,2,1) trend trend.permute(0,2,1) seasonal_out self.linear_seasonal(seasonal) trend_out self.linear_trend(trend) return (seasonal_out trend_out).permute(0,2,1)模型关键组件说明MovingAvg通过平均池化提取序列趋势线性层分别处理季节和趋势成分参数共享所有特征通道共享相同的线性变换4. 模型训练与验证配置训练参数并启动训练过程device torch.device(cuda if torch.cuda.is_available() else cpu) model DLinear(seq_len96, pred_len96).to(device) criterion nn.MSELoss() optimizer torch.optim.Adam(model.parameters(), lr1e-3) # 转换数据为PyTorch张量 train_x torch.FloatTensor(X_train).to(device) train_y torch.FloatTensor(y_train).to(device) # 训练循环 for epoch in range(100): model.train() optimizer.zero_grad() outputs model(train_x) loss criterion(outputs, train_y) loss.backward() optimizer.step() if (epoch1) % 10 0: print(fEpoch [{epoch1}/100], Loss: {loss.item():.4f}) # 测试集评估 model.eval() with torch.no_grad(): test_x torch.FloatTensor(X_test).to(device) preds model(test_x).cpu().numpy()性能优化技巧使用学习率调度器如ReduceLROnPlateau增加早停机制EarlyStopping尝试更大的batch_size如32或645. 结果可视化与分析将预测结果与真实值对比展示# 反标准化数据 preds scaler.inverse_transform(preds.reshape(-1,1)) y_true scaler.inverse_transform(y_test.reshape(-1,1)) # 绘制最后5个预测窗口 plt.figure(figsize(15,6)) for i in range(5): idx -5i plt.plot(range(i*96, (i1)*96), y_true[idx*96:(idx1)*96], labelTrue if i0 else None, colorblue) plt.plot(range(i*96, (i1)*96), preds[idx*96:(idx1)*96], labelPred if i0 else None, colorred, linestyle--) plt.title(DLinear 96-step Rolling Prediction on ETTh1) plt.xlabel(Time Steps) plt.ylabel(Oil Temperature) plt.legend() plt.show()评估指标计算from sklearn.metrics import mean_absolute_error, mean_squared_error def calculate_metrics(y_true, y_pred): mae mean_absolute_error(y_true, y_pred) mse mean_squared_error(y_true, y_pred) return {MAE: mae, MSE: mse} metrics calculate_metrics(y_true, preds) print(预测性能指标:) for k, v in metrics.items(): print(f{k}: {v:.4f})实际项目中我发现当预测长度超过192步时DLinear的性能会明显下降。这时可以考虑以下改进方案使用层级预测策略先预测96步再用预测值作为输入预测后续96步尝试调整分解核大小kernel_size参数增加特征工程如添加移动平均、差分等特征

相关新闻

Adobe Illustrator批量替换革命:3分钟掌握ReplaceItems.jsx完整指南

Adobe Illustrator批量替换革命:3分钟掌握ReplaceItems.jsx完整指南

2026/7/8 21:49:06

Adobe Illustrator批量替换革命:3分钟掌握ReplaceItems.jsx完整指南 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Adobe Illustrator中重复的设计元素替换工作感…

计算机毕业设计之基于SSM框架的果蔬管理系统设计与实现

计算机毕业设计之基于SSM框架的果蔬管理系统设计与实现

2026/7/8 21:49:06

基于SSM框架的果蔬管理系统,采用Java语言开发,并结合MySQL数据库技术,是针对果蔬行业管理需求而设计的高效信息化解决方案。该系统整合了Spring的依赖注入与AOP特性、SpringMVC的请求处理能力以及MyBatis对数据库的高效操作,实现了…

软件测试入门——第二十九课(Linux常用命令)

软件测试入门——第二十九课(Linux常用命令)

2026/7/8 21:49:06

一、Linux关闭防火墙 外网访问服务器时,需要关闭防火墙,才能不受端口限制。但是生产环境中,关闭防火墙是一种非常危险的事情,这时可以仅开启指定的端口。 1.永久生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2.即刻生效 开启: service iptables sta…

3 款主流 SLAM 方案对比:RTAB-Map vs ORB-SLAM3 vs Cartographer 在室内外场景的实测

3 款主流 SLAM 方案对比:RTAB-Map vs ORB-SLAM3 vs Cartographer 在室内外场景的实测

2026/7/8 23:19:10

3款主流SLAM方案深度横评:RTAB-Map、ORB-SLAM3与Cartographer的实战对决当机器人需要在未知环境中自主导航时,SLAM(同步定位与建图)技术就如同它的"眼睛"和"大脑"。作为机器人感知系统的核心,SLAM…

ROBOGUIDE 仿真效率提升:双机器人+传送链工作站 5步避坑清单

ROBOGUIDE 仿真效率提升:双机器人+传送链工作站 5步避坑清单

2026/7/8 23:19:10

ROBOGUIDE双机器人协同仿真:5个关键陷阱与效率优化实战指南当两个机械臂需要在传送链和行走轴构成的舞台上共舞时,任何细微的时序错位都可能导致灾难性碰撞。去年某汽车零部件工厂就因仿真阶段未发现的信号延迟问题,导致实际产线上两台价值百…

工业负载控制方案:TPD2017FN与PIC18LF26K42应用

工业负载控制方案:TPD2017FN与PIC18LF26K42应用

2026/7/8 23:19:10

1. 项目概述:工业负载控制方案设计 在工业自动化领域,负载控制是核心环节之一。本项目采用TPD2017FN智能高侧开关和PIC18LF26K42微控制器构建了一套可靠的负载控制系统,专门针对工业环境中常见的电感和电阻性负载进行优化设计。电感性负载&am…

Transformer QKV 矩阵与多头注意力:从 PyTorch 代码到 8 头并行计算详解

Transformer QKV 矩阵与多头注意力:从 PyTorch 代码到 8 头并行计算详解

2026/7/8 23:19:10

Transformer QKV 矩阵与多头注意力:从 PyTorch 代码到 8 头并行计算详解在深度学习领域,Transformer 架构已经成为自然语言处理、计算机视觉等多个领域的基石。其核心组件——自注意力机制(Self-Attention)和多头注意力&#xff0…

MP2672A与STM32F745ZG锂电池均衡充电方案设计

MP2672A与STM32F745ZG锂电池均衡充电方案设计

2026/7/8 23:19:10

1. 项目背景与核心需求在便携式电子设备和储能系统中,多节锂电池串联使用时普遍存在电压不均衡问题。这种不均衡会导致电池组容量下降、寿命缩短甚至安全隐患。传统被动均衡方案能量损耗大,而主动均衡电路又过于复杂。MP2672A这款高度集成的充电管理IC恰…

豆包智能体内容迁移前的批量导出:Word/PDF/Excel 备份流程

豆包智能体内容迁移前的批量导出:Word/PDF/Excel 备份流程

2026/7/8 23:09:10

豆包智能体对话怎么批量导出成 Word 或 PDF? > 一句话结论:如果豆包智能体里有大量历史对话,不建议一条条复制,也不建议只截图保存。更稳的做法是先筛选重要内容,再按主题整理,最后把多轮对话导出成 Wo…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/8 0:44:47

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/8 6:29:42

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/8 14:04:34

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

2026/7/8 0:07:15

1. 项目概述:这不是又一个笔记软件教程,而是一套可复用的“认知操作系统”搭建逻辑你有没有试过,在读完Andrej Karpathy那篇著名的《Software 2.0》之后,满脑子都是“神经网络即代码”的震撼,但合上网页,打…

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

2026/7/8 0:07:15

校园服饰细分赛道测算程序(Python)——学生平价国风 & 机能穿搭市场规模预估(TAM / SAM / SOM)一、实际应用场景描述(真实业务抽象)在《时尚产业与品牌创新》课程中,细分市场切入&#xff0…

Visual C++运行库完整解决方案:告别软件兼容性问题

Visual C++运行库完整解决方案:告别软件兼容性问题

2026/7/8 0:07:15

Visual C运行库完整解决方案:告别软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾为打开游戏时弹出的"DLL缺失"错误…