Pairwise correction · 5×5 cross validation · two data sets
MolPAIR1 corrects a tabular foundation model with a second one. A TabPFN 34 reads a frozen CheMeleon2 fingerprint and predicts each endpoint in context; a second TabPFN 3 learns from pairs of training molecules how the first one's error moves from a molecule to its neighbour, and each test molecule borrows the errors of its closest training molecules to correct its own prediction. Run here on the same fifteen ADME endpoints, folds and test sets as everything else on this site, the paper's own claim replicates: the correction beats the prediction it corrects on 41 of 45 endpoint × metric combinations and loses two. It still loses to Monroe + TabPFN 33 on 34 of 45, because the correction is worth a median +0.024 R² and choosing the representation is worth +0.129.
The paper points to its code at github.com/nums-ai/MolPAIR. That repository does not exist — the organisation has four other repositories and nothing by that name — and nothing is on PyPI. So MolPAIR is written here from the paper's Section 3 and Appendix A, with every setting the paper states used as stated: CheMeleon's 2,048-d fingerprint cut to 2,000 features by variance, RDKit 2D descriptor differences for the pairs, TabPFN 3 with eight estimators for both models, five inner folds for the out-of-fold errors, eight anchors per training molecule and a relation context of 8,192 pairs, 32 anchors per query at Tanimoto ≥ 0.20, matched pairs ranked first7, weights s² / u and the gate at τ = 0.20. Where the paper is silent — the matched-pair rules, the fingerprint length, how the inner folds are drawn — the choice is recorded in the study's README. This tests the method as described, not the authors' code, and it does not reproduce the paper's numbers, which are on different benchmarks.
Every arm is handed the same training molecules in every fold — the four fifths of the training set outside the held-out fifth that have a value for the endpoint — and is scored on the same untouched test set. MolPAIR draws its own inner folds inside those four fifths and fits nothing on a test label.
One MolPAIR call returns two predictions: the global prediction it starts from, and the corrected one. Both are arms here. The pair is the paper's own central comparison and isolates exactly what the correction adds. The other three arms are the ones it would have to beat to be worth using: LightGBM on Morgan counts6, the floor; ChemProp5 fine-tuned from CheMeleon, the same pre-trained encoder trained rather than frozen; and Monroe + TabPFN 3, the same head on a different frozen representation and the strongest arm in the nine-method foundation-model comparison. Those three are imported from that comparison unchanged, not re-run.
Tukey HSD per endpoint and metric, counted the way every page on this site counts: a method is on top if Tukey's correction cannot separate it from the best mean, and it is only best alone if nothing else is on top with it. The tables show MAE, in the units of each endpoint.
| Endpoint | LightGBM | CheMeleon FT | Monroe/PFN3 | CheMeleon/PFN3 | MolPAIR |
|---|---|---|---|---|---|
| LogD | 0.545±0.012 | 0.427±0.018 | 0.402±0.015best | 0.553±0.011 | 0.529±0.012 |
| LogS | 0.454±0.015 | 0.358±0.017best | 0.380±0.009 | 0.437±0.011 | 0.431±0.012 |
| LOG_HLM | 0.332±0.009 | 0.314±0.014 | 0.293±0.009tied | 0.311±0.009 | 0.298±0.011tied |
| LOG_MLM | 0.410±0.014 | 0.399±0.030 | 0.358±0.011tied | 0.369±0.011tied | 0.361±0.015tied |
| LOG_Caco_AB | 0.340±0.022 | 0.305±0.033 | 0.248±0.011best | 0.336±0.013 | 0.315±0.014 |
| LOG_Caco_Efflux | 0.432±0.019 | 0.375±0.034 | 0.346±0.012best | 0.413±0.017 | 0.393±0.017 |
| LOG_MPPB | 0.288±0.020 | 0.212±0.021best | 0.259±0.013 | 0.249±0.019 | 0.253±0.021 |
| LOG_MBPB | 0.223±0.018 | 0.157±0.018best | 0.192±0.016 | 0.182±0.014 | 0.172±0.016 |
| LOG_MGMB | 0.302±0.034 | 0.175±0.015tied | 0.204±0.033 | 0.188±0.022tied | 0.188±0.027tied |
| Endpoint | LightGBM | CheMeleon FT | Monroe/PFN3 | CheMeleon/PFN3 | MolPAIR |
|---|---|---|---|---|---|
| LOG_SOL | 0.413±0.009 | 0.370±0.007 | 0.322±0.004best | 0.382±0.004 | 0.373±0.003 |
| LOG_HLM | 0.395±0.005 | 0.337±0.007 | 0.299±0.003best | 0.359±0.003 | 0.351±0.003 |
| LOG_RLM | 0.470±0.005 | 0.404±0.006 | 0.375±0.003best | 0.431±0.004 | 0.420±0.004 |
| LOG_MDR1_ER | 0.385±0.005 | 0.340±0.004 | 0.294±0.002best | 0.370±0.003 | 0.357±0.003 |
| LOG_HPPB | 0.576±0.033 | 0.558±0.025 | 0.438±0.017best | 0.551±0.013 | 0.538±0.014 |
| LOG_RPPB | 0.554±0.021 | 0.553±0.023 | 0.445±0.026best | 0.539±0.020 | 0.526±0.017 |
Monroe + TabPFN 3 is on top of 36 of 45 endpoint × metric combinations across the two data sets. MolPAIR reaches the top of 7, fine-tuned CheMeleon 12, the global stage 3 and LightGBM 0.
The question the paper asks is whether its pair correction improves the prediction it starts from. The folds are the pairing, which is legitimate because both predictions come from the same call on the same training molecules. Across the three metrics the corrected prediction is significantly ahead on 41 of 45 endpoint × metric combinations and behind on 2, and it has the lower mean MAE on 14 of 15 endpoints. The exception is ExpansionRx LOG_MPPB, where the correction makes things worse: R² falls by 0.036 and MAE rises by 0.004. The gain is small and very regular: a median of +0.024 R² and 0.0112 MAE per endpoint, and the corrected prediction has the lower MAE on a median of 25 of 25 folds.
Per molecule, the correction is closer to a coin that lands the right way slightly more often. Binned by how similar the nearest training molecule is, it improves between 51% and 66% of individual test predictions and worsens the rest; the paper reports 55–57% for regression on its own splits. Nearly every prediction is touched: 100.0% on ExpansionRx and 99.4% on Biogen get a non-zero correction.
The paper's comparison stops at its own baseline and at tuned tree models and graph networks on its own benchmarks. Here MolPAIR is paired against the arms that set the bar on these endpoints. A win or a loss is a paired t-test at p < 0.05 on one endpoint and one metric, uncorrected, so read the counts as a direction rather than a verdict on any single cell.
| MolPAIR against | ExpansionRx, 27 | Biogen, 18 | MolPAIR gain, mean of 15 | |||||
|---|---|---|---|---|---|---|---|---|
| wins | no call | losses | wins | no call | losses | Δ R² | MAE drop | |
| CheMeleon + TabPFN 3 (MolPAIR's global stage) | 23 | 2 | 2 | 18 | 0 | 0 | +0.032 | +0.0111 |
| Monroe + TabPFN 3 | 5 | 6 | 16 | 0 | 0 | 18 | −0.111 | −0.0433 |
| ChemProp + CheMeleon, fine-tuned | 5 | 2 | 20 | 3 | 5 | 10 | −0.029 | −0.0147 |
| LightGBM + Morgan | 26 | 1 | 0 | 18 | 0 | 0 | +0.128 | +0.0408 |
MolPAIR beats LightGBM on Morgan counts on 44 of 45 and loses 0. Against fine-tuned CheMeleon on MAE it wins 2 and loses 7 of the 9 ExpansionRx endpoints, and wins 2 and loses 4 of the 6 Biogen ones. Those wins are on exactly the endpoints where fine-tuning CheMeleon did worse than leaving it frozen under TabPFN 3 — Biogen LOG_HPPB, Biogen LOG_RPPB, ExpansionRx LOG_HLM and ExpansionRx LOG_MLM — so they say more about fine-tuning than about the correction. Against Monroe + TabPFN 3 it is behind on MAE on 12 of 15 endpoints, by a median of 0.050, which is 4 times what the correction itself buys. The endpoints where it is ahead, ExpansionRx LOG_MBPB, ExpansionRx LOG_MGMB and ExpansionRx LOG_MPPB, are the ones where Monroe's embedding is itself worse than CheMeleon's fingerprint under the same TabPFN 3: the representation, not the correction, decides them.
All three of the arms below start from the same place, CheMeleon + TabPFN 3, and each changes one thing about it. MolPAIR keeps the frozen fingerprint and adds the pair correction. Fine-tuned CheMeleon trains the encoder instead of freezing it, and swaps TabPFN for a feed-forward head. Monroe keeps TabPFN 3 and replaces the fingerprint with a different frozen embedding. Each column is the change in mean R² over 25 folds.
| Endpoint | Data set | Add MolPAIR's pair correction | Fine-tune CheMeleon instead | Read Monroe's embedding instead |
|---|---|---|---|---|
| LOG_HLM | Biogen ADME | +0.023 | +0.047 | +0.129 |
| LOG_HPPB | Biogen ADME | +0.024 | +0.010 | +0.258 |
| LOG_MDR1_ER | Biogen ADME | +0.024 | +0.040 | +0.161 |
| LOG_RLM | Biogen ADME | +0.023 | +0.042 | +0.098 |
| LOG_RPPB | Biogen ADME | +0.033 | −0.042 | +0.218 |
| LOG_SOL | Biogen ADME | +0.019 | +0.021 | +0.162 |
| LOG_Caco_AB | ExpansionRx | +0.111 | +0.117 | +0.428 |
| LOG_Caco_Efflux | ExpansionRx | +0.089 | +0.178 | +0.342 |
| LOG_HLM | ExpansionRx | +0.045 | −0.020 | +0.073 |
| LOG_MBPB | ExpansionRx | +0.029 | +0.088 | −0.034 |
| LOG_MGMB | ExpansionRx | +0.011 | +0.073 | +0.019 |
| LOG_MLM | ExpansionRx | +0.028 | −0.111 | +0.044 |
| LOG_MPPB | ExpansionRx | −0.036 | +0.153 | −0.089 |
| LogD | ExpansionRx | +0.038 | +0.178 | +0.225 |
| LogS | ExpansionRx | +0.018 | +0.135 | +0.104 |
| median | +0.024 | +0.047 | +0.129 |
The correction is worth a median +0.024 R², fine-tuning the encoder +0.047, and the representation +0.129 — about 5 times the correction, and larger than it on 13 of 15 endpoints. What the correction has is consistency: it raises R² on 14 of 15 endpoints, against 12 for fine-tuning and 13 for the representation. It is the largest of the three on none of them.
MolPAIR is pitched at structural shift. The paper's primary split holds out whole scaffold groups and then drops every test molecule more similar than Tanimoto 0.60 to any training molecule. The splits here hold out whole BitBIRCH clusters with no similarity cutoff, so they keep close analogues the paper's would remove — which is where borrowing a neighbour's error should work best, not worst. If the result above were an artefact of easier splits, the gain would be concentrated in those close molecules.
The two data sets differ here. The median test molecule's nearest training molecule is at Tanimoto 0.35 on Biogen, and 96% of its test molecules would have survived the paper's cutoff: Biogen is close to the paper's regime as it stands. On ExpansionRx the median is 0.60 and only 50% would survive. Scoring the correction separately on the two populations, per endpoint and per fold:
| Data set | Test molecules | Share of test set | Endpoints scored | Mean MAE drop | Wins / no call / losses |
|---|---|---|---|---|---|
| ExpansionRx | Nearest training molecule ≤ 0.60 | 50% | 9 | +0.0053 | 5 / 3 / 1 |
| ExpansionRx | Nearest training molecule > 0.60 | 50% | 9 | +0.0157 | 8 / 1 / 0 |
| Biogen ADME | Nearest training molecule ≤ 0.60 | 96% | 6 | +0.0104 | 6 / 0 / 0 |
| Biogen ADME | Nearest training molecule > 0.60 | 4% | 4 | +0.0193 | 2 / 2 / 0 |
The correction does more for close analogues, as it should: a mean MAE drop of 0.0168 on test molecules with a training neighbour above 0.60, winning 10 of 13 endpoints and losing 0, against 0.0073 on the molecules the paper's protocol would keep. On ExpansionRx the drop among close analogues is larger on 9 of 9 endpoints. But on the paper's population it still wins 11 of 15 endpoints and loses 1 (LOG_MPPB). So the easier part of these splits flatters the size of the gain — on ExpansionRx the mean MAE drop is 0.0107 over the whole test set and 0.0053 over the part the paper would have kept — but the replication does not depend on it.
Every fold fits seven TabPFN 3 models — one global, five out-of-fold, one relation — and predicts every query–anchor pair in both directions. On one RTX 5070 Ti:
| Data set | Folds | Median s / fold | Slowest fold, s | Median query–anchor pairs / fold | Total, GPU hours |
|---|---|---|---|---|---|
| Biogen ADME | 150 | 60 | 79 | 20,608 | 1.9 |
| ExpansionRx | 225 | 104 | 231 | 37,440 | 5.9 |
Most of that is the relation model reading tens of thousands of pair rows against an 8,192-row context. By comparison the source comparison reports the 225 ExpansionRx folds of Monroe + TabPFN 3 taking 14 minutes on the same card.
One configuration. MolPAIR is run in the paper's primary configuration, CheMeleon with TabPFN 3. The paper also runs it over Monroe's embedding, where it reports a smaller gain than over CheMeleon. That combination — the correction on top of the representation that wins here — is the obvious next arm and is not run.
A reimplementation. The authors' code is not available, so differences between this and their implementation in the details the paper does not specify cannot be ruled out. The direction of the gain over the global stage, its regularity, and the share of individual predictions it improves all match what the paper reports, which is some evidence the method is the same one.
Not the paper's splits or endpoints. Fifteen ADME endpoints, not MoleculeACE and Polaris, and cluster splits, not scaffold-plus-similarity. The section above scores the correction on the paper's population inside these splits, which narrows the gap but does not close it.
Reported the way “Even More Thoughts on ML Method Comparisons” and the protocol paper it points at10 argue comparisons should be: distributions over folds, simultaneous confidence intervals, paired tests on the folds, and no bolded maxima. Where two methods cannot be separated, both are reported as tied.
Code, per-fold metrics and every figure: studies/molpair.