Skip to content

Leaderboard link - #23

Merged
TonyBagnall merged 8 commits into
mainfrom
leaderboard-link
Sep 3, 2026
Merged

Leaderboard link#23
TonyBagnall merged 8 commits into
mainfrom
leaderboard-link

Conversation

@TonyBagnall

Copy link
Copy Markdown
Contributor

placeholders for time and memory

TonyBagnall and others added 8 commits September 1, 2026 18:23
Set up so our port and aeon's DisjointCNNClassifier can be run against each
other under tsml-eval, to attribute the gap in aeon issue #3775, where aeon
scored 20.3 accuracy points below the published numbers on all 23 shared UEA
datasets.

Comparing the two graphs found the likely cause, and it is not the training
procedure. aeon applies a Permute after the final block, so the tensor entering
the pooling is (time, filters, 1) rather than (time, 1, filters).
GlobalAveragePooling2D reduces the two leading axes, so aeon's classifier head
receives one scalar per case where it should receive 64 features. Its
Dense(128) has 256 parameters, 1*128 + 128, which confirms the input width is
1. That explains the shape of the failure in the issue: accuracy correlates
-0.425 with class count and collapses toward chance on the many-class problems,
because a single scalar cannot separate 26 handwriting classes.

Head to head on ERing, 200 epochs, default split: aeon 0.641, this port 0.952,
published 0.964.

