Embedding


source

DataEmbedding_wo_pos

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

DataEmbedding_wo_pos

DFT decomposition


source

DFT_series_decomp

 DFT_series_decomp (top_k)

Series decomposition block

Mixing


source

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


source

MultiScaleTrendMixing

 MultiScaleTrendMixing (seq_len, down_sampling_window,
                        down_sampling_layers)

Top-down mixing trend pattern


source

MultiScaleSeasonMixing

 MultiScaleSeasonMixing (seq_len, down_sampling_window,
                         down_sampling_layers)

Bottom-up mixing season pattern

2. Model


source

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, step_size:int=1,
            scaler_type:str='identity', random_seed:int=1,
            num_workers_loader:int=0, drop_last_loader:bool=False,
            optimizer=None, optimizer_kwargs=None, lr_scheduler=None,
            lr_scheduler_kwargs=None, dataloader_kwargs=None,
            **trainer_kwargs)

*TimeMixer Parameters
h: int, Forecast horizon.
input_size: int, autorregresive inputs size, y=[1,2,3,4] input_size=2 -> y_[t-2:t]=[1,2].
n_series: int, number of time-series.
futr_exog_list: str list, future exogenous columns.
hist_exog_list: str list, historic exogenous columns.
stat_exog_list: str list, static exogenous columns.
d_model: int, dimension of the model.
d_ff: int, dimension of the fully-connected network.
dropout: float, dropout rate.
e_layers: int, number of encoder layers.
top_k: int, number of selected frequencies.
decomp_method: str, method of series decomposition [moving_avg, dft_decomp].
moving_avg: int, window size of moving average.
channel_independence: int, 0: channel dependence, 1: channel independence.
down_sampling_layers: int, number of downsampling layers.
down_sampling_window: int, size of downsampling window.
down_sampling_method: str, down sampling method [avg, max, conv].
use_norm: bool, whether to normalize or not.
decoder_input_size_multiplier: float = 0.5.
loss: PyTorch module, instantiated train loss class from losses collection.
valid_loss: PyTorch module=loss, instantiated valid loss class from losses collection.
max_steps: int=1000, maximum number of training steps.
learning_rate: float=1e-3, Learning rate between (0, 1).
num_lr_decays: int=-1, Number of learning rate decays, evenly distributed across max_steps.
early_stop_patience_steps: int=-1, Number of validation iterations before early stopping.
val_check_steps: int=100, Number of training steps between every validation loss check.
batch_size: int=32, number of different series in each batch.
step_size: int=1, step size between each window of temporal data.
scaler_type: str=‘identity’, type of scaler for temporal inputs normalization see temporal scalers.
random_seed: int=1, random_seed for pytorch initializer and numpy generators.
num_workers_loader: int=os.cpu_count(), workers to be used by TimeSeriesDataLoader.
drop_last_loader: bool=False, if True TimeSeriesDataLoader drops last non-full batch.
alias: str, optional, Custom name of the model.
optimizer: Subclass of ‘torch.optim.Optimizer’, optional, user specified optimizer instead of the default choice (Adam).
optimizer_kwargs: dict, optional, list of parameters used by the user specified optimizer.
lr_scheduler: Subclass of ‘torch.optim.lr_scheduler.LRScheduler’, optional, user specified lr_scheduler instead of the default choice (StepLR).
lr_scheduler_kwargs: dict, optional, list of parameters used by the user specified lr_scheduler.
dataloader_kwargs: dict, optional, list of parameters passed into the PyTorch Lightning dataloader by the TimeSeriesDataLoader.
**trainer_kwargs: int, keyword trainer arguments inherited from PyTorch Lighning’s trainer.

References
Shiyu Wang, Haixu Wu, Xiaoming Shi, Tengge Hu, Huakun Luo, Lintao Ma, James Y. Zhang, Jun Zhou.”TimeMixer: Decomposable Multiscale Mixing For Time Series Forecasting”*


TimeMixer.fit

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

*Fit.

The fit method, optimizes the neural network’s weights using the initialization parameters (learning_rate, windows_batch_size, …) and the loss function as defined during the initialization. Within fit we use a PyTorch Lightning Trainer that inherits the initialization’s self.trainer_kwargs, to customize its inputs, see PL’s trainer arguments.

The method is designed to be compatible with SKLearn-like classes and in particular to be compatible with the StatsForecast library.

By default the model is not saving training checkpoints to protect disk memory, to get them change enable_checkpointing=True in __init__.

Parameters:
dataset: NeuralForecast’s TimeSeriesDataset, see documentation.
val_size: int, validation size for temporal cross-validation.
test_size: int, test size for temporal cross-validation.
*


TimeMixer.predict

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

*Predict.

Neural network prediction with PL’s Trainer execution of predict_step.

Parameters:
dataset: NeuralForecast’s TimeSeriesDataset, see documentation.
test_size: int=None, test size for temporal cross-validation.
step_size: int=1, Step size between each window.
**data_module_kwargs: PL’s TimeSeriesDataModule args, see documentation.*

3. Usage example

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='M')
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()

Using cross_validation to forecast multiple historic values.

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()