robust-probabilistic-forecasting
February 23, 2022 ยท View on GitHub
This is the public repo for the paper "Robust Probabilistic Time Series Forecasting" (AISTATS '22).
Requirements
Recent versions of GluonTS, PyTorch, and PyTorch Lightning.
Datasets
Use the following 4 dataset names and the corresponding specified parameters to reproduce the results of the paper.
exchange_rate_nips prediction_length = 30
context_length = 120
freq = 'B'
m4_daily prediction_length = 14
context_length = 56
freq = 'D'
traffic_nips prediction_length = 24
context_length = 96
freq = 'H'
electricity_nips prediction_length = 24
context_length = 96
freq = 'H'
Model training
Run train.py. This file has the following set of command-line arguments:
--dataset: Name of the dataset
--context_length: Model's context length
--prediction_length: Model's prediction length
--batch_size: Batch size for training
--epochs: Number of training epochs
--perform_augmentation: Whether to perform randomized training (bool)
--num_noises: Number of random noises per training series
--sigma: Magnitude of noise used for randomized training
An example command line input
python train.py --dataset exchange_rate_nips --context_length 120 --prediction_length 30 --batch_size 128 --epochs 50 --perform_augmentation True --num_noises 100 --sigma 0.1
Keep track of the path within the training log, where the model checkpoint is stored.
Additive adversarial attack
Params file generation
First run generate_params.py. This file has command line arguments
--n_iterations: Number of iterations to compute attack
--learning_rate: Learning rate used by the optimizer
--attack_idx: List of attack indices; intergers separated by blank spaces
--filename: Path to the .json file to be generated
Example run:
python generate_params.py --attack_idx -1
This will create a .json file under the directory './attack_params/...'.
Perform adversarial attack and save the results
Then run attack_and_save.py, as in:
python attack_and_save.py --dataset exchange_rate_nips --context_length 120 --prediction_length 30 --model_type vanilla --model_path ./lightning_logs/version_X/checkpoints/epoch=XX-step=XXXX.ckpt --device cuda:0 --attack_params_path ./attack_params/basic_setup_attack_idx_[-1].json
Note that this file has command line arguments
--dataset Name of the dataset
--context_length: Model's context length
--prediction_length: Model's prediction length
--model_type: An indicator of the forecaster type, e.g., vanilla, RT, etc.
--model_path: Path to model checkpoint
--device: Device ('cpu' or 'cuda:X')
--batch_size: Batch size used for inference
--attack_params_path: Path to json file containing attack parameters
--num_parallel_samples: Number of sample paths used to perform adversarial attack
This will create a .pkl file under the directory './attack_results/...' which contains the attack results.
Evaluation
Run evaluate_adversarial.py.
This file has the same command line arguments as 'attack_and_save.py', plus:
--freq: The frequency type ('B', 'D', 'H', etc.) of the dataset
--num_noised_samples: Number of sample paths used to perform smoothed inference (randomized smoothing)
Example run:
python evaluate_adversarial.py --dataset exchange_rate_nips --context_length 120 --prediction_length 30 --freq B --model_type vanilla --model_path ./lightning_logs/version_X/checkpoints/epoch=XX-step=XXXX.ckpt --device cuda:0 --attack_params_path ./attack_params/basic_setup_attack_idx_[-1].json
This will create a .pkl file under the directory './metrics/...' which contains the evaluation results.
Visualization
Run visualize_adversarial.py.
Use the command line arguments
--metric_path_base: Path to .pkl file containing the Metrics type object (from vanilla model)
--metric_path_rand: Path to .pkl file containing the Metrics type object (from random-trained model)
--figure_path: Path to save the figure to
--criterion: Metric of interest: should be one of MSE, MAPE, or ND (default is ND)
--sigma_idx: Index of the column corresponding to the desired value of smoothing variance
--max_tolerance_idx: Index of the maximum index within the tolerance list to plot
Example run:
python visualize_adversarial.py --metric_path_base metrics/XXX.pkl --metric_path_rand metrics/XXX.pkl --figure_path figures/XXX.png --criterion ND --sigma_idx -1 --max_tolerance_idx -1
Time shift with noisy observation
Evaluation
Run evaluate_translation.py.
This file has the following set of command-line arguments:
--dataset: Name of the dataset
--context_length: Model's context length
--prediction_length: Model's prediction length
--model_type: Any indicator of the model
--model_path: Path to model checkpoint
--device: Device ('cpu' or 'cuda:X')
--batch_size: Batch size used in inference (forecast generation)
Example run:
python evaluate_translation.py --dataset m4_daily --context_length 56 --prediction_length 14 --model_type vanilla --model_path ./lightning_logs/version_XX/checkpoints/epoch=XX-step=XXXX.ckpt --device cuda:0
This will create a .npy file under the directory './translation_metrics/...'
Visualization
Run visualize_translation.py.
Use the command line arguments
--table_path_base: Path to .npy file containing the evaluation results (from vanilla model)
--table_path_rand: Path to .npy file containing the evaluation results (from random-trained model)
--figure_path: Path to save the figure to
--sigma_idx: Index of the column corresponding to the desired value of smoothing variance
Example run:
python visualize_translation.py --table_path_base ./translation_metrics/XXX.npy --table_path_rand ./translation_metrics/XXX.npy --figure_path ./figures/XXX.png