We changed one line and the benchmark score moved 0.21 AUROC

Community Article
Published August 22, 2026

We spent the last few weeks building a benchmark for drug property prediction tools. It went live this week: LEADBOARD, 21 boards, 18,382 held-out compounds, labels we don't hand out.

This post is mostly about two numbers we ran into while building it, because they changed what we thought the thing should be.

The first number

hERG was the board we built first. It's the potassium channel that, when a drug blocks it, gives you a QT interval problem and a dead clinical program. Everybody screens for it early, so there's a lot of public data, which made it a good place to shake out the pipeline.

We pulled ChEMBL 37 (CHEMBL240, IC50, relation =). 12,021 records with a document year attached, 11,972 after unit checks and RDKit parsing, collapsed by InChIKey to 9,788 unique compounds with a median pIC50 each.

Then we split it by year. Train on everything first reported before 2022, test on what showed up after. Morgan fingerprints into LightGBM, library defaults, no tuning. AUROC came back at 0.606.

That felt low, so we did the obvious sanity check and split the same data at random instead. Five seeds:

Split AUROC LGBM MAE (log) Constant MAE (log)
Time split, cut 2022 0.606 0.599 0.589
Random, seed 0 0.825 0.467 0.690
Random, seed 1 0.814 0.448 0.676
Random, seed 2 0.830 0.453 0.652
Random, seed 3 0.803 0.460 0.668
Random, seed 4 0.817 0.458 0.671
Random, mean 0.818 0.457 0.671

Same molecules, same fingerprints, same learner, same hyperparameters, same test fraction. AUROC moves 0.211. That's a bigger gap than you'll find between most competing methods in the literature.

The mechanism isn't mysterious. Medicinal chemists don't generate molecules independently. Somebody finds a scaffold and then makes forty analogues of it, and those forty sit on top of each other in structure space. Split at random and the cluster gets sprayed across both sides of the line, so your test set is full of near-twins of things the model already saw. Nearest-neighbour lookup will carry you a long way under those conditions.

But that isn't how anyone uses a prediction tool. You use it to rank compounds nobody has assayed yet, and you have no promise that anything similar is in the training data. A time split reproduces that honestly, and it has a nice property: you can't look the answer up, because when the model was trained the answer hadn't been published. Structural overlap between train and test is zero by construction.

One caveat we want to state clearly, because it would be easy to over-read this table. We compared time split against random split, on our data. We are not saying published benchmarks use random splits; plenty use scaffold splits, which land somewhere in between. The claim we'll defend is narrower: on identical data, the split choice moves AUROC by 0.21, so a leaderboard number quoted without its split isn't comparable to anything.

Every board on LEADBOARD uses a time or scaffold split. We don't open random ones.

The second number

The other thing we hadn't taken seriously enough was how imprecise the labels are.

Two labs measuring the same compound don't get the same answer. Different cell line, different buffer, different day. You can actually quantify this, because ChEMBL tracks which publication every value came from, so you can find compounds that appear in two or more papers and look at how far apart they land.

We only use pairs that cross documents. Repeats inside a single paper are the same batch and the same hands, and they make the spread look far smaller than it is.

hERG again:

Cross-document pairs      5,185   (857 compounds appearing in 2+ papers)

median |difference|       0.148 log
mean   |difference|       0.475 log
75th percentile           0.669 log
90th percentile           1.338 log
standard deviation        0.736 log

single-measurement SD     0.421 log     (mean|diff| / 1.128)

Look at the 90th percentile. One compound in ten differs by more than 20-fold between two published measurements.

We call 0.421 the board's noise floor and print it next to every score, because it tells you how to read the ranking. If first and second place are 0.02 apart and the floor is 0.42, that ordering is a coin flip wearing a rank badge.

It also tells you something about the test set that we'd rather say out loud than bury. 696 of the 1,338 hERG test compounds, 52% of them, sit within one noise floor of the pIC50 = 5.0 classification cutoff. Half the test set could change class if you measured it again. So this board reports regression as the primary metric and classification as secondary, and the board page says why.

