CTU-NETMON/NetTS-eval

0

stars

0

commits

Jupyter Notebook

primary language

May 13, 2026

updated

README

NetTS-eval

Evaluation harness for NetTS — five diagnostic benchmarks for network traffic time series forecasting, built on the publicly available CESNET-TimeSeries24 dataset. This repository reproduces the baseline results reported in the NeurIPS Datasets and Benchmarks submission and provides a foundation for future model comparisons.

Dataset (CESNET-TimeSeries24) · Benchmark construction (NetTS-experiments) · Croissant metadata


Motivation

Network traffic forecasting lacks a standardized evaluation framework. Prior work relies on private datasets, incompatible entity subsets, or undifferentiated dataset characteristics — making cross-method comparison unreliable. NetTS addresses this by isolating five distinct behavioral properties of network traffic into separate benchmarks. When a model fails, the cause can be traced to a concrete behavior rather than a generic dataset artifact.


NetTS

NetTS draws series from CESNET-TimeSeries24, a large-scale volumetric dataset collected from the CESNET3 ISP backbone network. The target variable is n_bytes (total bytes per interval). Missing intervals are filled with zero (no traffic, not absent data).

Temporal coverage: ~280 days per resolution. All series share a common 60/20/20 chronological train/val/test split.

ResolutionTotal timestepsTrainValidationTest
Hourly6,7184,030 h1,344 h1,344 h
10-minute40,29824,178 steps8,060 steps8,060 steps

Benchmark Types

Each benchmark isolates one characteristic behaviour. Series are selected via a two-stage pipeline: threshold-based scoring (Stage 1) followed by random sampling from qualifiers (Stage 2). Pre-computed score CSVs are available in NetTS-experiments to skip the expensive Stage 1.

BenchmarkBehaviourAggregation levelscesnet-tszoo name
seasonalStrong daily/weekly periodicity (STL seasonal strength ≥ 0.7)Institution · Subnet · IPNetTS_seasonal
driftSustained distribution shift visible in the test periodInstitution · Subnet · IPNetTS_drift
periodic_spacesStructured zero/non-zero traffic cycles (e.g. nights, weekends)IP onlyNetTS_periodic_spaces
workersWeekday business-hours concentration; silent on weekendsIP onlyNetTS_workers
randomNear white-noise, minimal temporal structureInstitution · Subnet · IPNetTS_random

Series Counts

Hourly:

BenchmarkInstitutionsSubnetsIPsTotal
seasonal25252575
drift25252575
periodic_spaces2525
workers2525
random13252563
Total263

10-minute:

BenchmarkInstitutionsSubnetsIPsTotal
seasonal25252575
drift25252575
periodic_spaces2525
workers2525
random19252569
Total269

Curated series IDs live in benchmarks/selected_ids/ (tracked in git). Benchmark data files (CSV/Parquet) are generated from CESNET-TimeSeries24 and are not tracked — see Setup.


Evaluation Protocol

Method: Rolling-origin (sliding window) forecast over the 20% test split. Each window uses the preceding context as input and predicts the next fixed-horizon block.

Primary metric: MASE, normalised per series by its own seasonal-naive in-sample error (seasonal period m = 24 for hourly, m = 144 for 10-minute). Lower is better. Secondary metric: RMSSE.

Rankings use average rank (lower = better) computed per series across all models. The overall leaderboard pools per-benchmark average ranks across all four configurations. Seasonal Naive is the reference baseline.

Configurations

ConfigurationResolutionContext (C)Horizon (H)
h_168_24Hourly168 steps (7 days)24 steps (1 day)
h_744_168Hourly744 steps (31 days)168 steps (7 days)
m_288_14410-min288 steps (2 days)144 steps (1 day)
m_1008_14410-min1,008 steps (7 days)144 steps (1 day)

Baseline Results

Overall (pooled across 4 configurations and 5 benchmarks)

RankModelTypeDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFMFoundation2.672.683.143.502.772.95
2ChronosFoundation2.151.884.424.583.023.21
3MoiraiFoundation3.394.224.634.183.213.93
4GRUDeep learning5.756.324.723.034.764.91
5GRU-FCNDeep learning5.785.174.844.055.485.06
6LSTMDeep learning6.446.544.953.445.535.38
7TTMFoundation5.494.966.446.485.615.80
8SARIMAStatistical7.427.246.918.277.827.53
9Seasonal Naive (baseline)Statistical7.827.867.208.148.717.94
10ProphetStatistical8.108.137.759.338.108.28

