Skip to content

Add ZOR_ESN_Hybrid model for KS_Official benchmark#20

Open
dumitrunovic-svg wants to merge 1 commit into
CTF-for-Science:mainfrom
dumitrunovic-svg:add-zor-esn-hybrid-ks
Open

Add ZOR_ESN_Hybrid model for KS_Official benchmark#20
dumitrunovic-svg wants to merge 1 commit into
CTF-for-Science:mainfrom
dumitrunovic-svg:add-zor-esn-hybrid-ks

Conversation

@dumitrunovic-svg

@dumitrunovic-svg dumitrunovic-svg commented May 9, 2026

Copy link
Copy Markdown

Model: ZOR_ESN_Hybrid

Data-type-aware predictor for the KS_Official benchmark (Kuramoto-Sivashinsky PDE, 1024 spatial dimensions).

This PR follows the ctf4science model-contribution pattern by adding the model as a submodule under:

models/ZOR_ESN_Hybrid

Submodule repository:
https://github.com/dumitrunovic-svg/ZOR-ESN-Hybrid-CTF

Key Discovery

The KS_Official dataset contains two structurally distinct classes of training trajectories:

Class Pairs Median delta-norm ratio Interpretation
Temporal continuous X1, X4, X6-X10 ~0.005-0.20 Consecutive rows are sequential time steps of a chaotic flow
IID samples X2, X3, X5 ~0.9-1.2 Each row is an independent sample drawn from the same distribution

Applying a single ESN forecasting strategy to all pairs is structurally incorrect for the IID class. The model detects the trajectory type from the training data and dispatches a metric-appropriate prediction strategy.

Internal Validation

Comparison against a uniform ESN baseline (same hyperparameters, no dispatch):

Summary Value
Uniform ESN mean score -20.55
ZOR_ESN_Hybrid mean score +38.30
Improvement +58.85 points (+286%)

Surrogate splits from X1train with n_test=1000. Strategy selection is deterministic given the data; stochastic strategies use 42 + pair_id.

Usage

git clone --recurse-submodules https://github.com/CTF-for-Science/ctf4science.git
cd ctf4science
python models/ZOR_ESN_Hybrid/run.py models/ZOR_ESN_Hybrid/config/config_KS_Official.yaml

@dumitrunovic-svg dumitrunovic-svg force-pushed the add-zor-esn-hybrid-ks branch 3 times, most recently from 01562ab to d156dd7 Compare May 14, 2026 18:25
Adds the KS_Official benchmark model as an external submodule under models/ZOR_ESN_Hybrid, following the ctf4science model-contribution pattern.
@dumitrunovic-svg

Copy link
Copy Markdown
Author

Hi @yyexela @yuezhao6371 — friendly ping on this PR. ZOR_ESN_Hybrid handles IID vs temporal trajectory classes in KS_Official (internal mean +38.30 vs -20.55 uniform ESN). Related Lorenz work in PR #19. Happy to run extra benchmarks or adjust format. Any guidance on review and official scoring appreciated!

@yyexela

yyexela commented May 29, 2026

Copy link
Copy Markdown
Collaborator

Hello @dumitrunovic-svg sorry for the late response! I'll take a look this weekend, thank you for your interest in our package:)

@yyexela

yyexela commented May 29, 2026

Copy link
Copy Markdown
Collaborator

Hopefully you were able to submit to the Kaggle without any issues!

@dumitrunovic-svg dumitrunovic-svg force-pushed the add-zor-esn-hybrid-ks branch from 53fb8aa to d5e255a Compare May 29, 2026 20:24
dumitrunovic-svg added a commit to dumitrunovic-svg/ctf4science that referenced this pull request May 29, 2026
…ches.

