Model Validation Central
Four modelling approaches on the ten ChEMBL potency data sets and six splitting schemes of Lee, Moldagulov and Grzybowski1 — on that paper's own folds, against that paper's own naive baseline and its own six arms.
The paper this page is built on makes two claims. The first is that k-nearest neighbours performs comparably to modern machine learning under every splitting scheme it tries, which is the finding of Janela and Bajorath restated on ten targets and six schemes. The second is that as the schemes get more stringent, every method's accuracy deteriorates towards a naive baseline, so that reported accuracies obtained under lenient splits are inflated. Both claims are tested here on the paper's own folds, with two kinds of model it did not have: a pre-trained graph network that is fine-tuned, and a pre-trained encoder that is frozen and read in context, with nothing trained downstream at all.
The second claim survives and the first does not. Raw MAE rises for every arm as the splits harden — for Monroe + TabPFN 3.5, the strongest arm here, by +0.358 pIC₅₀ units from the random scheme to the time one. But the naive baseline rises by +0.061 over the same span, and most of what looks like a collapsing model is a moving target. What does not move much is the distance between the two: 0.439 pIC₅₀ of MAE taken off the naive predictor on the easiest scheme, 0.141 on the hardest.
On the first claim, k-NN is separable from Monroe + TabPFN 3.5 on all six schemes by a Holm-corrected paired test over fifty folds, including the time split, where the gap is 0.131 pIC₅₀ and Monroe + TabPFN 3.5 is ahead on 90% of the fifty folds. Across all 18 scheme × metric combinations Monroe + TabPFN 3.5 is best alone on 7 and tied for best on 11. The paper's own six arms, imported at their published per-fold numbers, do not change that: they are all variations on learning from one target's labels and a fingerprint, and the thing that separates here is the representation.
Whether that is good news depends on what is being asked. If the question is whether the field's reported accuracies are inflated by lenient splits, the paper is right and this page agrees with it. If the question is whether anything beats nearest-neighbour lookup out of distribution, the answer turns out to depend on which models are in the comparison.
The paper's Figure 2 is a set of boxplots of MAE, one panel per scheme, and the trend in it is unmistakable: error climbs as the splits harden until the models sit on top of a naive baseline. The figure below is that figure, rebuilt on this study's arms and this study's folds, and the trend is the same. Nothing here disputes it.
What the raw axis hides is that the baseline moves too. The training median scores 0.879 MAE on the random scheme and 0.940 on the time one, a drift of +0.061 that has nothing to do with any model. The schemes select structurally different training sets, so the potency distribution a fold trains on is different, and its median is a different guess. The paper says this in a parenthesis under its own figure. It is worth promoting to an axis.
Read as a distance from that baseline, the picture is less uniform. The best arm on each scheme takes between 0.121 and 0.439 pIC₅₀ off the naive predictor — thinnest on the umap cluster scheme, widest on the random one. On the time split, Monroe + TabPFN 3.5 still beats the naive predictor on 86% of the fifty folds. 2 arm × scheme combinations fall below zero — GNN (published) on umap cluster and time — which is to say those arms would have done better predicting the training median for every molecule.
The distinction matters for what the paper concludes from the trend. Accuracy quoted on a random split is inflated as a guide to prospective performance — that is established, here and there. Accuracy converging towards a naive baseline is a stronger claim, and on this evidence it holds for the arms the paper tested and not for Monroe + TabPFN 3.5.
| Scheme | Naive MAE | Best MAE | Gap | Which arm |
|---|---|---|---|---|
| Random | 0.879 | 0.440 | +0.439 | Monroe + TabPFN 3.5 |
| Bemis-Murcko scaffold | 0.882 | 0.543 | +0.338 | Monroe + TabPFN 3.5 |
| Butina cluster | 0.896 | 0.691 | +0.205 | Monroe + TabPFN 3.5 |
| Diverse (MaxMin 25%) | 0.907 | 0.718 | +0.189 | Monroe + TabPFN 3.5 |
| UMAP cluster | 0.898 | 0.777 | +0.121 | Monroe + TabPFN 3.5 |
| Time | 0.940 | 0.798 | +0.141 | Monroe + TabPFN 3.5 |
| Scheme | k-NN | LightGBM | CheMeleon | Monroe/PFN3.5 | k-NN* | SVM* | RF* | XGB* | MLP* | GNN* |
|---|---|---|---|---|---|---|---|---|---|---|
| Random | +0.379100% | +0.391100% | +0.416100% | +0.439100% | +0.379100% | +0.409100% | +0.392100% | +0.390100% | +0.387100% | +0.284100% |
| Bemis-Murcko scaffold | +0.26298% | +0.289100% | +0.315100% | +0.338100% | +0.26298% | +0.304100% | +0.295100% | +0.284100% | +0.27098% | +0.18996% |
| Butina cluster | +0.11084% | +0.15794% | +0.18588% | +0.20594% | +0.11084% | +0.16394% | +0.16194% | +0.16288% | +0.12376% | +0.03962% |
| Diverse (MaxMin 25%) | +0.11482% | +0.15494% | +0.15388% | +0.18998% | +0.11484% | +0.14894% | +0.15498% | +0.13292% | +0.12586% | +0.01450% |
| UMAP cluster | +0.00536% | +0.06462% | +0.09068% | +0.12184% | +0.00536% | +0.08380% | +0.06560% | +0.05462% | +0.03960% | -0.02544% |
| Time | +0.01042% | +0.08976% | +0.10976% | +0.14186% | +0.01042% | +0.10778% | +0.11190% | +0.08568% | +0.06764% | -0.05636% |
Mean MAE taken off the naive predictor, in pIC₅₀ units, paired on the fold; the small figure is the share of the fifty folds on which the arm beats it. Positive is better than predicting the training median.
Up to this point the six schemes have been an ordering borrowed from the paper. They can be measured. For every one of the 300 folds, each test molecule's nearest training neighbour was found by ECFP4 Tanimoto, and the fold summarised by the mean of those similarities — the quantity the paper plots in its Figures 5 and 6.
The ordering mostly holds. Mean nearest-neighbour similarity falls from 0.751 on the random scheme to 0.393 on the umap cluster one, where 40% of test molecules have no training neighbour above the Butina threshold the paper itself clusters at. It is not quite monotone in the paper's presentation order — the time and UMAP splits swap, and the diverse split is closer to them than its position in the sequence suggests — which is worth knowing before reading a trend across the six as a straight line.
That turns the independent variable from a six-valued label into a continuous one, and with it each method's accuracy can be plotted against distance directly. The slope of that line is the claim the paper is really making: that every method decays at the same rate as the test molecules move away. It is fitted below on the gap to the naive baseline rather than on raw MAE, because raw MAE confounds the decay with the baseline drift of the previous section. The shallowest decay belongs to RF (published).
Extrapolated to a similarity of 0.30 — roughly what the hardest schemes deliver — LightGBM + Morgan, ChemProp + CheMeleon, Monroe + TabPFN 3.5, SVM (published) and RF (published) still take MAE off the naive predictor, while k-NN (Tanimoto), k-NN (published), XGBoost (published), MLP (published) and GNN (published) no longer do.
| Scheme | Mean NN Tanimoto | Below 0.35 | Train | Test |
|---|---|---|---|---|
| Random | 0.751 | 2% | 968 | 269 |
| Bemis-Murcko scaffold | 0.651 | 6% | 968 | 269 |
| Butina cluster | 0.484 | 29% | 968 | 269 |
| Diverse (MaxMin 25%) | 0.436 | 19% | 242 | 67 |
| UMAP cluster | 0.393 | 40% | 968 | 269 |
| Time | 0.415 | 38% | 672 | 561 |
Averaged over the fifty folds of each scheme. “Below 0.35” is the share of test molecules whose nearest training neighbour falls under the Butina threshold the paper clusters at — molecules with no close analogue to learn from. Train and test are molecules per fold.
Before reading a trend across the six, it is worth asking whether the six vary one thing or two. Four of them train on 72.0% of a target and test on 20.0%, and they do it to within a rounding error: across one target's five folds the largest training set and the smallest differ by about one molecule on the random, scaffold and Butina schemes. The other two do not. The diverse (maxmin 25%) scheme trains on 18% of a target, 242 molecules against 968. The time scheme trains on 50% of a target, 672 molecules against 968.
That matters because training-set size and distance travel together across the whole collection: Spearman ρ = +0.38 between the two over all 300 folds. Within the four size-matched schemes it disappears, ρ = +0.09, p = 0.18. So random, bemis-murcko scaffold, butina cluster and umap cluster are a clean four-point experiment — nearest-neighbour similarity falls from 0.751 to 0.393 while the training set stays at about 968 molecules — and the other two confound moving the test set away with taking the training data away. A model doing worse on the diverse split than on the random one has been handed a quarter of the data as well as a harder test set, and nothing in a raw comparison separates those.
Nothing below is dropped on that account, because the paper's six schemes are what this study set out to run. But the decay fitted against distance pools all six, so it carries some of the confound, and the comparison that does not is the one across the four size-matched schemes. Where the two tell the same story it is said once; where they differ, the four-scheme version is the one to believe.
| Scheme | Train % | Test % | Train molecules | Fold range | Test CV % | NN Tanimoto |
|---|---|---|---|---|---|---|
| Random | 72.0±0.0 | 20.0±0.0 | 968 | 0.7 | 0.2 | 0.751 |
| Bemis-Murcko scaffold | 72.0±0.0 | 20.0±0.0 | 968 | 0.7 | 0.2 | 0.651 |
| Butina cluster | 72.0±0.0 | 20.0±0.0 | 968 | 0.9 | 0.2 | 0.484 |
| Diverse (MaxMin 25%) | 18.0±0.0 | 5.0±0.0 | 242 | 0.6 | 0.6 | 0.436 |
| UMAP cluster | 72.0±4.7 | 20.0±5.2 | 968 | 156.0 | 26.8 | 0.393 |
| Time | 49.9±19.8 | 41.9±22.1 | 672 | 720.1 | 57.5 | 0.415 |
Percentages are of each target, because the ten data sets run from 1,000 to 2,273 molecules. “Fold range” is the largest minus the smallest training set among one target's five folds, averaged over targets, and “Test CV %” the same spread for the test sets — both are what a scheme controls, unlike the differences between targets. Green marks the four schemes that hold training-set size fixed.
| Method | Slope | Spearman ρ | Gap at 0.60 | Gap at 0.30 |
|---|---|---|---|---|
| k-NN (Tanimoto) | 0.981 | 0.723 | +0.223 | -0.071 |
| LightGBM + Morgan | 0.847 | 0.672 | +0.257 | +0.003 |
| ChemProp + CheMeleon | 0.878 | 0.669 | +0.280 | +0.017 |
| Monroe + TabPFN 3.5 | 0.853 | 0.690 | +0.306 | +0.050 |
| k-NN (published) | 0.982 | 0.723 | +0.224 | -0.071 |
| SVM (published) | 0.855 | 0.710 | +0.269 | +0.013 |
| RF (published) | 0.813 | 0.692 | +0.260 | +0.016 |
| XGBoost (published) | 0.864 | 0.694 | +0.252 | -0.007 |
| MLP (published) | 0.892 | 0.683 | +0.238 | -0.029 |
| GNN (published) | 0.919 | 0.705 | +0.146 | -0.130 |
A linear fit of the gap to the naive baseline against each fold's mean nearest-neighbour similarity, over all 300 folds and all six schemes pooled. The slope is how fast a method loses its advantage as the test molecules move away; the last two columns are what the fit says it is worth at a similarity typical of the scaffold split and of the UMAP split. A negative number is a method that would have done better predicting the training median.
The tally below counts, over every scheme and every metric, how often each arm is best on its own, tied for best, and separably worse. A method that cannot be distinguished from the leader is counted as tied and the leader is not called a winner, which is the convention the rest of this repository uses and the reason there are no bold maxima anywhere on the page.
The verdicts come from Holm-corrected paired tests over each scheme's fifty folds, not from the pooled Tukey the paper's aggregation implies. The two figures below show why that choice is not cosmetic. In the pooled version every interval is wide enough to swallow the field, and the honest reading of it is that nothing can be told from anything — which is, in effect, the paper's conclusion. The between-target spread in this collection is around 0.2 pIC₅₀ and the differences between methods are a few hundredths, so fifty numbers treated as independent samples have almost no power. Paired on the fold, where both arms saw the identical training molecules, the same data separates 1 arm at the top of the random scheme from the rest.
The correction is not doing the work of hiding differences either. On the umap cluster scheme 4 arms share the top on MAE — ChemProp + CheMeleon, Monroe + TabPFN 3.5, SVM (published) and RF (published) — and that is a real tie rather than a failure of power, because the same test separates the field elsewhere. k-NN (Tanimoto), LightGBM + Morgan, Training median, k-NN (published) and XGBoost (published) reach the top of nothing, anywhere.
Over 18 scheme × metric combinations. Where two arms cannot be separated by a Holm-corrected paired test, both are counted as tied and neither is called the winner. The naive baseline is in the count for MAE and R², and out of it for Spearman ρ, which a constant prediction has none of.
| Scheme | k-NN | LightGBM | CheMeleon | Monroe/PFN3.5 | naive | k-NN* | SVM* | RF* | XGB* | MLP* | GNN* |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Random | 0.500±0.064 | 0.488±0.046 | 0.463±0.044 | 0.440±0.042best | 0.879±0.089 | 0.500±0.064 | 0.471±0.045 | 0.487±0.054 | 0.490±0.047 | 0.492±0.049 | 0.595±0.058 |
| Bemis-Murcko scaffold | 0.620±0.081 | 0.592±0.072 | 0.567±0.078 | 0.543±0.068best | 0.882±0.111 | 0.620±0.081 | 0.578±0.075 | 0.587±0.078 | 0.598±0.079 | 0.612±0.082 | 0.692±0.082 |
| Butina cluster | 0.786±0.139 | 0.739±0.114 | 0.711±0.130tied | 0.691±0.128tied | 0.896±0.166 | 0.786±0.139 | 0.732±0.133 | 0.735±0.138 | 0.734±0.135 | 0.773±0.147 | 0.857±0.178 |
| Diverse (MaxMin 25%) | 0.793±0.109 | 0.753±0.079 | 0.754±0.097tied | 0.718±0.093tied | 0.907±0.118 | 0.793±0.096 | 0.759±0.088 | 0.753±0.084 | 0.775±0.094 | 0.781±0.099 | 0.893±0.112 |
| UMAP cluster | 0.893±0.130 | 0.834±0.141 | 0.808±0.173tied | 0.777±0.122tied | 0.898±0.171 | 0.893±0.130 | 0.815±0.140tied | 0.833±0.143tied | 0.844±0.140 | 0.859±0.171 | 0.923±0.195 |
| Time | 0.930±0.141 | 0.851±0.129 | 0.831±0.124 | 0.798±0.125best | 0.940±0.146 | 0.930±0.141 | 0.833±0.125 | 0.829±0.119 | 0.855±0.132 | 0.872±0.141 | 0.996±0.185 |
Two things could make the verdicts above look stronger than they are, and both are checked rather than argued about. The differences might not be normal, so every pair is also tested with a Wilcoxon signed-rank test: it agrees with the t-test on 894 of the 930 pairs on this page. More seriously, the fifty folds of a scheme are not fifty independent observations — the time split gives each fold its own year cutoff, so a target's five test sets overlap. Averaging each arm's five folds within a target first and pairing on the ten targets removes that entirely, at the cost of going from fifty paired observations to ten.
That target-level test agrees with the fold-level one on 696 of 930 pairs. Where they differ it is almost always the same direction — 231 calls are lost and 3 gained — which is what losing 80% of the sample should do, not evidence that the fold-level test was wrong. The question is whether the headline survives it, and it does: Monroe + TabPFN 3.5 separates from k-NN on five of the six schemes even on ten paired targets, the exception being diverse (maxmin 25%). Every p value in head_to_head.csv is stored under all three tests.
The k-NN arm here is the paper's own, re-implemented from its released code: a distance-weighted KNeighborsRegressor on a precomputed Tanimoto distance matrix over ECFP4 bit vectors, with k chosen from {1, 3, 5} by validation MAE. It is the one arm in this study whose numbers can be checked against the source, and 500 of 500 (5 schemes × 50 folds × MAE and R²) reproduce the published per-fold values to within 6e-09. The fifty folds that do not are all on the one scheme whose validation split upstream did not record; the protocol section says what was done about that. So when the table below disagrees with the paper, it is not disagreeing about what k-NN did.
It disagrees about what that means. Against Monroe + TabPFN 3.5, k-NN is separably worse on all six schemes (random, bemis-murcko scaffold, butina cluster, diverse (maxmin 25%), umap cluster and time). There is no scheme on which it holds its own. A Wilcoxon signed-rank test in place of the t-test agrees on 6 of those 6.
Against the fingerprint baseline the paper's conclusion fares better: LightGBM on Morgan counts separates from k-NN on three of the six schemes (bemis-murcko scaffold, umap cluster and time). Two similarity models on the same fingerprint do behave alike, which is the part of the Janela and Bajorath result this study reproduces rather than contradicts. What breaks the pattern is not a better learner on the same features. It is different features.
| Scheme | Δ MAE | Folds to Monroe/PFN3.5 | pHolm | Verdict |
|---|---|---|---|---|
| Random | -0.060 | 0% | 1.7e-13 | Monroe/PFN3.5 wins |
| Bemis-Murcko scaffold | -0.076 | 2% | 8.4e-13 | Monroe/PFN3.5 wins |
| Butina cluster | -0.095 | 16% | 1.1e-04 | Monroe/PFN3.5 wins |
| Diverse (MaxMin 25%) | -0.075 | 24% | 5.7e-05 | Monroe/PFN3.5 wins |
| UMAP cluster | -0.116 | 4% | 4.3e-10 | Monroe/PFN3.5 wins |
| Time | -0.131 | 10% | 1.7e-09 | Monroe/PFN3.5 wins |
MAE is the paper's metric and it is the right one for a headline, because it is in the units of the endpoint and it can be read against a naive baseline. It is also the metric least kind to a model that has the ordering right and the scale wrong, which is the failure mode of a model extrapolating off its training distribution. Spearman ρ asks the question a screening campaign actually asks: can the compounds be put in the right order.
The answer degrades the same way, and further. The best ρ on the random scheme is 0.809; on the time scheme it is 0.378. Unlike MAE, there is no moving baseline to subtract here — a rank correlation of zero is zero on every scheme — so this is the cleanest statement of how much predictive signal is left when the test molecules are genuinely elsewhere in chemical space, and it is not much.
The naive baseline is absent from this table and from the figure under it. A constant prediction has no ranking to score, and Spearman ρ against it is undefined rather than zero; it is recorded as missing rather than filled in, so it does not appear as a bar at the origin that a reader could mistake for a measurement.
| Scheme | k-NN | LightGBM | CheMeleon | Monroe/PFN3.5 | k-NN* | SVM* | RF* | XGB* | MLP* | GNN* |
|---|---|---|---|---|---|---|---|---|---|---|
| Random | 0.753±0.059 | 0.773±0.059 | 0.794±0.050 | 0.809±0.043best | 0.753±0.059 | 0.792±0.053 | 0.785±0.050 | 0.769±0.064 | 0.770±0.055 | 0.681±0.077 |
| Bemis-Murcko scaffold | 0.623±0.125 | 0.657±0.146 | 0.688±0.132tied | 0.708±0.116tied | 0.623±0.125 | 0.684±0.119tied | 0.681±0.114 | 0.652±0.134 | 0.644±0.133 | 0.573±0.144 |
| Butina cluster | 0.391±0.148 | 0.460±0.156 | 0.496±0.166tied | 0.516±0.183tied | 0.391±0.148 | 0.491±0.176tied | 0.471±0.163tied | 0.459±0.169 | 0.440±0.169 | 0.377±0.172 |
| Diverse (MaxMin 25%) | 0.424±0.137 | 0.464±0.149 | 0.477±0.148 | 0.524±0.144tied | 0.428±0.135 | 0.476±0.154 | 0.487±0.140tied | 0.430±0.152 | 0.452±0.163 | 0.200±0.230 |
| UMAP cluster | 0.187±0.156 | 0.256±0.238 | 0.313±0.242tied | 0.325±0.258tied | 0.187±0.156 | 0.296±0.221tied | 0.269±0.232tied | 0.237±0.237 | 0.273±0.215tied | 0.231±0.273tied |
| Time | 0.264±0.192 | 0.319±0.196 | 0.363±0.233tied | 0.378±0.230tied | 0.264±0.192 | 0.350±0.218tied | 0.327±0.216 | 0.304±0.221 | 0.312±0.217 | 0.275±0.227 |
Ten ChEMBL 30 potency data sets, 1,000 to 2,273 molecules each and 13,444 in total, with pIC₅₀ from 5 to 11. They are the collections assembled by Janela and Bajorath and redistributed in the paper's release, and they arrive here unchanged.
Nothing was split here. The release ships, for each target and each of five folds, six splitting schemes as explicit train / validation / test index lists, and those lists are the protocol. Every arm fits on a fold's training indices and is scored on its test indices, so every arm sees identical training molecules in every fold and a difference in the metrics is a difference in the method. The validation indices are used only where an arm needs them — k for k-NN, early stopping for ChemProp. LightGBM and Monroe have nothing to tune per fold and no training loop to stop, so they leave those molecules unused rather than training on molecules the other arms never see.
Which copy of the splits. The release ships them twice and the two copies disagree: data/splits/indices/*.pkl and data/splits/*.json agree on the random, scaffold and time schemes and differ on butina, umap and diverse — for umap the two test sets do not share a single molecule. The .pkl files are the ones the paper's numbers came from: re-running its released k-NN on them reproduces 500 of 500 published per-fold MAE and R² values to 6e-09 on the five schemes recorded in full, where the .json indices reproduce butina and umap not at all. So the .pkl indices are the protocol, and that reproduction is kept as a check that runs on every collection pass rather than as a note.
The sixth scheme needed a repair. diverse_25 has an empty validation set in every one of the fifty .pkl files — upstream carved one out of the training pool inside the run and did not record it. The .json copy does record one, and on all fifty combinations it is a subset of the .pkl training pool, the two test sets are identical, and .pkl train equals .json train plus validation. Taking the validation molecules from the .json copy therefore contradicts nothing, and it is what gives ChemProp something to stop early on. All three relations are asserted before it is done. The fifty k-NN folds that do not reproduce are all on this scheme, and the published arms on it trained on a different 237 molecules of the same 263-molecule pool against an identical test set — comparable, but not identical.
The statistics are the part that differs most from the paper. Each scheme gives fifty folds per arm, ten targets by five folds, and the between-target spread is an order of magnitude larger than the differences between methods. So the primary test is paired on the fold, where the target effect cancels, with Holm's correction applied within each scheme and metric across every pair on the page. Three tests are computed and stored for every pair: the paired t-test over the fifty folds, a Wilcoxon signed-rank test that drops the normality assumption, and a target-level t-test that drops the independence assumption instead, by averaging each method's five folds within a target and pairing on the ten targets. The last one is there because the time split gives every fold its own year cutoff, so a target's five test sets overlap and fifty differences computed on overlapping molecules are not fifty independent observations. It costs power, so it is a check rather than the headline. The Tukey figure is drawn on target-centred values, the standard randomized-block adjustment, which leaves every arm's mean exactly where it was and only narrows the intervals. The raw pooled Tukey is drawn beside it because the difference between the two is part of the argument.
Every script, both copies of the splits, and all predictions are at model-validation-central/studies/split-fragility. The figures and tables on this page rebuild from the stored predictions in under a minute, with no retraining. test_split_stats.py checks the statistics against synthetic data with a known answer.
Statistics follow the approach in “Even More Thoughts on ML Method Comparisons” and the protocol paper it points at: distributions of fold-level metrics, corrections for multiple comparisons, and paired tests using the folds as the pairing.