谱时域图神经网络 (StemGNN) 是一种基于图的多元时间序列预测模型。StemGNN 通过结合图傅里叶变换 (GFT) 和离散傅里叶变换 (DFT),在谱域中联合学习时间依赖性和序列间的相关性。

该方法在 Solar、METR-LA 和 PEMS-BAY 等地理时间数据集上取得了最先进的性能,并且

参考文献
-Defu Cao, Yujing Wang, Juanyong Duan, Ce Zhang, Xia Zhu, Congrui Huang, Yunhai Tong, Bixiong Xu, Jing Bai, Jie Tong, Qi Zhang (2020). “Spectral Temporal Graph Neural Network for Multivariate Time-series Forecasting”.


来源

GLU

 GLU (input_channel, output_channel)

GLU


来源

StockBlockLayer

 StockBlockLayer (time_step, unit, multi_layer, stack_cnt=0)

StockBlockLayer


来源

StemGNN

 StemGNN (h, input_size, n_series, futr_exog_list=None,
          hist_exog_list=None, stat_exog_list=None,
          exclude_insample_y=False, n_stacks=2, multi_layer:int=5,
          dropout_rate:float=0.5, leaky_rate:float=0.2, loss=MAE(),
          valid_loss=None, max_steps:int=1000, learning_rate:float=0.001,
          num_lr_decays:int=3, early_stop_patience_steps:int=-1,
          val_check_steps:int=100, batch_size:int=32,
          valid_batch_size:Optional[int]=None, windows_batch_size=32,
          inference_windows_batch_size=32, start_padding_enabled=False,
          step_size:int=1, scaler_type:str='robust', random_seed:int=1,
          drop_last_loader=False, alias:Optional[str]=None,
          optimizer=None, optimizer_kwargs=None, lr_scheduler=None,
          lr_scheduler_kwargs=None, dataloader_kwargs=None,
          **trainer_kwargs)

*StemGNN

谱时域图神经网络 (StemGNN) 是一种基于图的多元时间序列预测模型。StemGNN 通过结合图傅里叶变换 (GFT) 和离散傅里叶变换 (DFT),在谱域中联合学习时间依赖性和序列间的相关性。

参数
h: int, 预测范围。
input_size: int, 自回归输入大小, y=[1,2,3,4] input_size=2 -> y_[t-2:t]=[1,2]。
n_series: int, 时间序列数量。
futr_exog_list: str list, 未来外部列。
hist_exog_list: str list, 历史外部列。
stat_exog_list: str list, 静态外部列。
n_stacks: int=2, 模型中的堆叠数量。
multi_layer: int=5, StemGNN 块中 FC 隐藏层大小的乘数。
dropout_rate: float=0.5, dropout 比率。
leaky_rate: float=0.2, 潜在相关层中 LeakyReLU 层的 alpha 值。
loss: PyTorch module, 损失集合中实例化的训练损失类。
valid_loss: PyTorch module=loss, 损失集合中实例化的验证损失类。
max_steps: int=1000, 最大训练步数。
learning_rate: float=1e-3, 学习率,范围 (0, 1)。
num_lr_decays: int=-1, 学习率衰减次数,均匀分布在 max_steps 中。
early_stop_patience_steps: int=-1, 早停前验证迭代次数。
val_check_steps: int=100, 每隔多少训练步检查一次验证损失。
batch_size: int, 每个批次的窗口数量。
valid_batch_size: int=None, 每个验证和测试批次中不同序列的数量,如果为 None 则使用 batch_size。
windows_batch_size: int=32, 每个训练批次中抽样的窗口数量,默认为全部。
inference_windows_batch_size: int=32, 每个推理批次中抽样的窗口数量,-1 表示全部。
start_padding_enabled: bool=False, 如果为 True,模型将按 input size 在时间序列开头用零填充。
step_size: int=1, 每个时间数据窗口之间的步长。
scaler_type: str=‘robust’, 时间输入归一化的缩放器类型,见 temporal scalers。
random_seed: int, 用于 pytorch 初始化器和 numpy 生成器的随机种子。
drop_last_loader: bool=False, 如果为 True,TimeSeriesDataLoader 会丢弃最后一个非完整批次。
alias: str, 可选,模型的自定义名称。
optimizer: ‘torch.optim.Optimizer’ 的子类,可选,用户指定的优化器替代默认选择 (Adam)。
optimizer_kwargs: dict, 可选,用户指定的 `optimizer` 所使用的参数列表。
lr_scheduler: ‘torch.optim.lr_scheduler.LRScheduler’ 的子类,可选,用户指定的 lr_scheduler 替代默认选择 (StepLR)。
lr_scheduler_kwargs: dict, 可选,用户指定的 `lr_scheduler` 所使用的参数列表。
dataloader_kwargs: dict, 可选,`TimeSeriesDataLoader` 传递给 PyTorch Lightning 数据加载器的参数列表。
**trainer_kwargs: int, 继承自 PyTorch Lighning 的 trainer 的关键字 trainer 参数。
*


