news 2026/9/3 1:02:24

PyTorch-2.x实战案例:时间序列预测模型训练步骤

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PyTorch-2.x实战案例:时间序列预测模型训练步骤

PyTorch-2.x实战案例:时间序列预测模型训练步骤

1. 引言:为什么选择PyTorch做时间序列预测?

时间序列预测在金融、气象、能源调度和供应链管理中无处不在。比如,你想知道明天的用电量、下周的股票走势,或者下个月的销量趋势——这些都属于时间序列问题。

而PyTorch作为当前最主流的深度学习框架之一,凭借其动态计算图灵活的模型构建方式以及强大的社区支持,已经成为许多研究者和工程师的首选工具。尤其是从PyTorch 2.0开始,引入了torch.compile()等性能优化特性,让训练更高效,部署更轻松。

本文将带你用一个真实可运行的案例,手把手完成基于LSTM的时间序列预测模型训练全过程。我们使用的环境是“PyTorch-2.x-Universal-Dev-v1.0”镜像,它已经预装了Pandas、Numpy、Matplotlib和Jupyter,无需额外配置,开箱即用。

你不需要是PyTorch专家,只要会写Python基础代码,就能跟着走完全流程。


2. 环境准备与验证

2.1 验证GPU是否可用

进入容器后,第一步建议检查CUDA环境是否正常:

nvidia-smi

你应该能看到显卡型号、显存使用情况和驱动版本。接着在Python中确认PyTorch能否识别GPU:

import torch print("CUDA可用:", torch.cuda.is_available()) print("CUDA版本:", torch.version.cuda) print("当前设备:", torch.cuda.current_device()) print("设备名称:", torch.cuda.get_device_name(0))

如果输出类似True和你的显卡型号(如RTX 4090或A800),说明环境就绪。

提示:该镜像默认已配置阿里源或清华源,pip安装包速度快,不易超时。


3. 数据准备:加载并处理时间序列数据

3.1 使用Pandas读取数据

我们将以经典的Airline Passengers(航空公司乘客数量)数据集为例。这是一个月度数据,记录了1949年到1960年的乘客人数变化,非常适合用来演示趋势性和周期性建模。

首先创建一个Jupyter Notebook或Python脚本文件:

import pandas as pd import numpy as np import matplotlib.pyplot as plt # 下载数据 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv' data = pd.read_csv(url) # 查看前几行 print(data.head())

输出如下:

Month #Passengers 0 1949-01 112 1 1949-02 118 2 1949-03 132 ...

3.2 数据清洗与可视化

我们需要把日期设为索引,并绘制原始曲线观察趋势:

# 设置日期为索引 data['Month'] = pd.to_datetime(data['Month']) data.set_index('Month', inplace=True) # 绘图 plt.figure(figsize=(12, 6)) plt.plot(data, label='Monthly Passengers') plt.title('Airline Passenger Numbers Over Time') plt.xlabel('Date') plt.ylabel('Number of Passengers (thousands)') plt.legend() plt.grid(True) plt.show()

你会看到一条明显的上升趋势和季节性波动——这正是我们要捕捉的特征。


4. 特征工程:构建适合LSTM的输入格式

4.1 归一化处理

神经网络对数值范围敏感,所以我们先对数据进行归一化:

from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(-1, 1)) scaled_data = scaler.fit_transform(data.values.reshape(-1, 1))

这里我们将所有值缩放到[-1, 1]区间,这是LSTM常用的输入范围。

4.2 构造滑动窗口样本

LSTM不能直接处理整个序列,需要将其拆分为多个“过去窗口 → 未来值”的样本对。

例如,用前12个月的数据预测第13个月:

def create_sequences(data, seq_length): xs, ys = [], [] for i in range(len(data) - seq_length): x = data[i:i+seq_length] y = data[i+seq_length] xs.append(x) ys.append(y) return np.array(xs), np.array(ys) SEQ_LENGTH = 12 # 使用12个月的历史数据 X, y = create_sequences(scaled_data, SEQ_LENGTH) print(f"样本数: {X.shape[0]}, 每个样本长度: {X.shape[1]}")