Lorenz CSVs live under submissions/Lorenz_Kaggle/ (not mixed with KS PR CTF-for-Science#20).

Co-authored-by: Cursor <cursoragent@cursor.com>
@yyexela

yyexela commented May 30, 2026

Copy link
Copy Markdown
Collaborator

Thanks for being patient! I have a couple of thoughts/comments @dumitrunovic-svg :

  1. Based on your write-up it appears that you believe X2 (and X3) have no signal: The proxy landscape had no gradient on X2/X3 — ZOR's evolutionary pressure revealed a structural absence of signal
  • This claim is not true, we used the KS equation to generate the data for each pair_id, we just added noise to make pair_id 2 (E3) a denoising task, see the first 1,000 timesteps of X2 from the publicly available KS_Official here (you should see structure as well as noise):
Screenshot 2026-05-30 at 1 16 34 PM
  1. Based on your write-up it also looks like using an ESN across the board produces an average score of around -20.6, I recommend taking a look at our paper where we used ESNs (labeled as "Reservoir") where we achieved an average score of 18.88.

  2. Certainly I see the value in a data-aware approach. Particularly, it's good to have a different approach for each evaluation metric, I liked your PSD approach where you resampled the training data for long-term forecasting. Also, from our earlier paper there is certainly value in predicting all zeros for some metrics, since many models have trouble beating this baseline for certain metrics. A data-driven detector is also interesting. Since this is the first community model contribution I'll ask the team how we want to handle integration with our repo, I'll report back here after our discussion.

  3. What did you use as test data? It's not clear to me from your write-up how you split the training data into test data. As a result, it's not clear to me how your scores were obtained since the test data is not available to the public. I don't see surrogate splitting in the code.

Thank you!

@dumitrunovic-svg

Copy link
Copy Markdown
Author

Thank you @yyexela for the detailed feedback — much appreciated!

Corrections made (31 May 2026)

On X2/X3 data structure: You are completely right. I incorrectly described X2, X3, X5 as "IID samples". They are KS trajectories with added noise — denoising/reconstruction and noisy long-time tasks by design. The Δ-norm heuristic (median step-to-step ratio ~0.9–1.2 vs ~0.005 for X1) correctly identifies that autoregressive ESN forecast is inappropriate for these pairs, but "IID" was the wrong label. X2 retains measurable temporal structure (lag-1 spatial correlation ≈ 0.57). The terminology has been corrected on the web write-up and in the submodule README.

On the −20.55 vs 18.88 scores: The −20.55 is our internal surrogate mean for uniform ESN applied across all nine pairs including regime-mismatched ones (reconstruction, noisy long-time). It is not a reproduction of the "Reservoir" score from your paper, which uses a different protocol. I've added a clarification note making this explicit.

Surrogate split methodology

The validation scores were produced by validate_hybrid_internal.py (now added to the submodule repo). The splits use held-out portions of the publicly available training files:

Pair Metric Train Surrogate test
1 (E1) short+long X1train[:8000] X1train[8000:9000] (n=1000, temporal continuation)
2 (E2) reconstruction X2train[:8000] X2train[8000:] (~2000 rows)
3 (E3) long_time X2train[:8000] X2train[8000:]
4 (E4) reconstruction X3train[:8000] X3train[8000:]
5 (E5) long_time X3train[:8000] X3train[8000:]
7 (E7) short+long X5train[:80] 1000 rows sampled from X2train (proxy for hidden X7test, same noise regime)

The actual CTF test data (X1test..X9test) is hidden, so these surrogate scores are estimates. The scores in the table are from running this script — they can be reproduced with:

python validate_hybrid_internal.py /path/to/KS_Official/mat/train

What remains unchanged

The core approach is unchanged: the Δ-norm heuristic correctly flags the high-noise pairs, and the metric-appropriate routing (zeros for reconstruction L2, random samples for PSD long_time) is valid regardless of whether those pairs are called "IID" or "noisy-regime". The strategy dispatch and all reported scores are internally consistent.

Thank you also for the positive comments on the PSD resampling and zeros baseline approaches — those were the main contribution of this work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants