Scientific computing demonstration
Synthetic Streamflow Forecasting Benchmark
A deterministic benchmark comparing seasonal-naive, SARIMAX, and gradient-boosted one-step streamflow predictions.
- Role
- Project author
- Classification
- Synthetic demonstration
01Problem
Why this work exists
Forecasting methods should be compared against simple baselines with temporal holdouts and hydrology-relevant metrics.
02Contribution
What I can claim
Created a fixed-seed synthetic daily series, chronological split, lag and rolling features, model comparison, diagnostics, and an explicit distinction between one-step and recursive forecasting.
Method
Three numbers that are not the same measurement
A benchmark table invites one reading: rank the rows. This one rewards a second look, because the three rows were not asked the same question, and the differences between the questions are larger than the differences between the models.
R² 0.9786one step ahead, given yesterday’s measurement — lag 1 and lag 2 carry 94.4% of the model
Rank
Read as a leaderboard, gradient boosting beats classical statistics by a wide margin and the naive baseline is not close.
Open
One row predicts tomorrow having been given today's measurement. One forecasts two years of monthly means without seeing any of them. One repeats a seasonal average that carries no trend term.
Attribute
The two most recent lag features carry most of the strongest model, on a series whose day-to-day autocorrelation is very close to one - because the series was generated by a recursion that is public.
What this does not show
This benchmark is deterministic and synthetic, and its evaluation is one step ahead with observed discharge supplied as an input. It exercises an evaluation pipeline honestly; it is not a claim about any particular river.
03System
Workflow and decisions
- 01Synthetic 15-year series
- 02Chronological holdout
- 03Three model families
- 04Hydrology metrics
- 05Error analysis
- XGBoost
- statsmodels
- scikit-learn
- pandas
- NumPy
- Matplotlib
04Evidence
What is actually versioned
XGBoost on synthetic data with observed lag inputs; not a recursive multi-day forecast.
SARIMAX result on monthly means within the same synthetic benchmark.
05Quality controls
How the work is checked
- Fixed-seed data generator and chronological test split
- Seasonal-naive baseline retained alongside stronger models
- Tracked metrics and nine diagnostic figures
- Repository checker validates source and artifacts
06Limitations
Where the evidence stops
- Synthetic data cannot establish real-catchment performance
- XGBoost evaluation is one-step-ahead with observed historical discharge lags
- The benchmark does not test recursive multi-day behavior or distribution shift
What this changed in my practice
Strong synthetic scores are useful for testing an evaluation pipeline, but they are not evidence of field validity.