从零到上手的Python时序数据预测完整指南
作者:detayun
时序预测是实际工作中最高频的需求之一,这篇文章针对时序预测任务提供了实用指南,重点解决实际应用中常见问题,文中的示例代码讲解详细,希望对大家有所帮助
为什么要写这篇
时序预测是实际工作中最高频的需求之一——销量预测、股价走势、服务器负载、电力消耗,本质都是同一个问题:根据过去,预测未来。
但很多人一上来就调模型,结果要么过拟合,要么数据泄漏,预测结果看着还行,上线就崩。
这篇文章不堆公式,重点讲怎么做才能真正跑通。
一、时序预测的核心流程
原始数据 → 预处理 → 滑动窗口 → 模型训练 → 预测评估
看着简单,每个环节都有坑。
二、数据预处理:80%的问题出在这里
1. 缺失值处理
import pandas as pd # 前向填充(适合连续数据,如传感器) df['value'] = df['value'].ffill() # 线性插值(适合有趋势的数据) df['value'] = df['value'].interpolate(method='linear')
2. 归一化——最容易踩的坑
必须只用训练集fit,再transform测试集。
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() train_scaled = scaler.fit_transform(train[['value']]) # 只fit训练集 test_scaled = scaler.transform(test[['value']]) # 只transform
用全局数据fit,等于把未来信息泄漏进了训练过程,指标虚高,上线翻车。
3. 滑动窗口切分
把连续的时间序列切成 (样本, 历史步长, 特征数) 的格式:
import numpy as np
def create_sequences(data, seq_len):
xs, ys = [], []
for i in range(len(data) - seq_len):
xs.append(data[i:i+seq_len])
ys.append(data[i+seq_len])
return np.array(xs), np.array(ys)
seq_len = 30 # 用过去30步预测下1步
X, y = create_sequences(train_scaled, seq_len)
三、模型选择:别一上来就Transformer
| 模型 | 数据量要求 | 序列长度 | 推荐指数 |
|---|---|---|---|
| LSTM | 小(<1万条) | 短(<200) | ⭐⭐⭐⭐ |
| GRU | 同上 | 同上 | ⭐⭐⭐⭐ |
| Informer | 中(1万~10万) | 长(>500) | ⭐⭐⭐⭐⭐ |
| PatchTST | 中大 | 任意 | ⭐⭐⭐⭐⭐ |
| N-BEATS | 中大 | 任意 | ⭐⭐⭐⭐ |
新手建议从LSTM开始,理解了循环结构再上Transformer。
四、完整实战代码(LSTM)
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# ---- 模型定义 ----
class LSTMPredictor(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers,
batch_first=True, dropout=0.2)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.lstm(x)
out = self.fc(out[:, -1, :]) # 取最后一步输出
return out
# ---- 训练 ----
model = LSTMPredictor(input_size=1, hidden_size=64,
num_layers=2, output_size=1)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
train_dataset = TensorDataset(
torch.FloatTensor(X), torch.FloatTensor(y)
)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=False) # 时序不能shuffle
for epoch in range(50):
for batch_x, batch_y in train_loader:
pred = model(batch_x)
loss = criterion(pred, batch_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# ---- 预测 ----
model.eval()
with torch.no_grad():
test_input = torch.FloatTensor(X_test)
pred = model(test_input)
pred_original = scaler.inverse_transform(pred.numpy()) # 反归一化
五、评估——别只看RMSE
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
mae = mean_absolute_error(y_true, y_pred)
mape = mean_absolute_percentage_error(y_true, y_pred)
rmse = np.sqrt(np.mean((y_true - y_pred) ** 2))
print(f"MAE: {mae:.2f}, RMSE: {rmse:.2f}, MAPE: {mape:.2%}")
但指标只是数字,一定要画图:
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 4))
plt.plot(y_true, label='真实值')
plt.plot(y_pred, label='预测值')
plt.legend()
plt.title('时序预测 vs 真实值')
plt.show()
六、三个最常见的坑
| 坑 | 表现 | 解决方式 |
|---|---|---|
| 数据泄漏 | 训练指标很好,测试很差 | 归一化只fit训练集,不shuffle |
| 递归预测误差累积 | 预测越远越离谱 | 用多输出策略,一次预测N步 |
| 评估方式错误 | 随机split导致未来信息混入 | 按时间顺序切分,前80%训练后20%测试 |
时序预测不是调参比赛,是数据工程+模型选择+评估验证的综合能力。
先把数据处理对,再选合适的模型,最后用可视化验证结果——这三步做扎实,比换十个SOTA模型都管用。
如果你有具体场景(比如预测电商销量或服务器CPU),可以把数据特征告诉我,我帮你判断用哪个模型最合适。
到此这篇关于从零到上手的Python时序数据预测完整指南的文章就介绍到这了,更多相关Python时序数据预测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
