A four-model stack for CYP inhibition

Method report · OpenADMET CYP Inhibition Challenge · Regression track · Report version 2026-11-02
Team Cypress Ridge

1. In short

We predict pIC50 for CYP3A4, CYP2C9, CYP2D6 and CYP1A2. The method rests on one idea: models that make different mistakes can be combined into one that is more accurate than any of them.

Cross-validation on training data
0.685
Mean ST-RAE, 5 scaffold folds (95% CI 0.665–0.707). Lower is better; 1.0 = always predicting the mean. Not a test-set or leaderboard score.
  • Four models, combined per enzyme, beat every single model on every enzyme.
  • What moved the needle: ChemProp, confidence-weighted training rows and the 8-output ChemProp recipe (section 3).
  • Public challenge data and two published pretrained models. No proprietary data.

2. The idea

A model helps the combination when its errors differ from the others' and it is accurate enough on its own.

Which models earn their place

ChemProp is both different and accurate. SVR is different but weak. LightGBM and TabPFN are accurate but near-twins.

ModelAlone (ST-RAE)Error overlap with the other three  (lower = more different)Cost to remove it
ChemProp0.8080.81 most different+0.041
TabPFNbest0.7430.86+0.002
LightGBM0.7520.86+0.001
SVRweakest0.8220.83−0.000

Only removing ChemProp clearly hurts the stack. Definitions and 95% CIs: appendix A4.

3. What moved the needle

Five changes clearly improved the cross-validated score (95% CI excludes zero).

What helpedEffect on mean ST-RAE (95% CI)
ChemProp in the stackRemoving it worsens the stack by 0.041 (0.031–0.050)
Weighting training rows by measurement confidenceImproves LightGBM by 0.047 (0.034–0.061)
A pretrained fingerprint for TabPFNImproves TabPFN by 0.022 (0.014–0.030) over descriptors alone
ChemProp's 8-output recipe [6]The stack is 0.011 (0.006–0.016) better than with a 4-output ChemProp
A more regularised combinerRidge alpha 100 improves the stack by 0.0028 (0.0008–0.0047) over alpha 1

Charts and caveats: appendix A4.

4. What did not move it

None of these is in the submitted model.

Numbers with 95% CIs: appendix A4.

5. Results

The stack scores 0.685. It beats every single model on every enzyme, which is why we submit the combination rather than any one model.

Mean ST-RAE over four enzymes — lower is better · whiskers show 95% CI · dashed line = always predict the mean
LightGBMSVRTabPFNChemPropStack
Stack (submitted)
0.685 [0.665, 0.707]
TabPFN
0.743 [0.722, 0.764]
LightGBM
0.752 [0.734, 0.773]
ChemProp
0.808 [0.781, 0.840]
SVR
0.822 [0.804, 0.841]
00.250.50.751.0

Per enzyme

ModelCYP3A4CYP2C9CYP2D6CYP1A2Mean
LightGBM0.5430.6840.9360.8460.752
SVR0.6500.8470.9390.8540.822
TabPFN0.5590.6640.9210.8270.743
ChemProp0.4820.6431.1570.9520.808
Stack (submitted)0.4600.5890.8990.7910.685

CYP2D6 is the hardest enzyme for every model (appendix A6).

Appendix

A1. Data and disclosures

All training data comes from the public challenge release. The organisers describe the compounds as an Enamine diversity set plus FDA-approved drugs [1].

DataSizeUse
Direct-inhibition pIC50, with credible intervals4,905 moleculesMain targets for all four models. Labels per enzyme: CYP3A4 2,335 · CYP2C9 1,285 · CYP2D6 1,493 · CYP1A2 1,412.
Single-concentration screen, log2 fold change17,504 rowsExtra training targets for ChemProp only. We do not submit them.
Blinded test set750 moleculesStructures only. We predict these. We never saw their labels.
CheMeleon pretrained weightsMIT licenceStart point for ChemProp, and a frozen molecule fingerprint for TabPFN [2].
TabPFN v3 regressor weightsTabPFN-3 licence v1.0Pretrained tabular model [3].

We used no proprietary data. No in-house measurements, no external assay data and no computed features from outside the challenge enter the submitted model.

A2. Model settings

ModelInputKey settings
LightGBM [4]ECFP4 counts (2,048) + Mordred 2D descriptors (1,613)One model per enzyme. 100 trees, learning rate 0.1, 31 leaves. Rows weighted by 1 / credible-interval width, scaled to mean 1.
SVRECFP4 bits (2,048)One model per enzyme. Tanimoto kernel, C 1.0, epsilon 0.1. No row weights.
TabPFN v3 [3]CheMeleon embedding (2,048 → 100 by PCA) + 28 Mordred physchem descriptorsOne model per enzyme. 8 estimators. PCA and missing-value fill are fit inside each training fold.
ChemProp [5]Molecular graphOne network for all enzymes, started from CheMeleon. Hidden size 2,048, depth 6, 50 epochs. Eight outputs: 4 pIC50 + 4 single-concentration log2 fold changes, after a published recipe [6].
RidgeThe four models' out-of-fold predictionsOne per enzyme. Alpha 100. Inputs standardised.

Same start, different models. ChemProp and TabPFN both start from CheMeleon, a network pretrained to predict molecular descriptors [2]. ChemProp retrains the whole network on our labels. TabPFN keeps it frozen and uses its output as a fingerprint.

A3. How we validated

