GluonTS项目中使用PyTorch Lightning构建自定义时间序列模型
前言
时间序列预测是机器学习领域的重要应用场景之一。GluonTS作为一个功能强大的时间序列预测工具库,提供了丰富的模型和工具。本文将重点介绍如何在GluonTS框架中使用PyTorch Lightning来实现自定义的时间序列预测模型。
准备工作
在开始构建模型前,我们需要准备环境和数据。首先导入必要的Python库:
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import lightning.pytorch as pl
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
数据集介绍
我们将使用电力消耗数据集作为示例。这个数据集包含了多个电力消耗时间序列,非常适合用于时间序列预测模型的训练和测试。
from gluonts.dataset.repository import get_dataset
dataset = get_dataset("electricity")
通过可视化可以直观了解数据特征:
date_formater = mdates.DateFormatter('%Y')
fig = plt.figure(figsize=(12,8))
for idx, entry in enumerate(islice(dataset.train, 9)):
ax = plt.subplot(3, 3, idx+1)
t = pd.date_range(start=entry["start"].to_timestamp(),
periods=len(entry["target"]),
freq=entry["start"].freq)
plt.plot(t, entry["target"])
plt.xticks(pd.date_range(start="2011-12-31", periods=3, freq="AS"))
ax.xaxis.set_major_formatter(date_formater)
模型架构设计
我们将构建一个基于前馈神经网络的概率预测模型。该模型的核心特点是:
- 使用神经网络输出参数化分布的参数
- 默认使用Student's t分布作为输出分布
- 支持自定义隐藏层维度
class FeedForwardNetwork(nn.Module):
def __init__(
self,
prediction_length: int,
context_length: int,
hidden_dimensions: List[int],
distr_output = StudentTOutput(),
batch_norm: bool=False,
scaling: Callable=mean_abs_scaling,
) -> None:
super().__init__()
# 初始化代码...
def forward(self, past_target):
# 前向传播逻辑...
def get_predictor(self, input_transform, batch_size=32):
# 创建预测器...
使用PyTorch Lightning进行训练
PyTorch Lightning简化了训练过程的管理。我们只需继承基础模型类并实现几个关键方法:
class LightningFeedForwardNetwork(FeedForwardNetwork, pl.LightningModule):
def training_step(self, batch, batch_idx):
# 定义训练步骤...
def configure_optimizers(self):
# 配置优化器...
数据加载与预处理
时间序列数据需要特殊的预处理方式:
- 处理缺失值
- 创建适当的训练实例
- 批量处理数据
mask_unobserved = AddObservedValuesIndicator(
target_field=FieldName.TARGET,
output_field=FieldName.OBSERVED_VALUES,
)
training_splitter = InstanceSplitter(
# 配置实例分割参数...
)
data_loader = TrainDataLoader(
# 配置数据加载器...
)
模型训练与评估
训练过程非常简单:
trainer = pl.Trainer(max_epochs=10)
trainer.fit(net, data_loader)
训练完成后,我们可以创建预测器并进行评估:
predictor_pytorch = net.get_predictor(mask_unobserved + prediction_splitter)
forecast_it, ts_it = make_evaluation_predictions(
dataset=dataset.test, predictor=predictor_pytorch
)
# 可视化预测结果
plt.figure(figsize=(20, 15))
# 绘图代码...
性能评估
最后,我们计算模型的评估指标:
evaluator = Evaluator(quantiles=[0.1, 0.5, 0.9])
metrics_pytorch, _ = evaluator(tss_pytorch, forecasts_pytorch)
pd.DataFrame.from_records(metrics_pytorch, index=["FeedForward"]).transpose()
总结
本文详细介绍了在GluonTS框架中使用PyTorch Lightning构建自定义时间序列模型的完整流程。通过这种方法,我们可以充分利用PyTorch的灵活性和PyTorch Lightning的训练管理能力,同时还能与GluonTS的其他组件无缝集成。这种组合为时间序列预测任务提供了强大的工具集。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考