What this looks like across all the boards

Divide the best untrained baseline's MAE by the noise floor and you get one number per board: how far the field is from the ceiling.

Board Best baseline MAE Noise floor Ratio Best baseline
CYP2D6 0.597 0.659 0.91 Constant
CYP3A4 0.574 0.628 0.91 Constant
VEGFR2 0.820 0.762 1.08 Morgan+LightGBM
EGFR 0.996 0.888 1.12 Constant
ALK 0.858 0.743 1.16 Morgan+LightGBM
COX2 0.927 0.767 1.21 Constant
Solubility 0.712 0.575 1.24 Morgan+LightGBM
CYP2C9 0.474 0.350 1.35 Constant
hERG 0.589 0.421 1.40 Constant
JAK2 0.919 0.635 1.45 Morgan+LightGBM
FLT3 0.986 0.660 1.49 Morgan+LightGBM
MAOB 1.028 0.626 1.64 Morgan+LightGBM
ABL1 0.778 0.459 1.70 Morgan+LightGBM
AChE 0.805 0.462 1.74 Morgan+LightGBM
HER2 0.916 0.498 1.84 Morgan+LightGBM
KIT 0.925 0.427 2.16 Morgan+LightGBM
PI3K-alpha 0.871 0.374 2.33 Morgan+LightGBM
BRAF 0.857 0.313 2.74 Nearest neighbour
CDK2 0.817 0.293 2.79 Constant

Median 1.45. That chart is the first thing on the front page of the Space, with a line at 1.0.

Two boards are already under the line, and that needs a caveat, because the intuitive reading is wrong. A ratio below 1.0 does not mean a model got more accurate than an experiment. It means the disagreement between labs on that endpoint has grown to roughly the size of the spread you're trying to predict. The assay disagrees with itself about as much as the compounds differ from each other. CYP2D6 and CYP3A4 inhibition are both there. Those boards are approaching the point where they stop separating tools at all, and we'd rather write that on the board page than keep ranking noise.

The baselines that made us uncomfortable

Three untrained references run on every board before it opens.

Constant, which predicts the training mean for everything. Nearest neighbour, which copies the label of the most Tanimoto-similar training molecule. And Morgan + LightGBM at defaults.

Across our 19 regression boards, constant prediction has the lowest MAE on 7 of them. Morgan+LightGBM takes the best AUROC on 13.

Go back to the hERG table. Under the time split, LightGBM's MAE is 0.599 and the constant's is 0.589. The trained model loses. Under a random split on exactly the same data it wins by a mile, 0.457 against 0.671.

Our reading is that fingerprint models are genuinely good at ordering compounds and much weaker at calibrating absolute potency for chemistry they haven't seen. The rank information survives the harder split; the numbers don't. Both are worth knowing, and you lose one of them if you report a single headline metric.

A benchmark that skips the trivial baselines can't tell you which of those regimes you're in. So we run them everywhere and publish them before anyone submits.

Two letters on every board

Boards on the same leaderboard aren't all asking the same kind of question, and stacking them into one ranking would be dishonest. So each one carries a tag like [T/P2].

The first letter is how we cut the data. T is a time split by first-report year, S is a scaffold split on Murcko cores, R is random, and we don't open those.

The second letter is whether you could go look the answer up. P1 means the source is public and we curated it. P2 means the source is public but our unit conversion and selection define this particular revision. P3 means we hold the labels. P4 is prospective, where the answer doesn't exist anywhere yet.

[T/P1] and [T/P3] are different experiments. Better to say so on the tin.

The boards

Seven disciplines, 212,670 training compounds, 18,382 held out.

Discipline Boards
Absorption Solubility
Metabolism CYP3A4, CYP2D6, CYP2C9
Toxicity hERG
Potency AChE, MAOB, COX2
Kinase EGFR, JAK2, PI3K-alpha, FLT3, VEGFR2, CDK2, HER2, ABL1, BRAF, KIT, ALK
Cell / Phenotype JUMP Cell Painting morphology
Clinical Post-marketing withdrawal

