Skip to content

Put average rank first in the README leaderboard - #20

Closed
TonyBagnall wants to merge 12 commits into
mainfrom
leaderboard-link
Closed

Put average rank first in the README leaderboard#20
TonyBagnall wants to merge 12 commits into
mainfrom
leaderboard-link

Conversation

@TonyBagnall

Copy link
Copy Markdown
Contributor

The rows are ordered by average accuracy rank, but that column sat at the far right, so the table read as though it were sorted on accuracy, the leftmost metric, and mis-sorted: HC2 above MRHydra is right on rank, and CIF above QUANT is not what the accuracy column alone would give. Moving the ordering column to the front makes the ordering legible.

Column order only. No value changes, and the HTML page keeps its score-and-rank pair per metric, where the ordering is already visible from the rank columns.

Claude-Session: https://claude.ai/code/session_01LyaaJWNBSejmDY7XRQKok3

Summary

  • What does this PR change?

Checklist

  • I have updated documentation if needed.
  • I have added tests or validation steps if needed.
  • If this PR submits results, it follows results/schema.md.

TonyBagnall and others added 12 commits August 31, 2026 15:25
65 of the 66 Multiverse-core datasets, ingested with
multiverse.experiments.ingest. TimesNet places 22nd of 24 on average accuracy
rank, ahead of 1NN-DTW and Dummy.

EigenWorms and Alzheimers are both present, which is worth recording: at 17984
and 15000 points they exceed the fixed 5000 position table TimesNet inherited
from TSLib, and would have failed with a tensor size mismatch before that was
sized to the series. The run also used d_model 32 and d_ff 64 with the type1
learning rate schedule, so it picked up the published classification defaults
rather than the earlier values.

EmoPain is missing. No TimesNet job logs were copied across, so the reason is
recorded as inferred: aeon rejects EmoPain before fit for having 1733
case/channel pairs with std <= 1e-07, which stops every aeon classifier, and is
the logged cause for ConvTran, PatchMTSC and DisjointCNN. It costs no datasets,
since those three already exclude it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PatchMTSC previously failed on PenDigits with

    ValueError: patch_len exceeds the number of timepoints

because the series is 8 points long and the default patch length is 16. The
port clamps the patch geometry to the observed series instead of rejecting the
dataset, and a rerun with that code completes it at 0.9814. 65 of 66 datasets
now, EmoPain remaining.

PenDigits stays out of the comparison, since MRHydra and STSF are still missing
it, so the leaderboard is unchanged at 24 estimators on 52 datasets. MRHydra
fails it for the same underlying reason from the other direction: MultiRocket
requires at least 9 points.

Nothing else on disk has changed since the last ingest. The remaining
estimators with raw results are the ones deliberately left out: CIF-500 and
DrCIF-500, PULSAR pending publication, RSTSF and ProximityTree for the datasets
they cost, a duplicate STC run, and several with coverage too low to compare.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
TSLib defaults to lradj type1, applied every five epochs. From
learning_rate 0.001 that reaches 2.0e-6 by epoch 10 and 6.1e-8 by epoch 15, so
training effectively stops a third of the way through a 30 epoch run. It was
reproduced here as a fidelity fix, which was the wrong call: it is harmless in
TSLib only because they select the retained epoch on the test set, keeping an
early epoch from before the collapse. This wrapper selects on a held-out split
of the training data, so it keeps a model that has stopped learning.

Measured on ERing, 30 training cases and 270 test, against a published 0.915:

    as benchmarked (32/64/2, val 0.2)   0.356
    bigger model (64/256/3, val 0.2)    0.578
    no held-out split (32/64/2, val 0)  0.426
    bigger + no split (64/256/3, val 0) 0.578
    bigger, no split, no lr decay       0.933

The schedule is worth 35 points here, more than the model size and far more
than the validation split. Set lr_adjust="type1" to reproduce TSLib.

The ingested TimesNet results are removed rather than left in place, since they
were produced with the schedule on and understate the method: its ERing result
was 0.419. It will be rerun.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
TS2Vec is the direct comparator to TimesURL: the survey notes they are the only
two foundation-style methods with broad archive coverage that are comparable
through available code, and both are in its clean 13.

The authors' package is vendored under _ts2vec_original and driven by a thin
wrapper, as TimesURL is. The only change to their code is the relative-import
rewrite in ts2vec.py.

A correction to an earlier assumption: TimesURL is a fork of TS2Vec, not a user
of it, so its vendored components could not be reused. Its losses.py calls
mixup variants TS2Vec does not have and its encoder.py carries a reconstruction
head. The two packages are kept separate.

The default probe is the authors' UEA protocol, an SVC chosen by grid search
over C, since train.py passes eval_protocol='svm'. Their grid sets
probability=False, which leaves an SVC unable to produce probability estimates,
so it is enabled here because aeon classifiers must implement predict_proba;
that adds Platt scaling fitted by internal cross-validation on training data
only. probe="logistic" selects their linear alternative, which is the probe the
TimesURL wrapper uses, so the two encoders can be compared without the probe
differing between them.

Equivalence is checked by comparing the vendored modules against upstream after
canonicalising import style, and by asserting the wrapper drives the authors'
class and uses their C grid. Set MULTIVERSE_TS2VEC_SRC to run those.

On BasicMotions all three score 0.975; on ERing TS2Vec reaches 0.896 against
TimesURL's 0.881, at a fifth of the runtime.

Also adopts three improvements made to the tsml-eval copy of the TimesURL
package: the shape print is now guarded by verbose rather than removed, imports
are reformatted, and a missing trailing newline is added. The equivalence test
that asserted the print was deleted now asserts it is guarded, which is the
stronger check.