输出应为:样本数: 132, 每个样本长度: 12


5. 模型定义:搭建LSTM网络结构

5.1 定义PyTorch模型类

我们构建一个简单的三层结构:LSTM层 + ReLU激活 + 全连接输出层。

import torch import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_size=1, hidden_layer_size=50, output_size=1): super(LSTMModel, self).__init__() self.hidden_layer_size = hidden_layer_size self.lstm = nn.LSTM(input_size, hidden_layer_size, batch_first=True) self.linear = nn.Linear(hidden_layer_size, output_size) def forward(self, x): batch_size = x.size(0) h0 = torch.zeros(1, batch_size, self.hidden_layer_size).to(x.device) c0 = torch.zeros(1, batch_size, self.hidden_layer_size).to(x.device) lstm_out, _ = self.lstm(x, (h0, c0)) predictions = self.linear(lstm_out[:, -1]) return predictions

说明

  • batch_first=True表示输入维度为(batch, seq_len, features)
  • 我们只取最后一个时间步的输出来做预测(单步预测)
  • 初始隐藏状态h0和细胞状态c0初始化为零

5.2 实例化模型并移动到GPU

device = 'cuda' if torch.cuda.is_available() else 'cpu' model = LSTMModel().to(device)

6. 训练流程:编写完整的训练循环

6.1 准备数据加载器

将NumPy数组转换为Tensor,并使用DataLoader实现批量训练:

from torch.utils.data import DataLoader, TensorDataset # 转换为Tensor X_tensor = torch.from_numpy(X).float().to(device) y_tensor = torch.from_numpy(y).float().to(device) # 创建数据集和加载器 dataset = TensorDataset(X_tensor, y_tensor) dataloader = DataLoader(dataset, batch_size=16, shuffle=False) # 时间序列不打乱

注意:时间序列数据不能打乱顺序,所以shuffle=False

6.2 设置损失函数与优化器

criterion = nn.MSELoss() # 均方误差 optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

6.3 编写训练循环

EPOCHS = 100 model.train() for epoch in range(EPOCHS): total_loss = 0 for x_batch, y_batch in dataloader: optimizer.zero_grad() y_pred = model(x_batch) loss = criterion(y_pred, y_batch) loss.backward() optimizer.step() total_loss += loss.item() if (epoch + 1) % 20 == 0: print(f"Epoch [{epoch+1}/{EPOCHS}], Loss: {total_loss/len(dataloader):.6f}")

训练过程大约几十秒完成(取决于GPU)。最终loss会降到0.001以下,表示模型学会了拟合训练数据。


7. 模型评估:预测结果反归一化与可视化

7.1 进行预测

model.eval() with torch.no_grad(): test_predictions = model(X_tensor).cpu().numpy()

7.2 反归一化还原真实值

# 将预测值和真实值都还原回原始尺度 test_predictions_rescaled = scaler.inverse_transform(test_predictions) true_values_rescaled = scaler.inverse_transform(y_tensor.cpu().numpy())

7.3 可视化对比图

plt.figure(figsize=(14, 7)) plt.plot(true_values_rescaled, label="真实值", color='blue') plt.plot(test_predictions_rescaled, label="预测值", color='red', linestyle='--') plt.title("LSTM模型预测效果对比") plt.xlabel("时间步") plt.ylabel("乘客数量") plt.legend() plt.grid(True) plt.show()

你会发现红色虚线基本贴合蓝色实线,尤其是在中期表现良好。但在末尾可能出现一定偏差,这是过拟合或长期依赖衰减的常见现象。


8. 提升建议:如何进一步优化模型?

虽然我们的基础模型已经能工作,但实际项目中还可以做以下改进:

8.1 加入验证集防止过拟合

将最后24个样本作为验证集,在每个epoch后评估性能,及时停止训练。

train_size = int(len(X) * 0.8) X_train, X_test = X[:train_size], X[train_size:] y_train, y_test = y[:train_size], y[train_size:]

