Awesome
robust-probabilistic-forecasting
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