Foundation models (TimesFM, Chronos, Moirai) lead on Seasonal, Drift, and Random benchmarks. Deep learning models (GRU, LSTM) outperform on Workers, where the binary weekday/weekend structure is learnable from scratch, but drop sharply on Periodic Spaces at 10-minute resolution.

Per-Benchmark Results

Seasonal — strong daily and weekly periodic patterns
RankModelTypeAvg Rank (pooled)
1ChronosFoundation1.88
2TimesFMFoundation2.68
3MoiraiFoundation4.22
4TTMFoundation4.96
5GRU-FCNDeep learning5.17
6GRUDeep learning6.32
7LSTMDeep learning6.54
8SARIMAStatistical7.24
9Seasonal Naive (baseline)Statistical7.86
10ProphetStatistical8.13
Drift — non-stationary trend changes over time
RankModelTypeAvg Rank (pooled)
1ChronosFoundation2.15
2TimesFMFoundation2.67
3MoiraiFoundation3.39
4TTMFoundation5.49
5GRUDeep learning5.75
6GRU-FCNDeep learning5.78
7LSTMDeep learning6.44
8SARIMAStatistical7.42
9Seasonal Naive (baseline)Statistical7.82
10ProphetStatistical8.10
Periodic Spaces — regular zero-traffic periods (e.g. nights, weekends)
RankModelTypeAvg Rank (pooled)
1TimesFMFoundation3.14
2ChronosFoundation4.42
3MoiraiFoundation4.63
4GRUDeep learning4.72
5GRU-FCNDeep learning4.84
6LSTMDeep learning4.95
7TTMFoundation6.44
8SARIMAStatistical6.91
9Seasonal Naive (baseline)Statistical7.20
10ProphetStatistical7.75
Workers — workstation patterns: active on workdays, silent on weekends
RankModelTypeAvg Rank (pooled)
1GRUDeep learning3.03
2LSTMDeep learning3.44
3TimesFMFoundation3.50
4GRU-FCNDeep learning4.05
5MoiraiFoundation4.18
6ChronosFoundation4.58
7TTMFoundation6.48
8Seasonal Naive (baseline)Statistical8.14
9SARIMAStatistical8.27
10ProphetStatistical9.33
Random — near white-noise, no discernible structure
RankModelTypeAvg Rank (pooled)
1TimesFMFoundation2.77
2ChronosFoundation3.02
3MoiraiFoundation3.21
4GRUDeep learning4.76
5GRU-FCNDeep learning5.48
6LSTMDeep learning5.53
7TTMFoundation5.61
8SARIMAStatistical7.82
9ProphetStatistical8.10
10Seasonal Naive (baseline)Statistical8.71

Per-Configuration Results

h_168_24 — 168-step context / 24-step horizon (hourly)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFM2.772.673.923.483.113.19
2Chronos2.332.005.045.003.893.65
3TTM3.594.124.003.883.683.85
4Moirai3.633.975.444.603.304.19
5GRU5.355.883.362.724.244.31
6LSTM6.676.443.042.445.404.80
7GRU-FCN5.073.805.686.565.375.29
8Seasonal Naive8.478.327.287.768.838.13
9Prophet8.439.058.208.768.198.53
10SARIMA8.718.759.049.809.009.06
h_744_168 — 744-step context / 168-step horizon (hourly)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFM2.331.853.303.922.522.79
2Chronos2.292.194.044.922.403.17
3Moirai2.472.514.323.962.813.21
4GRU-FCN7.197.553.041.887.325.39
5GRU7.418.084.122.286.485.67
6LSTM7.978.125.084.126.176.29
7SARIMA6.155.687.027.446.756.61
8TTM6.165.567.968.325.636.73
9Seasonal Naive5.336.257.268.407.466.94
10Prophet7.697.218.869.767.468.20
m_288_144 — 288-step context / 144-step horizon (10-minute)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFM3.043.571.582.122.782.62
2Chronos2.212.163.683.802.962.96
3Moirai3.775.373.723.123.283.85
4GRU-FCN5.444.805.724.044.614.92
5GRU5.055.648.285.524.335.77
6LSTM5.295.098.365.485.195.88
7TTM5.955.096.126.366.395.98
8SARIMA7.446.965.347.687.837.05
9Prophet8.077.955.468.928.297.74
10Seasonal Naive8.738.366.747.969.358.23
m_1008_144 — 1008-step context / 144-step horizon (10-minute)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1Chronos1.751.174.924.602.833.05
2TimesFM2.532.633.744.482.653.21
3GRU5.175.673.121.603.993.91
4Moirai3.695.035.045.043.434.45
5LSTM5.836.513.321.725.354.54
6GRU-FCN5.414.554.923.724.644.65
7TTM6.285.057.687.366.726.62
8SARIMA7.407.576.268.167.727.42
9Seasonal Naive8.738.517.508.449.198.47
10Prophet8.208.328.509.888.488.68