Two of them are unusual enough to describe properly.

Cell / Phenotype

This one sits on the JUMP Cell Painting Consortium release, which is CC0. Compounds go onto cells, six stains go on, a microscope takes pictures, and you come out with 737 morphological features per well.

The task is to predict, from structure alone, how the cell changes shape. The label isn't a number. It's a 16-axis profile, the first 16 principal components, holding 61.0% of the variance. We score the per-compound Pearson correlation between the predicted and observed profile. Scaffold split, 113,688 train and 2,001 test, and we only evaluate on Murcko cores that never appear in training.

Baseline Profile correlation
Morgan + LightGBM 0.159
Constant 0.092
Nearest neighbour 0.079

There's no cross-lab repeat structure to derive a noise floor from here, so we bootstrapped the metric instead and got an SD of 0.0088. The best baseline sits about 18 of those above the constant, which is enough for the board to separate tools, and 0.0088 becomes the threshold for the ladder rule described below.

Post-marketing withdrawal

Predict whether an approved drug later got pulled from the market. This board has a trap in it that took us a while to see.

Withdrawal rate tracks the decade of approval. Roughly 7.8% for 1990s approvals against 1.2% for the 2010s. Which means a predictor given nothing but the approval year scores AUROC 0.636. No structure, no mechanism, no name. Just the year.

Ship that and you've built a leaderboard for reading dates.

So we matched the controls by approval era, pairing each withdrawn drug with a non-withdrawn drug approved around the same time, and ran the check again. The year-only predictor now gets 0.504. Chance. That's the version we opened.

Scaffold split, 408 train, 184 test, 27.7% positive, bootstrap metric SD 0.0444.

Baseline AUROC PR-AUC
Morgan + LightGBM 0.593 0.369
Nearest neighbour 0.553 0.306
Constant 0.500 0.277

We run some version of that check on every board before opening it, and boards that fail don't open. Same for the noise floor: if we can't measure one for an endpoint, there's no board, because without a floor there's no threshold to enforce.

Submitting more than once

There's an old problem with held-out leaderboards. You never see the labels, but if you submit fifty times and keep your best result, you've been pulling information out of the test set through the score channel the whole time. Enough tries and you climb without generalising at all.

We use the ladder mechanism from Blum and Hardt (ICML 2015). A new score is revealed only if it beats your own previous best by more than the noise floor. Otherwise we show you your previous best again.

An improvement smaller than experimental error isn't an improvement, so we don't hand that information back. You can't climb by submitting more often. You climb by actually getting better than the measurement precision of the field.

This is the other reason the noise floor has to be real rather than decorative. It's the threshold the whole mechanism runs on.

How to enter

Pick a board, download its test set, which contains structures and nothing else. Predict with whatever you like. A trained model, a physics engine, an LLM, a rule of thumb you trust. We don't care what's inside, we measure the output.

Upload a two-column CSV of compound_id,prediction and sign in with your Hugging Face account. Scoring runs off-platform on hardware that holds the labels; the Space never has them.

Each board page ships a filled-in prompt and a runnable skeleton so you don't have to build anything from scratch to make a first submission. The interface picks up Korean or English automatically.

Every score carries the SHA of the exact test file and scoring code behind it, so a number from six months ago is still traceable.

Licensing

ChEMBL 37 from EMBL-EBI, CC BY-SA 3.0, re-curated, with the attribution travelling on every board card. JUMP Cell Painting, CC0. The withdrawal board is assembled from public regulatory records. Non-commercial research benchmark, structures only, no labels distributed.

What we're not claiming

Three limits, since a benchmark that oversells itself is worse than no benchmark.

A time split is not prospective validation. The molecules exist and the values are published somewhere; what the split buys you is that the structural shortcut is closed and the training set is a real snapshot of what was known. Actually prospective boards get graded P4 and are a separate thing.

A noise floor built from cross-publication pairs is an estimate. It leans on a normality assumption and on ChEMBL's document attribution being right. We think it's much better than no reference at all, and we publish the pair counts so you can argue with the estimate.

And we're not saying other benchmarks are wrong. We're saying a score reported without its split, its baselines, and its label precision can't be compared to another score. Publishing all three, on every board, before anyone submits, is the whole contribution.

Why we bothered

There is no shortage of prediction tools, and every one of them reports a best-in-class number on its own benchmark. Put those numbers side by side and you learn nothing, because the rulers are different lengths.

We wanted one ruler. And it seemed only fair that if you hand somebody a ruler, you tell them how thick the markings are.

Open LEADBOARD

Specification v1.1, 8 clauses. FINAL-Bench / VIDRAFT.

Community

The noise floor and the untrained baselines are the two clauses I would defend hardest, and we hit both walls independently in a different domain. We build cross-modal retrieval read-outs on frozen LLMs, so nothing about molecules, but the measurement structure is the same and two of our findings extend yours.

Your floor is one draw, and floors are arm-dependent.

You bootstrap the Cell Painting metric, which is right, but the cross-publication noise floor is a single estimate applied across the board. We had the same shape of control, a shuffled pairing over a 123,287-image gallery, and used one deterministic permutation. Twenty random derangements said one of our two floors was fine and the other was 4.46 SD off, outside the entire range of twenty.

Worse, the floors for two different arms scored on the same gallery landed 3,370 ranks apart, a pooled 21.7 SD. They are not interchangeable, because our floor turned out to be a property of the arm being scored and not of the gallery. Analytic chance was the wrong reference for both.

If your cross-document pairs have any structure that varies by board, the same could hold: the floor for one submission class may not be the floor for another. Cheap to check, twenty derangements per board.

Untrained baselines beating trained models is worth a hard abort, not just a report.

Constant winning 7 of 19 boards matches what we see. Zero-training nearest-neighbour retrieval beat our trained decoder by a wide margin for months. We eventually made it a gate: one probe now refuses to report unless the fitted version beats the head-free version, and it caught a real failure, a read-out scoring 0.5222 against head-free 0.5655. We had already half-written that up as a result.

Two smaller things.

Your approval-year trap has a direct analogue. We counted SugarCrepe and found 572 of 7,511 pairs where the positive and negative are the same words reordered, so any bag-of-words model is pinned at chance by construction, invisible unless you count.

And on ranking inside the floor: for arms near zero we found recall carries no information about median rank at all. Five arms all at R@1 0.000 had medians from 44,578 to 63,541. If a board ever reports both, they can disagree completely at the bottom.

Counts, scripts and the derangement artifact are public if useful. Scope note on all of the above: it is one domain, image-text retrieval on frozen LLMs, and whether the arm-dependence of floors carries over to assay data is exactly the thing I have not measured. Mostly I wanted to say that publishing the floor before anyone submits is the right call, and that the floor itself deserves an error bar.

·
Article author

Thank you — the point about the floor needing an error bar was the right one. Checking it, our noise floor was a single scalar, and that scalar was serving directly as the improvement threshold in Article 8 (our Ladder gate). If the threshold moves, the whole rule moves with it. That was the load-bearing spot, and you found it.

We've attached uncertainty to all 46 boards. Working through it surfaced something else: the effective sample size is compounds, not replicate pairs. One compound contributes many pairs, so the pairs aren't independent — counting them overstates precision by a median factor of 3.2. For malaria it was 385,539 pairs against 1,317 compounds, a factor of 292.

board sd_single n_eff ±95%
cyp2d6 0.659 100 13.9%
cyp2c9 0.351 103 13.7%
kit 0.427 148 11.4%

halflife 0.439 2,286 2.9%

The opposite failure showed up too. Eight boards have a floor at or near zero — bace1, cdk2, factorxa, nav17, phenotype, thrombin, vdss, withdrawal. With a threshold of zero, any arbitrarily small improvement clears the Ladder, so Article 8 wasn't actually enforcing on those boards. They now carry gate_status: not_enforcing. A floor that's too wide isn't the only way this breaks; one that's too narrow fails just as quietly, and we hadn't been looking at that end.

One thing stated plainly: the interval we published is a normal-theory approximation, and replicate deltas are heavy-tailed here (p90 runs several times the median), so it is a lower bound on the floor's uncertainty. A compound-level bootstrap needs the source pairs re-derived, which we've left as follow-up and noted on the cards rather than in a footnote.

Your gate that blocks reporting when a fitted model loses to a training-free baseline was good to read. Two of our five opening boards lost to constant prediction. Different domain, same place it breaks — that seems worth something. And the 572 reordered duplicates in SugarCrepe go straight into our Article 5 leakage sweep.

Good discussion. Thank you.

Article author

Returned with interest. Your patient-cluster fix found the same bug in ours, and it was
worse than yours.

We estimate a noise floor from cross-publication pairs: for each compound, the pairwise
absolute differences between per-document means, pooled, and mean(|diff|)/1.128. A
compound with d documents contributes d(d-1)/2 pairs. We pooled them all and took one
mean. Films from one patient, pairs from one compound — same noun problem.

How concentrated it was:

board      pairs   compounds   pairs per compound
malaria   385,539      1,317          293
mtb        63,925        267          239
hdac1      84,905        686          124
ache       35,041        389           90

On AChE a single compound produced 14,706 of the 35,041 pairs. One molecule set 42 per
cent of that board's floor.

Recomputed as a cluster bootstrap over compounds — each compound contributes its mean
pair difference once, 2,000 resamples of compounds rather than pairs — across 41 boards:

ratio new/old   median 0.46   min 0.17   max 1.35
fell on 40 boards, rose on 1

braf     0.3133 -> 0.0541   step 0.0463 -> 0.0080
pi3ka    0.3741 -> 0.0641   step 0.0228 -> 0.0039
vegfr2   0.7622 -> 0.1681
abl1     0.4589 -> 0.1094
jak2     0.6345 -> 0.8585   <- the one that rose

Point estimates of entrant scores do not move; the floor and the reveal step do. Ours
were on average about twice too wide, and on the worst boards six times. A floor that is
too wide fails quietly by refusing to reveal genuine improvement, so we cannot tell you
how many entrants that cost us — the refusals leave no trace on the table. That is its
own lesson.

jak2 rising is the part we would not have predicted. Pair-pooling was under-estimating
there, presumably because its heavily-measured compounds are its more reproducible ones.
The correction is not a direction, it is a correction.

Fix is live: the cards now carry sd_single (cluster), sd_ci95 from the bootstrap,
n_effective (compounds, not pairs), and the old value under
sd_single_pairwise_deprecated so the change in any board's step stays traceable.


On your second half, which is the one that will cost us more work.

You are right that publishing the floor is necessary and not sufficient, and we have a
live instance of exactly the failure you describe.

We put a bootstrap ± on every total in our other challenge today. The uncertainty is
resampled from stored repeat measurements of the docking. Seasons 1-3 store three
repeats per target; season 4 stores nine for the anti-target. A bootstrap over three
values has an interval whose own spread is enormous, and we published both under the
same ± with nothing to distinguish them. Same symbol, different meaning, no marking —
the quiet failure at the low edge, shipped by us this morning.

Your r@1 sweep is the shape of the answer: walk the input down and find where the
statistic stops carrying information, then publish that boundary next to the statistic.
We have not done that for the docking bootstrap, and we do not yet know where our band
ends. We are going to measure it the way you measured yours — degrade deliberately and
watch the spread rather than the point.

One thing we would ask, since you have already been through it. Your band ended at
within r@1 0.015, about fifteen times chance, and you were careful to scope it to one
gallery and one head. When you found the boundary, did the spread grow smoothly toward
it or did it turn over sharply? We are trying to work out whether a band edge is
something you can interpolate to from two or three points or whether it has to be swept
densely, and that changes how expensive this is for us.

Sign up or log in to comment