Scaffold foldsWe group molecules by generic Bemis–Murcko scaffold (the ring system and its linkers) into 5 folds. Models that never saw a fold's scaffolds predict that fold.
Cross-fitted combinerThe Ridge that predicts a held-out fold is also fit without that fold. So the combined score does not grade the Ridge on rows it learned from.
ST-RAE, the challenge metricError is zero when a prediction falls inside the measurement's credible interval. Outside it, only the distance to the nearest edge counts. The total is divided by the same error for a model that always predicts the mean.
UncertaintyWe bootstrap the scored rows 1,000 times for 95% intervals. To compare two models, we resample the same rows for both and report the paired difference.

These are cross-validation scores on the training data, not blind-test estimates. We used the same folds to choose between options, so the score of the chosen model may be optimistic. We did not measure by how much.

A4. The combiner and every option tested

Error overlap (section 2): the model's average Pearson correlation of out-of-fold residuals (prediction minus label) with each other model, over all four enzymes; bar axis 0.70–0.90. Shared label noise can inflate these correlations. Cost to remove: change in the stack's mean ST-RAE without that model, with its 95% CI in the first chart below. The charted stack comparisons are paired, against the four-model stack with Ridge alpha 1 (0.687), on the same folds.

Ridge weight3A42C92D61A2
LightGBM0.120.120.070.09
SVR0.10−0.010.080.02
TabPFN0.250.130.150.14
ChemProp0.460.320.140.35

Coefficients of the final Ridge for each enzyme. Inputs are standardised before the Ridge. Bold = largest weight.

Remove one model, or change ChemProp — paired change in the stack's mean ST-RAE with 95% CI · right of zero = worse
worse, CI excludes zerono clear change
Remove ChemProp
+0.041 [+0.031, +0.050]
ChemProp with 4 outputs only
+0.011 [+0.006, +0.016]
Remove TabPFN
+0.002 [−0.002, +0.006]
Remove LightGBM
+0.001 [−0.001, +0.003]
Remove SVR
−0.000 [−0.002, +0.002]
−0.010+0.02+0.04

The 8-output ChemProp adds the four single-concentration screen targets to the four pIC50 targets, after a published recipe [6]. It scores worse alone than the 4-output version (0.808 vs 0.769), but the stack is better with it. The two versions also differ in loss weights, so the extra outputs alone may not explain the gain.

Combiner options — change in the stack's mean ST-RAE vs Ridge alpha 1 · paired 95% CI · right of zero = worse
better, CI excludes zeroworse, CI excludes zerono clear change
Ridge alpha 100 (chosen)
−0.0028 [−0.0047, −0.0008]
Ridge alpha 10
−0.0005 [−0.0007, −0.0002]
Weights forced ≥ 0
+0.0001 [−0.0010, +0.0012]
Extra computed features given to the Ridge
+ co-folding confidence
−0.0011 [−0.0031, +0.0009]
+ docking scores
+0.0012 [−0.0018, +0.0041]
+ predicted properties
+0.038 [+0.031, +0.046]
−0.010+0.02+0.04

Alpha 10 also helped, but alpha 100 helped about six times more. The extra features came from docking, protein–ligand co-folding and a physicochemical property package. We also tested co-folding confidence with alpha 100: the gain was not clear (−0.0014, CI crosses zero), so we kept the simpler model.

Model optionChange in mean ST-RAEResult
LightGBM: weight rows by 1 / interval width−0.047 [−0.061, −0.034]Kept
SVR: same row weights+0.062 [+0.048, +0.077]Not used
TabPFN: descriptors only, no CheMeleon+0.022 [+0.014, +0.030]CheMeleon kept
TabPFN: CheMeleon PCA 256 instead of 100+0.0005 [−0.0031, +0.0041]No clear change; 100 kept
TabPFN: MoLFormer-XL [7] instead of CheMeleon+0.002 [−0.008, +0.011]No clear change; CheMeleon kept
ChemProp: add 4 time-dependent-inhibition outputs (12 total) *+0.000 [−0.005, +0.005]No clear change; 8 kept
Add a CYP2D6-only ChemProp *−0.001 [−0.002, +0.001]No clear change; not used

* Change in the stack's score, against the alpha-1 stack. The other rows change one model's own score in scaffold cross-validation.

A5. Adjusting the scale and centre of predictions

ST-RAE rewards predictions that land inside each measurement's interval, so shifting or stretching all of one enzyme's predictions can change the score without changing their order. Several entrants report this as a large lever. We looked at it two ways.

A6. Limitations

A7. Reproducibility

Code is not publicly released. This section gives the settings needed to rebuild the model.

SoftwarePython 3.12 · chemprop 2.3.1 · torch 2.14.0 · tabpfn 8.5.0 · lightgbm 4.7.0 · scikit-learn 1.9.1 · rdkit 2026.3.6 · mordredcommunity 2.0.7 · numpy 2.5.3 · pandas 3.0.5
Pretrained weightsCheMeleon foundation: Zenodo record 15460715, file chemeleon_mp.pt [2]. TabPFN v3 regressor: Hugging Face Prior-Labs/tabpfn_3 [3].
RandomnessFolds are deterministic (scaffold hash). TabPFN uses seed 0. The bootstrap seed is fixed. SVR has no random step. LightGBM and ChemProp seeds are not pinned.
Final fitEach model is refit on all labelled rows to predict the test set. Each enzyme's Ridge is fit on all out-of-fold predictions. The file passed the challenge's validation function for all 750 test IDs.