Models

ModelTypeNotes
Seasonal NaiveStatistical baselineRepeats last seasonal cycle (period 24 h / 144×10 min)
SARIMAStatisticalStatsmodels SARIMAX, refits each window
ProphetStatisticalFacebook Prophet with holiday calendar
TimesFMFoundation (zero-shot)Google TimesFM 2.5 200M, batched inference
TTMFoundation (zero-shot)IBM TTM, revision selected per context length
ChronosFoundation (zero-shot)Amazon Chronos 2, median quantile, batched
MoiraiFoundation (zero-shot)Salesforce Moirai 2.0-R-small via GluonTS
GRUDeep learningBidirectional GRU (tsai/fastai), log1p + per-window instance normalisation
LSTMDeep learningBidirectional LSTM (tsai/fastai), same pipeline as GRU
GRU-FCNDeep learningGRU + FCN hybrid (tsai/fastai), same pipeline

Setup

conda create -n nettseval python=3.12 -y
conda activate nettseval
pip install -r requirements.txt

Export Benchmark Data

Download CESNET-TimeSeries24 to ../data (see cesnet-tszoo docs), then export the benchmark CSVs:

python save_benchmarks.py

Reproducing Results

# Single model, single benchmark
python run_evaluation.py --model timesfm --benchmark seasonal

# All benchmarks
python run_evaluation.py --model chronos --benchmark all

# Specify configuration explicitly
python run_evaluation.py --model ttm --benchmark seasonal --freq h --lookback 744 --horizon 168

# Multiple repeated runs for variance estimation
python run_evaluation.py --model gru --benchmark all --n-runs 3

CLI Arguments

ArgumentDescriptionDefault
--modelOne or more model names (required)
--benchmarkOne or more benchmark types, or allall
--freqResolution: h=hourly, m=10minh
--lookbackContext window sizeh=168, m=288
--horizonForecast horizonh=24, m=144
--n-runsRepeated evaluation runs1
--save-predictionsSave per-window prediction CSVsoff
--configJSON file for model hyperparameter overrides

Generate Analysis Graphs and Tables

python -m result_exploration.generate
python -m result_exploration.generate --metrics rmse mase

Output is written to result_exploration/graphs/. Result directory paths per model are configured in result_exploration/analysis.py under EXPERIMENT_CONFIGS. The full analysis notebook (ranks, skill scores, significance tests) is at result_exploration/results.ipynb.


Adding New Models

  1. Create nettseval/models/newmodel.py, inherit from BaseModel
  2. Implement fit(train_data, target_column), predict(horizon), get_params(), get_name()
  3. Optionally implement tune(train, val, target_column, ts_id=None)dict | None for per-series hyperparameter fitting
  4. Optionally set supports_batch = True and implement predict_batch(contexts, target_column, horizon) for batched inference
  5. Export in nettseval/models/__init__.py
  6. Add to MODEL_ORDER in nettseval/constants.py and to create_model() in run_evaluation.py

See adding_a_model.md for a full guide with code templates.


Repository Structure

nettseval/                   # Main Python package
  models/                   # Model wrappers (BaseModel interface)
  benchmarks/               # BenchmarkSource, BenchmarkLoader
  evaluation/               # Evaluator, metrics registry, result storage
  utils/                    # EvaluationConfig dataclass
  constants.py              # MODEL_ORDER, DEFAULT_EVAL_METRICS, SEASONAL_PERIOD
run_evaluation.py            # Main CLI entry point
save_benchmarks.py           # Export NetTS from CESNET-TimeSeries24
benchmarks/                 # Benchmark CSVs/Parquet + selected_ids/ (IDs tracked in git)
results/                    # Evaluation output (gitignored)
result_exploration/         # Analysis pipeline (analysis.py, plots.py, generate.py)
  results.ipynb             # Full results notebook (ranks, skill scores, significance tests)
  predictions.ipynb         # Prediction visualization notebook
  bench_ts_sparsity/        # Benchmark time series sparsity analysis
metacentrum/                # PBS cluster job submission scripts

CTU-NETMON/NetTS-eval

0

stars

0

commits