8.2 使用torch.compile()加速训练(PyTorch 2.0+新特性)

compiled_model = torch.compile(model) # 自动优化图执行

开启后,训练速度平均提升15%-30%,尤其在大型模型上更明显。

8.3 尝试双向LSTM或多层堆叠

self.lstm = nn.LSTM(input_size, hidden_layer_size, num_layers=2, bidirectional=True, batch_first=True)

多层和双向结构有助于捕捉更复杂的时序模式。

8.4 添加Dropout防止过拟合

self.lstm = nn.LSTM(input_size, hidden_layer_size, dropout=0.2, ...)

9. 总结:掌握核心步骤,快速迁移应用

9.1 关键步骤回顾

我们完整走了一遍时间序列预测的典型流程:

  1. 环境验证:确保PyTorch + GPU正常运行
  2. 数据加载:使用Pandas读取CSV并可视化趋势
  3. 数据预处理:归一化 + 滑动窗口构造样本
  4. 模型定义:构建LSTM网络结构
  5. 训练循环:定义损失函数、优化器并迭代训练
  6. 结果评估:反归一化后绘图对比预测与真实值
  7. 优化方向:加入验证集、编译加速、结构调整

这套方法可以轻松迁移到其他场景,比如:

  • 股价预测(需注意非平稳性)
  • 电力负荷预测(多变量输入)
  • 销量预测(结合节假日特征)

只需替换数据源,调整input_sizeSEQ_LENGTH即可复用大部分代码。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:42:11

Qwen-Image-2512用户体验优化:Web界面响应速度提升

Qwen-Image-2512用户体验优化:Web界面响应速度提升 1. 背景与使用场景 你有没有遇到过这种情况:刚部署好一个AI图像生成环境,满心期待地打开Web界面,结果点个按钮要等好几秒才有反应?加载节点卡顿、拖动工作流像幻灯…

作者头像 李华
网站建设 2026/9/2 21:39:09

Open-AutoGLM生产环境部署:稳定性与容错机制实战优化

Open-AutoGLM生产环境部署:稳定性与容错机制实战优化 Open-AutoGLM – 智谱开源的手机端AI Agent框架,正逐步成为自动化操作领域的热门选择。它将视觉语言模型(VLM)与安卓设备控制能力深度融合,赋予AI“看懂屏幕、理解…

作者头像 李华
网站建设 2026/9/2 1:11:03

揭秘JVM性能瓶颈:2026年最实用的5大调优参数设置策略

第一章:揭秘JVM性能瓶颈的起点 在构建高吞吐、低延迟的Java应用时,理解JVM的运行机制是优化性能的第一步。许多看似复杂的问题,如响应时间变长、GC频繁、内存溢出等,往往源于对JVM内部行为缺乏系统性认知。识别性能瓶颈的起点&…

作者头像 李华
网站建设 2026/9/3 0:57:15

【Java连接Redis实现分布式锁】:从入门到高并发场景下的最佳实践

第一章:Java连接Redis实现分布式锁的核心概念在高并发的分布式系统中,多个服务实例可能同时访问共享资源,为避免数据不一致问题,需引入分布式锁机制。Redis 凭借其高性能和原子操作特性,成为实现分布式锁的常用选择。J…

作者头像 李华
网站建设 2026/9/2 22:24:28

军工保密系统如何安全导出WordPress编辑的加密公式?

要求:开源,免费,技术支持 博客:WordPress 开发语言:PHP 数据库:MySQL 功能:导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台:Window…

作者头像 李华
网站建设 2026/9/2 23:59:02

Emotion2Vec+ Large车载语音系统集成:驾驶情绪预警功能设想

Emotion2Vec Large车载语音系统集成:驾驶情绪预警功能设想 1. 引言:让汽车“听懂”驾驶员的情绪 开车时,人的情绪波动其实比我们想象中更影响安全。愤怒、焦虑、疲惫甚至过度兴奋,都可能让反应变慢、判断失误。如果有一套系统能…

作者头像 李华