54 tests pass, aeon conformance 21/21 for all five ported classifiers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
XCM is in the survey's clean 13 and is the only member of that group with no
aeon equivalent, so it needed a port rather than a run.

Two parallel branches see the input differently: a 2D branch convolves along
time within each channel separately, so its activations stay attributable to
individual channels, and a 1D branch convolves across all channels together.
That attributability is what the paper's explanations rest on, so the layer
names it refers to are preserved and a test asserts they are still there.

The network is one 97 line Keras function, so it is transcribed rather than
vendored. Equivalence is checked by building both the authors' graph and ours
and comparing layer types, shape-determining arguments, ordering, parameter
counts and output shape.

This is the first Keras port here, following the authors, so tensorflow joins
torch in the deep-learning extra.

Two changes were needed. The original imports Conv1D and Conv2D from
keras.layers.convolutional, a path removed in Keras 3, so they come from
tensorflow.keras.layers instead; layers and arguments are unchanged. And the
kernel length int(window_size * n) is zero for series shorter than five points,
which builds an invalid layer, so it is floored at one.

Their training procedure is reproduced as is: a fixed 100 epochs on the whole
training collection, no validation split, no epoch selection. Their main.py
also runs a five fold cross validation but only to report per fold accuracies.

On real data: BasicMotions 1.000 against a published 1.000, Epilepsy 0.949
against 0.993, NATOPS 0.911 against 0.978. The authors tune window_size per
dataset, carrying a Win_pct column in their results table; NATOPS uses 40 where
the default is 20, and at 0.4 we reach 0.933, so their window closes part but
not all of that gap.

75 tests pass, aeon conformance 21/21.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The 0.2 default was taken from the authors' config.yml, which is a worked
example pinned to BasicMotions rather than a default. Their results table shows
window_pct tuned per dataset over a five point grid: 20, 40 and 60 on five
datasets each, 80 on thirteen, and 100 on two. 0.8 is the modal value, so it is
the better single choice, on the same reasoning used for TimesNet's d_model and
d_ff.

Because window_size is a fraction the kernel grows with the series, and 0.8 of
EigenWorms' 17984 points is a 14387 point kernel. max_window bounds it at 100,
which changes nothing for series under 125 points and keeps the long Multiverse
problems tractable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
65 of the 66 Multiverse-core datasets. TimesURL places 22nd of 24 on average
accuracy rank, mean accuracy 0.695.

EmoPain is missing, the usual case: aeon rejects it before fit for having 1733
case/channel pairs with std <= 1e-07, which stops every aeon classifier. No
TimesURL job logs were copied across, so the reason is recorded as inferred. It
costs no datasets, since ConvTran, PatchMTSC and DisjointCNN already exclude it.

Note the run used the tsml-eval implementation, whose parameters have moved
ahead of the copy in this repository: batch_size 8 rather than 16,
learning_rate 1e-4 rather than 1e-3, an eval_protocol option, standardisation,
max_train_length and several others. The results here therefore describe that
version, not multiverse.classification.TimesURLClassifier. Reconciling the two
is a separate change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The TimesURL results were produced by the tsml-eval version, whose parameters
and behaviour had moved ahead of the copy here: batch_size 8 rather than 16,
learning_rate 1e-4 rather than 1e-3, plus an eval_protocol option, per-channel
standardisation, max_train_length, temporal_unit, temperature and sgd. The
ingested results therefore described an implementation this repository did not
have. This adopts that version so the two agree.

Its probe handling is also better than what it replaces: rather than forcing
probability=True on the SVC, which adds Platt scaling and an internal cross
validation, it softmaxes the decision scores when the probe has no
predict_proba.

Kept from the previous version: the module docstring recording provenance, the
MIT licence and attribution, and the three changes made to the vendored
package; the Attributes, References and Examples sections; and shape validation
on predict, without which a mismatched collection fails somewhere inside the
encoder with an error that does not say what was wrong.

75 tests pass, aeon conformance 21/21.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The directory holds accuracies reported in the MTSC literature, one file per
surveyed paper, which is what it is used for here: comparing our runs against
what was published. "survey" named where the data came from rather than what it
is, and read as though it belonged to one paper.

All 129 files moved with git mv so history follows. Nothing in the package or
the documentation referenced the path except the repository layout in the
README, which is updated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The directory had per-category notes recording which table each file came from,
but nothing describing what the collection is or how to read it. The README
adds that, along with the four things that have caught us out while using it:

- value scale is not consistent, percentages in some files and fractions in
  others, so 0.13 is ambiguous without checking the file
- 13 of the 118 files are not wide, leading with Table, Scope, Method and
  others, because the paper's table did not fit that shape
- files carry summary rows such as Average Rank, Wins and p-val, which parse as
  datasets with implausible scores
- repeated values across papers are transcribed baselines, not independent
  runs, so the modal value is one measurement quoted many times

It also notes the two kinds of file that are not extracted from papers, the
dataset name variations, and that published numbers are not always produced
under a comparable protocol.

Links the survey from both READMEs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Renaming survey/ to published_results/ broke links to
github.com/aeon-toolkit/multiverse/tree/main/survey, and GitHub does not
redirect directory URLs. A README at the old path is what a browser lands on,
so it points at the new location and shows how to rewrite a link to a specific
file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The rows are ordered by average accuracy rank, but that column sat at the far
right, so the table read as though it were sorted on accuracy, the leftmost
metric, and mis-sorted: HC2 above MRHydra is right on rank, and CIF above QUANT
is not what the accuracy column alone would give. Moving the ordering column to
the front makes the ordering legible.

Column order only. No value changes, and the HTML page keeps its score-and-rank
pair per metric, where the ordering is already visible from the rank columns.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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