Jupyter Notebook

primary language

May 13, 2026

updated

README

NetTS-eval

Evaluation harness for NetTS — five diagnostic benchmarks for network traffic time series forecasting, built on the publicly available CESNET-TimeSeries24 dataset. This repository reproduces the baseline results reported in the NeurIPS Datasets and Benchmarks submission and provides a foundation for future model comparisons.

Dataset (CESNET-TimeSeries24) · Benchmark construction (NetTS-experiments) · Croissant metadata


Motivation

Network traffic forecasting lacks a standardized evaluation framework. Prior work relies on private datasets, incompatible entity subsets, or undifferentiated dataset characteristics — making cross-method comparison unreliable. NetTS addresses this by isolating five distinct behavioral properties of network traffic into separate benchmarks. When a model fails, the cause can be traced to a concrete behavior rather than a generic dataset artifact.


NetTS

NetTS draws series from CESNET-TimeSeries24, a large-scale volumetric dataset collected from the CESNET3 ISP backbone network. The target variable is n_bytes (total bytes per interval). Missing intervals are filled with zero (no traffic, not absent data).

Temporal coverage: ~280 days per resolution. All series share a common 60/20/20 chronological train/val/test split.

ResolutionTotal timestepsTrainValidationTest
Hourly6,7184,030 h1,344 h1,344 h
10-minute40,29824,178 steps8,060 steps8,060 steps

Benchmark Types

Each benchmark isolates one characteristic behaviour. Series are selected via a two-stage pipeline: threshold-based scoring (Stage 1) followed by random sampling from qualifiers (Stage 2). Pre-computed score CSVs are available in NetTS-experiments to skip the expensive Stage 1.

BenchmarkBehaviourAggregation levelscesnet-tszoo name
seasonalStrong daily/weekly periodicity (STL seasonal strength ≥ 0.7)Institution · Subnet · IPNetTS_seasonal
driftSustained distribution shift visible in the test periodInstitution · Subnet · IPNetTS_drift
periodic_spacesStructured zero/non-zero traffic cycles (e.g. nights, weekends)IP onlyNetTS_periodic_spaces
workersWeekday business-hours concentration; silent on weekendsIP onlyNetTS_workers
randomNear white-noise, minimal temporal structureInstitution · Subnet · IPNetTS_random

Series Counts

Hourly:

BenchmarkInstitutionsSubnetsIPsTotal
seasonal25252575
drift25252575
periodic_spaces2525
workers2525
random13252563
Total263

10-minute:

BenchmarkInstitutionsSubnetsIPsTotal
seasonal25252575
drift25252575
periodic_spaces2525
workers2525
random19252569
Total269

Curated series IDs live in benchmarks/selected_ids/ (tracked in git). Benchmark data files (CSV/Parquet) are generated from CESNET-TimeSeries24 and are not tracked — see Setup.


Evaluation Protocol

Method: Rolling-origin (sliding window) forecast over the 20% test split. Each window uses the preceding context as input and predicts the next fixed-horizon block.

Primary metric: MASE, normalised per series by its own seasonal-naive in-sample error (seasonal period m = 24 for hourly, m = 144 for 10-minute). Lower is better. Secondary metric: RMSSE.

Rankings use average rank (lower = better) computed per series across all models. The overall leaderboard pools per-benchmark average ranks across all four configurations. Seasonal Naive is the reference baseline.

Configurations

ConfigurationResolutionContext (C)Horizon (H)
h_168_24Hourly168 steps (7 days)24 steps (1 day)
h_744_168Hourly744 steps (31 days)168 steps (7 days)
m_288_14410-min288 steps (2 days)144 steps (1 day)
m_1008_14410-min1,008 steps (7 days)144 steps (1 day)

Baseline Results

Overall (pooled across 4 configurations and 5 benchmarks)

RankModelTypeDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFMFoundation2.672.683.143.502.772.95
2ChronosFoundation2.151.884.424.583.023.21
3MoiraiFoundation3.394.224.634.183.213.93
4GRUDeep learning5.756.324.723.034.764.91
5GRU-FCNDeep learning5.785.174.844.055.485.06
6LSTMDeep learning6.446.544.953.445.535.38
7TTMFoundation5.494.966.446.485.615.80
8SARIMAStatistical7.427.246.918.277.827.53
9Seasonal Naive (baseline)Statistical7.827.867.208.148.717.94
10ProphetStatistical8.108.137.759.338.108.28

