嵌入


源码

DataEmbedding_wo_pos

 DataEmbedding_wo_pos (c_in, d_model, dropout=0.1, embed_type='fixed',
                       freq='h')

DataEmbedding_wo_pos

DFT 分解


源码

DFT_series_decomp

 DFT_series_decomp (top_k)

序列分解块

混合


源码

PastDecomposableMixing

 PastDecomposableMixing (seq_len, pred_len, down_sampling_window,
                         down_sampling_layers, d_model, dropout,
                         channel_independence, decomp_method, d_ff,
                         moving_avg, top_k)

PastDecomposableMixing


源码

MultiScaleTrendMixing

 MultiScaleTrendMixing (seq_len, down_sampling_window,
                        down_sampling_layers)

自上而下的混合趋势模式


源码

MultiScaleSeasonMixing

 MultiScaleSeasonMixing (seq_len, down_sampling_window,
                         down_sampling_layers)

自下而上的混合季节模式

2. 模型


源码

TimeMixer

 TimeMixer (h, input_size, n_series, stat_exog_list=None,
            hist_exog_list=None, futr_exog_list=None, d_model:int=32,
            d_ff:int=32, dropout:float=0.1, e_layers:int=4, top_k:int=5,
            decomp_method:str='moving_avg', moving_avg:int=25,
            channel_independence:int=0, down_sampling_layers:int=1,
            down_sampling_window:int=2, down_sampling_method:str='avg',
            use_norm:bool=True, decoder_input_size_multiplier:float=0.5,
            loss=MAE(), valid_loss=None, max_steps:int=1000,
            learning_rate:float=0.001, num_lr_decays:int=-1,
            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='identity', random_seed:int=1,
            drop_last_loader:bool=False, alias:Optional[str]=None,
            optimizer=None, optimizer_kwargs=None, lr_scheduler=None,
            lr_scheduler_kwargs=None, dataloader_kwargs=None,
            **trainer_kwargs)

*TimeMixer 参数
h: int,预测视窗。
input_size: int,自回归输入大小,y=[1,2,3,4],input_size=2 -> y_[t-2:t]=[1,2]。
n_series: int,时间序列数量。
stat_exog_list: str list,静态外部变量列。
hist_exog_list: str list,历史外部变量列。
futr_exog_list: str list,未来外部变量列。
d_model: int,模型维度。
d_ff: int,全连接网络的维度。
dropout: float,dropout 比率。
e_layers: int,编码器层数。
top_k: int,选定的频率数量。
decomp_method: str,序列分解方法 [moving_avg, dft_decomp]。
moving_avg: int,移动平均窗口大小。
channel_independence: int,0: 通道依赖,1: 通道独立。
down_sampling_layers: int,下采样层数。
down_sampling_window: int,下采样窗口大小。
down_sampling_method: str,下采样方法 [avg, max, conv]。
use_norm: bool,是否进行归一化。
decoder_input_size_multiplier: float = 0.5。
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=32,每个批次中不同时间序列的数量。
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,模型将在时间序列开头用零进行填充,填充长度为输入大小。
step_size: int=1,每个时间数据窗口之间的步长。
scaler_type: str=‘identity’,用于时间输入归一化的缩放器类型,详见时间缩放器
random_seed: int=1,用于 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:从PyTorch Lightning 的 trainer 继承的关键字 trainer 参数。

参考文献
Shiyu Wang, Haixu Wu, Xiaoming Shi, Tengge Hu, Huakun Luo, Lintao Ma, James Y. Zhang, Jun Zhou.“TimeMixer: 可分解的多尺度混合时间序列预测模型”
*


TimeMixer.fit

 TimeMixer.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`。

该方法被设计为兼容类似 SKLearn 的类,尤其是兼容 StatsForecast 库。

默认情况下,model 不保存训练检查点以节省磁盘空间,要获取它们,请在 __init__ 中将 enable_checkpointing 设置为 True

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


TimeMixer.predict

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

*预测。

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

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

3. 使用示例

import pandas as pd
import matplotlib.pyplot as plt

from neuralforecast import NeuralForecast
from neuralforecast.models import TimeMixer
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 = TimeMixer(h=12,
                input_size=24,
                n_series=2,
                scaler_type='standard',
                max_steps=500,
                early_stop_patience_steps=-1,
                val_check_steps=5,
                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['TimeMixer'], c='blue', label='median')
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['TimeMixer'], 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()