StemGNN.fit

 StemGNN.fit (dataset, val_size=0, test_size=0, random_seed=None,
              distributed_config=None)

*拟合。

`fit` 方法使用初始化参数(learning_rate, windows_batch_size, ...)和初始化期间定义的 `loss` 函数来优化神经网络的权重。在 `fit` 方法内部,我们使用一个 PyTorch Lightning 的 `Trainer`,它继承了初始化时的 `self.trainer_kwargs` 来定制其输入,详见 PL 的 trainer 参数。

该方法旨在与 SKLearn 类似的类兼容,特别是与 StatsForecast 库兼容。

默认情况下,`model` 不保存训练检查点以节省磁盘空间,如需保存,请在 `__init__` 中更改 `enable_checkpointing=True`。

参数
dataset: NeuralForecast 的 TimeSeriesDataset,详见文档
val_size: int, 用于时间交叉验证的验证集大小。
random_seed: int=None, 用于 pytorch 初始化器和 numpy 生成器的随机种子,会覆盖 model.__init__ 中的设置。
test_size: int, 用于时间交叉验证的测试集大小。
*


StemGNN.predict

 StemGNN.predict (dataset, test_size=None, step_size=1, random_seed=None,
                  quantiles=None, **data_module_kwargs)

*预测。

使用 PL 的 `Trainer` 执行 `predict_step` 进行神经网络预测。

参数
dataset: NeuralForecast 的 TimeSeriesDataset,详见文档
test_size: int=None, 用于时间交叉验证的测试集大小。
step_size: int=1, 每个窗口之间的步长。
random_seed: int=None, 用于 pytorch 初始化器和 numpy 生成器的随机种子,会覆盖 model.__init__ 中的设置。
quantiles: list of floats, 可选 (默认=None), 目标分位数预测。
**data_module_kwargs: PL 的 TimeSeriesDataModule 参数,详见文档。*

使用示例

使用 `predict` 方法训练模型并预测未来值。

import pandas as pd
import matplotlib.pyplot as plt

from neuralforecast import NeuralForecast
from neuralforecast.models import StemGNN
from neuralforecast.utils import AirPassengersPanel, AirPassengersStatic
from neuralforecast.losses.pytorch import MAE

Y_train_df = AirPassengersPanel[AirPassengersPanel.ds<AirPassengersPanel['ds'].values[-12]].reset_index(drop=True) # 132 train
Y_test_df = AirPassengersPanel[AirPassengersPanel.ds>=AirPassengersPanel['ds'].values[-12]].reset_index(drop=True) # 12 test

model = StemGNN(h=12,
                input_size=24,
                n_series=2,
                scaler_type='standard',
                max_steps=500,
                early_stop_patience_steps=-1,
                val_check_steps=10,
                learning_rate=1e-3,
                loss=MAE(),
                valid_loss=MAE(),
                batch_size=32
                )

fcst = NeuralForecast(models=[model], freq='ME')
fcst.fit(df=Y_train_df, static_df=AirPassengersStatic, val_size=12)
forecasts = fcst.predict(futr_df=Y_test_df)

# Plot predictions
fig, ax = plt.subplots(1, 1, figsize = (20, 7))
Y_hat_df = forecasts.reset_index(drop=False).drop(columns=['unique_id','ds'])
plot_df = pd.concat([Y_test_df, Y_hat_df], axis=1)
plot_df = pd.concat([Y_train_df, plot_df])

plot_df = plot_df[plot_df.unique_id=='Airline1'].drop('unique_id', axis=1)
plt.plot(plot_df['ds'], plot_df['y'], c='black', label='True')
plt.plot(plot_df['ds'], plot_df['StemGNN'], c='blue', label='Forecast')
ax.set_title('AirPassengers Forecast', fontsize=22)
ax.set_ylabel('Monthly Passengers', fontsize=20)
ax.set_xlabel('Year', fontsize=20)
ax.legend(prop={'size': 15})
ax.grid()

使用 `cross_validation` 预测多个历史值。

fcst = NeuralForecast(models=[model], freq='M')
forecasts = fcst.cross_validation(df=AirPassengersPanel, static_df=AirPassengersStatic, n_windows=2, step_size=12)

# Plot predictions
fig, ax = plt.subplots(1, 1, figsize = (20, 7))
Y_hat_df = forecasts.loc['Airline1']
Y_df = AirPassengersPanel[AirPassengersPanel['unique_id']=='Airline1']

plt.plot(Y_df['ds'], Y_df['y'], c='black', label='True')
plt.plot(Y_hat_df['ds'], Y_hat_df['StemGNN'], c='blue', label='Forecast')
ax.set_title('AirPassengers Forecast', fontsize=22)
ax.set_ylabel('Monthly Passengers', fontsize=20)
ax.set_xlabel('Year', fontsize=20)
ax.legend(prop={'size': 15})
ax.grid()