Foundation models (TimesFM, Chronos, Moirai) lead on Seasonal, Drift, and Random benchmarks. Deep learning models (GRU, LSTM) outperform on Workers, where the binary weekday/weekend structure is learnable from scratch, but drop sharply on Periodic Spaces at 10-minute resolution.

Per-Benchmark Results

Seasonal — strong daily and weekly periodic patterns
RankModelTypeAvg Rank (pooled)
1ChronosFoundation1.88
2TimesFMFoundation2.68
3MoiraiFoundation4.22
4TTMFoundation4.96
5GRU-FCNDeep learning5.17
6GRUDeep learning6.32
7LSTMDeep learning6.54
8SARIMAStatistical7.24
9Seasonal Naive (baseline)Statistical7.86
10ProphetStatistical8.13
Drift — non-stationary trend changes over time
RankModelTypeAvg Rank (pooled)
1ChronosFoundation2.15
2TimesFMFoundation2.67
3MoiraiFoundation3.39
4TTMFoundation5.49
5GRUDeep learning5.75
6GRU-FCNDeep learning5.78
7LSTMDeep learning6.44
8SARIMAStatistical7.42
9Seasonal Naive (baseline)Statistical7.82
10ProphetStatistical8.10
Periodic Spaces — regular zero-traffic periods (e.g. nights, weekends)
RankModelTypeAvg Rank (pooled)
1TimesFMFoundation3.14
2ChronosFoundation4.42
3MoiraiFoundation4.63
4GRUDeep learning4.72
5GRU-FCNDeep learning4.84
6LSTMDeep learning4.95
7TTMFoundation6.44
8SARIMAStatistical6.91
9Seasonal Naive (baseline)Statistical7.20
10ProphetStatistical7.75
Workers — workstation patterns: active on workdays, silent on weekends
RankModelTypeAvg Rank (pooled)
1GRUDeep learning3.03
2LSTMDeep learning3.44
3TimesFMFoundation3.50
4GRU-FCNDeep learning4.05
5MoiraiFoundation4.18
6ChronosFoundation4.58
7TTMFoundation6.48
8Seasonal Naive (baseline)Statistical8.14
9SARIMAStatistical8.27
10ProphetStatistical9.33
Random — near white-noise, no discernible structure
RankModelTypeAvg Rank (pooled)
1TimesFMFoundation2.77
2ChronosFoundation3.02
3MoiraiFoundation3.21
4GRUDeep learning4.76
5GRU-FCNDeep learning5.48
6LSTMDeep learning5.53
7TTMFoundation5.61
8SARIMAStatistical7.82
9ProphetStatistical8.10
10Seasonal Naive (baseline)Statistical8.71

Per-Configuration Results

h_168_24 — 168-step context / 24-step horizon (hourly)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFM2.772.673.923.483.113.19
2Chronos2.332.005.045.003.893.65
3TTM3.594.124.003.883.683.85
4Moirai3.633.975.444.603.304.19
5GRU5.355.883.362.724.244.31
6LSTM6.676.443.042.445.404.80
7GRU-FCN5.073.805.686.565.375.29
8Seasonal Naive8.478.327.287.768.838.13
9Prophet8.439.058.208.768.198.53
10SARIMA8.718.759.049.809.009.06
h_744_168 — 744-step context / 168-step horizon (hourly)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFM2.331.853.303.922.522.79
2Chronos2.292.194.044.922.403.17
3Moirai2.472.514.323.962.813.21
4GRU-FCN7.197.553.041.887.325.39
5GRU7.418.084.122.286.485.67
6LSTM7.978.125.084.126.176.29
7SARIMA6.155.687.027.446.756.61
8TTM6.165.567.968.325.636.73
9Seasonal Naive5.336.257.268.407.466.94
10Prophet7.697.218.869.767.468.20
m_288_144 — 288-step context / 144-step horizon (10-minute)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1TimesFM3.043.571.582.122.782.62
2Chronos2.212.163.683.802.962.96
3Moirai3.775.373.723.123.283.85
4GRU-FCN5.444.805.724.044.614.92
5GRU5.055.648.285.524.335.77
6LSTM5.295.098.365.485.195.88
7TTM5.955.096.126.366.395.98
8SARIMA7.446.965.347.687.837.05
9Prophet8.077.955.468.928.297.74
10Seasonal Naive8.738.366.747.969.358.23
m_1008_144 — 1008-step context / 144-step horizon (10-minute)
RankModelDriftSeasonalPeriodic SpacesWorkersRandomAvg Rank
1Chronos1.751.174.924.602.833.05
2TimesFM2.532.633.744.482.653.21
3GRU5.175.673.121.603.993.91
4Moirai3.695.035.045.043.434.45
5LSTM5.836.513.321.725.354.54
6GRU-FCN5.414.554.923.724.644.65
7TTM6.285.057.687.366.726.62
8SARIMA7.407.576.268.167.727.42
9Seasonal Naive8.738.517.508.449.198.47
10Prophet8.208.328.509.888.488.68