The port is the authors' Keras network transcribed, with their training
procedure: class-weighted loss, batch size min(n_cases // 10, 8), 500 epochs,
and learning rate schedule and retained epoch both monitoring validation loss.
aeon does none of those four. They are documented on the class so that a run of
the two can separate the head bug from the training differences.

Two things recorded rather than reproduced. The authors' DCNN_4L applies the
third block's spatial convolution to conv2 rather than to its own temporal
convolution, so a layer is computed and discarded; this port builds the clean
stack, matching aeon, so the architecture is not a second moving part. And the
data pipeline is not a difference at all: Main.py passes normalise=False, so
the authors train on raw series, as aeon does.

Registered in tsml-eval as DisjointCNN-MV, beside aeon's DisjointCNN rather
than replacing it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The leaderboard answers "which estimator is best". This answers "what is this
dataset worth", which is the question an archive has to keep asking of its own
problems.

Per dataset: the Dummy floor, the median, best and worst over the other
estimators, which estimator was best, the gain over Dummy, the spread, and how
many estimators contributed. Sorted by gain, so the problems where nothing yet
beats the baseline are at the top.

Two departures from the columns as first sketched. A single range would have
been close to redundant, since Dummy is almost always the weakest entry, so a
best-minus-worst range mostly restates best-minus-Dummy; they are split into
gain, meaning how much skill was found at all, and spread, meaning how much the
choice of estimator mattered, because those answer different questions. And the
median is reported beside the best, because best is a maximum over 23
estimators and so optimistic by construction.

Unlike the leaderboard this keeps every dataset rather than only those every
estimator finished, since a partly covered dataset is still informative; the
estimator count carries the caveat.

Rows are shaded where a dataset separates estimators poorly: amber for a gain
of 0.05 or less, green for a best of 0.99 or more. On the current results that
is 4 and 15 of 66. AtrialFibrillation and KINECAL-QSEO have a gain of exactly
zero, so no estimator has yet beaten the majority class on them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A placeholder for runtime and memory comparisons, with nothing published yet and
the reasons why written down.

The measurements already exist: tsml-eval records fit_time, predict_time,
memory_usage and benchmark_time per run, and the ingest simply does not bring
them across. The reason to hold off is that the numbers we hold are not
comparable with each other. Results span H200, A100 and CPU-only nodes; GPU and
CPU methods are not on one axis, so a ratio between them is partly a statement
about hardware; wall-clock includes queueing and the controller's memory
escalation retries; a deep learner's fit time is close to linear in an epoch
count that is a choice rather than a property; memory_usage is peak host memory,
so a model doing its work on a GPU looks cheap while occupying device memory
nobody measured; and the recorded device is unreliable, since the tooling used
for these runs inspects TensorFlow only and reports CPU for PyTorch estimators
either way.

The page also sets out what a fair comparison would need, including normalising
CPU times by benchmark_time, which exists for that purpose, and notes there is
no GPU equivalent.

This is the same reasoning that keeps time and memory columns off the
leaderboard, so the two now cross-reference.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page opened on the numbers not being comparable, which reads as a data
problem to be cleaned up. The more basic point is that no timing experiment has
been designed or run: every result here came from runs set up to measure
predictive performance, where partition, cores, epochs and memory retries were
chosen to get accurate results out cheaply and left free across estimators
because nothing depended on them. The timings are a by-product.

That now leads, and the reasons below it are framed as the conditions such an
experiment would have to fix rather than as defects in the current figures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Same shape as the runtime page and leading on the same point: no experiment has
been structured to compare memory. A job was given whatever ceiling got it to
finish, on whatever node was free, with whatever core count came with the
partition, none of it held constant across estimators.

Memory has enough of its own difficulties to warrant a separate page rather than
a section. What is recorded is one number, host side, fit only. Peak process
memory includes the interpreter, the imported framework and the dataset, so
without a per-framework baseline it largely ranks frameworks; on problems like
EigenWorms the data dominates the model. Host and device memory are different
quantities and only the host one is recorded. Framework allocators hold memory
they are not using, so a naive device reading measures allocator policy.

The point that decided the separate page is censoring. Where memory mattered
most we have no number at all, only a bound: missing_results.csv records
ConvTran hitting CUDA out of memory on Alzheimers, EigenWorms and
PhotoStimulation, and FreshPRINCE hitting OOM at 128 GB on FaceDetection,
FordChallenge and Skoda after eight attempts. A table built from successful runs
alone would be survivorship-biased in a way a runtime table is not.

The runtime page is narrowed to runtime and the two cross-reference.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
65 of 66 Multiverse-core datasets, seven metrics, from the i7_h200 run at the
port's defaults: window_size 0.8 capped at 100 points, batch size 32, 100
epochs. EmoPain is the one gap and is the archive-wide one, aeon's input
validation rejecting it before fit for every classifier, now recorded in
missing_results.csv beside the other four.

XCM lands 21st of 25 on average accuracy rank, mean accuracy 0.6690.

The ingest logged "y_prob values do not sum to one" on many datasets. The
probabilities are fine: the largest deviation across all 65 is 2.8e-07, ordinary
float32 rounding from the Keras softmax, well inside anything that would affect
log loss or AUROC.

Against the paper's own table, on the 23 shared datasets, we average 0.699 where
Fauvel et al. report 0.761, a gap of 6.2 points. That is the expected size: they
grid-search window_size per dataset over {20,40,60,80,100}% by cross-validation
on the training set, and report a 7.0% mean relative accuracy drop from using a
suboptimal window, where this run uses the modal 0.8 everywhere. Unlike
DisjointCNN's 20.3 points, this gap is explained by a documented protocol
difference rather than an implementation fault.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The port fixed window_size at 0.8, the modal published value, where the paper
sets it per dataset. Section 4.3 grid-searches window_size over
{0.2,0.4,0.6,0.8,1.0} and batch_size over {1,8,32} by stratified five-fold
cross-validation of the training set, so their figures are tuned but not leaked.

Both parameters now accept a sequence, which runs that search and refits on the
whole training set; a scalar fits once exactly as before, so the default is
unchanged. The selection is recorded on window_fraction_, batch_size_ and
cv_results_. Folds are reduced when a class is smaller than cv_folds, and the
search is skipped when the rarest class appears once, since there is nothing to
select on.

max_window now accepts None. The 100 point bound is ours rather than the
authors', who do run kernels of the order 40% of EigenWorms, 7193 points, so
None is needed to reproduce them.

The default stays a single fit because of cost. The fixed-window pass over
Multiverse-core took 1.2 GPU-hours; searching the window alone is about 20 times
that, and adding the batch grid about 37 times again, since batch 1 takes 32
times the gradient steps of batch 32. That puts the full grid near 900
GPU-hours for a batch choice the published table makes on 4 of 30 datasets, so
XCM-Tuned in tsml-eval searches the window only.

For context on what this is worth: fixed at 0.8 we average 0.699 over the 23
datasets shared with the paper's table against their 0.761, and they report a
7.0% mean relative drop from a suboptimal window.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
TimesNet: 65 of 66 datasets, seven metrics, from the rerun with lr_adjust at the
implementation default of None. EmoPain is the usual gap. Mean accuracy 0.7013,
22nd of 25 on rank. Against the paper's own table, on the nine shared datasets,
we average 0.678 where they report 0.754. A 7.6 point gap is what the protocol
difference predicts: TSLib selects the retained epoch on the test set, so their
figure is not a held-out estimate.

The XCM results are removed rather than kept. They came from a single fit at
window_size 0.8, which is the modal published value but not a configuration the
authors ever ran: they select the window per dataset by cross-validation on the
training set. Reporting the fixed version measures something the paper does not
claim, and the 6.2 point shortfall against their table is the size the paper's
own sensitivity figure predicts for a suboptimal window.

XCM in the tsml-eval lookup now supplies the window grid, so the reported run
follows the authors' protocol, and XCM-Fixed keeps the single-fit variant for
comparison. docs/classifiers.md states which is reported and why batch size is
held at the published modal 32 rather than searched.

The missing_results row for XCM goes with the results and will be re-recorded
when the tuned run is ingested.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@TonyBagnall
TonyBagnall merged commit a8cde58 into main Sep 3, 2026
1 of 3 checks passed
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.

1 participant