## TODO ## Make the cross validation model get saved as well and log the params and model as mlflow artifacts import pandas as pd from modules.neuralforecast.core import NeuralForecast from modules.neuralforecast.models import TSMixer, TSMixerx, NHITS, MLPMultivariate, NBEATSx from modules.neuralforecast.losses.pytorch import MSE, MAE, MAPE from sklearn.preprocessing import StandardScaler import numpy as np import os horizon = 30 input_size = horizon*2 models = [ TSMixer(h=horizon, input_size=input_size, n_series=1, max_steps=1000, val_check_steps=100, early_stop_patience_steps=5, scaler_type='identity', loss=MAPE(), valid_loss=MAPE(), random_seed=12345678, ), TSMixerx(h=horizon, input_size=input_size, n_series=1, max_steps=1000, val_check_steps=100, early_stop_patience_steps=5, scaler_type='identity', dropout=0.7, loss=MAPE(), valid_loss=MAPE(), random_seed=12345678, futr_exog_list=['Gas', 'DXY', 'BrFu', 'BrDa'], ), NBEATSx(h=horizon, input_size=horizon, max_steps=1000, val_check_steps=100, early_stop_patience_steps=5, scaler_type='identity', loss=MAPE(), valid_loss=MAPE(), random_seed=12345678, futr_exog_list=['Gas', 'DXY', 'BrFu', 'BrDa'] ), ] nf = NeuralForecast( models=models, freq='D') Y_hat_df = nf.cross_validation(df=df, val_size=val_size, test_size=test_size, n_windows=None ) Y_hat_df = Y_hat_df.reset_index() # Start from here # Using MLflow # Log your neuralforecast experiments to MLflow # Installing dependencies # To install Neuralforecast refer to https://nixtlaverse.nixtla.io/neuralforecast/examples/installation.html. # To install mlflow: pip install mlflow # Imports import logging import os import warnings import matplotlib.pyplot as plt import mlflow import mlflow.data import numpy as np import pandas as pd from mlflow.client import MlflowClient from mlflow.data.pandas_dataset import PandasDataset from utilsforecast.plotting import plot_series from neuralforecast.core import NeuralForecast from neuralforecast.models import NBEATSx from neuralforecast.utils import AirPassengersDF from neuralforecast.losses.pytorch import MAE os.environ['NIXTLA_ID_AS_COL'] = '1' logging.getLogger("mlflow").setLevel(logging.ERROR) logging.getLogger("pytorch_lightning").setLevel(logging.ERROR) warnings.filterwarnings("ignore") # Splitting the data # Split data and declare panel dataset Y_df = AirPassengersDF Y_train_df = Y_df[Y_df.ds<='1959-12-31'] # 132 train Y_test_df = Y_df[Y_df.ds>'1959-12-31'] # 12 test Y_df.tail() # unique_id ds y # 139 1.0 1960-08-31 606.0 # 140 1.0 1960-09-30 508.0 # 141 1.0 1960-10-31 461.0 # 142 1.0 1960-11-30 390.0 # 143 1.0 1960-12-31 432.0 # MLflow UI # Run the following command from the terminal to start the UI: mlflow ui. You can then go to the printed URL to visualize the experiments. # Model training mlflow.pytorch.autolog(checkpoint=False) with mlflow.start_run() as run: # Log the dataset to the MLflow Run. Specify the "training" context to indicate that the # dataset is used for model training dataset: PandasDataset = mlflow.data.from_pandas(Y_df, source="AirPassengersDF") mlflow.log_input(dataset, context="training") # Define and log parameters horizon = len(Y_test_df) model_params = dict( input_size=1 * horizon, h=horizon, max_steps=300, loss=MAE(), valid_loss=MAE(), activation='ReLU', scaler_type='robust', random_seed=42, enable_progress_bar=False, ) mlflow.log_params(model_params) # Fit NBEATSx model models = [NBEATSx(**model_params)] nf = NeuralForecast(models=models, freq='M') train = nf.fit(df=Y_train_df, val_size=horizon) # Save conda environment used to run the model mlflow.pytorch.get_default_conda_env() # Save pip requirements mlflow.pytorch.get_default_pip_requirements() mlflow.pytorch.autolog(disable=True) # Save the neural forecast model nf.save(path='./checkpoints/test_run_1/', model_index=None, overwrite=True, save_dataset=True) #Seed set to 42 #Forecasting the future Y_hat_df = nf.predict(futr_df=Y_test_df) plot_series(Y_train_df, Y_hat_df, palette='tab20b')