Models

ModelTypeNotes
Seasonal NaiveStatistical baselineRepeats last seasonal cycle (period 24 h / 144×10 min)
SARIMAStatisticalStatsmodels SARIMAX, refits each window
ProphetStatisticalFacebook Prophet with holiday calendar
TimesFMFoundation (zero-shot)Google TimesFM 2.5 200M, batched inference
TTMFoundation (zero-shot)IBM TTM, revision selected per context length
ChronosFoundation (zero-shot)Amazon Chronos 2, median quantile, batched
MoiraiFoundation (zero-shot)Salesforce Moirai 2.0-R-small via GluonTS
GRUDeep learningBidirectional GRU (tsai/fastai), log1p + per-window instance normalisation
LSTMDeep learningBidirectional LSTM (tsai/fastai), same pipeline as GRU
GRU-FCNDeep learningGRU + FCN hybrid (tsai/fastai), same pipeline

Setup

conda create -n nettseval python=3.12 -y
conda activate nettseval
pip install -r requirements.txt

Export Benchmark Data

Download CESNET-TimeSeries24 to ../data (see cesnet-tszoo docs), then export the benchmark CSVs:

python save_benchmarks.py

Reproducing Results

# Single model, single benchmark
python run_evaluation.py --model timesfm --benchmark seasonal

# All benchmarks
python run_evaluation.py --model chronos --benchmark all

# Specify configuration explicitly
python run_evaluation.py --model ttm --benchmark seasonal --freq h --lookback 744 --horizon 168

# Multiple repeated runs for variance estimation
python run_evaluation.py --model gru --benchmark all --n-runs 3

CLI Arguments

ArgumentDescriptionDefault
--modelOne or more model names (required)
--benchmarkOne or more benchmark types, or allall
--freqResolution: h=hourly, m=10minh
--lookbackContext window sizeh=168, m=288
--horizonForecast horizonh=24, m=144
--n-runsRepeated evaluation runs1
--save-predictionsSave per-window prediction CSVsoff
--configJSON file for model hyperparameter overrides

Generate Analysis Graphs and Tables

python -m result_exploration.generate
python -m result_exploration.generate --metrics rmse mase

Output is written to result_exploration/graphs/. Result directory paths per model are configured in result_exploration/analysis.py under EXPERIMENT_CONFIGS. The full analysis notebook (ranks, skill scores, significance tests) is at result_exploration/results.ipynb.


Adding New Models

  1. Create nettseval/models/newmodel.py, inherit from BaseModel
  2. Implement fit(train_data, target_column), predict(horizon), get_params(), get_name()
  3. Optionally implement tune(train, val, target_column, ts_id=None)dict | None for per-series hyperparameter fitting
  4. Optionally set supports_batch = True and implement predict_batch(contexts, target_column, horizon) for batched inference
  5. Export in nettseval/models/__init__.py
  6. Add to MODEL_ORDER in nettseval/constants.py and to create_model() in run_evaluation.py

See adding_a_model.md for a full guide with code templates.


Repository Structure

nettseval/                   # Main Python package
  models/                   # Model wrappers (BaseModel interface)
  benchmarks/               # BenchmarkSource, BenchmarkLoader
  evaluation/               # Evaluator, metrics registry, result storage
  utils/                    # EvaluationConfig dataclass
  constants.py              # MODEL_ORDER, DEFAULT_EVAL_METRICS, SEASONAL_PERIOD
run_evaluation.py            # Main CLI entry point
save_benchmarks.py           # Export NetTS from CESNET-TimeSeries24
benchmarks/                 # Benchmark CSVs/Parquet + selected_ids/ (IDs tracked in git)
results/                    # Evaluation output (gitignored)
result_exploration/         # Analysis pipeline (analysis.py, plots.py, generate.py)
  results.ipynb             # Full results notebook (ranks, skill scores, significance tests)
  predictions.ipynb         # Prediction visualization notebook
  bench_ts_sparsity/        # Benchmark time series sparsity analysis
metacentrum/                # PBS cluster job submission scripts

Languages

Jupyter Notebook

99.1%