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.
- 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.
| Model | Alone (ST-RAE) | Error overlap with the other three (lower = more different) | Cost to remove it |
|---|---|---|---|
| ChemProp | 0.808 | 0.81 most different | +0.041 |
| TabPFN | best0.743 | 0.86 | +0.002 |
| LightGBM | 0.752 | 0.86 | +0.001 |
| SVR | weakest0.822 | 0.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 helped | Effect on mean ST-RAE (95% CI) |
|---|---|
| ChemProp in the stack | Removing it worsens the stack by 0.041 (0.031–0.050) |
| Weighting training rows by measurement confidence | Improves LightGBM by 0.047 (0.034–0.061) |
| A pretrained fingerprint for TabPFN | Improves 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 combiner | Ridge 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.
- Structure-based features for the combiner (docking scores, co-folding confidence): no clear change. Predicted physicochemical properties made it worse.
- Other fingerprints for TabPFN (MoLFormer-XL [7], a wider PCA): no clear change.
- More ChemProp (time-dependent-inhibition outputs, a CYP2D6-only model): no clear change.
- Confidence weighting for SVR: worse.
- Re-scaling predictions per enzyme: worse in cross-validation on an earlier model (appendix A5).
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.
Per enzyme
| Model | CYP3A4 | CYP2C9 | CYP2D6 | CYP1A2 | Mean |
|---|---|---|---|---|---|
| LightGBM | 0.543 | 0.684 | 0.936 | 0.846 | 0.752 |
| SVR | 0.650 | 0.847 | 0.939 | 0.854 | 0.822 |
| TabPFN | 0.559 | 0.664 | 0.921 | 0.827 | 0.743 |
| ChemProp | 0.482 | 0.643 | 1.157 | 0.952 | 0.808 |
| Stack (submitted) | 0.460 | 0.589 | 0.899 | 0.791 | 0.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].
| Data | Size | Use |
|---|---|---|
| Direct-inhibition pIC50, with credible intervals | 4,905 molecules | Main 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 change | 17,504 rows | Extra training targets for ChemProp only. We do not submit them. |
| Blinded test set | 750 molecules | Structures only. We predict these. We never saw their labels. |
| CheMeleon pretrained weights | MIT licence | Start point for ChemProp, and a frozen molecule fingerprint for TabPFN [2]. |
| TabPFN v3 regressor weights | TabPFN-3 licence v1.0 | Pretrained 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
| Model | Input | Key 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. |
| SVR | ECFP4 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 descriptors | One model per enzyme. 8 estimators. PCA and missing-value fill are fit inside each training fold. |
| ChemProp [5] | Molecular graph | One 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]. |
| Ridge | The four models' out-of-fold predictions | One per enzyme. Alpha 100. Inputs standardised. |
A3. How we validated
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 weight | 3A4 | 2C9 | 2D6 | 1A2 |
|---|---|---|---|---|
| LightGBM | 0.12 | 0.12 | 0.07 | 0.09 |
| SVR | 0.10 | −0.01 | 0.08 | 0.02 |
| TabPFN | 0.25 | 0.13 | 0.15 | 0.14 |
| ChemProp | 0.46 | 0.32 | 0.14 | 0.35 |
Coefficients of the final Ridge for each enzyme. Inputs are standardised before the Ridge. Bold = largest weight.
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.
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 option | Change in mean ST-RAE | Result |
|---|---|---|
| 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.
- Fitted on our own cross-validation. A scale and shift per enzyme, fitted on training folds and scored on held-out folds, made every enzyme slightly worse (+0.001 to +0.005 ST-RAE). This was measured on an earlier version of our models. Their predictions already matched the training distribution on average, so there was little to correct.
- Fitted to the blind set. The gains other entrants report come from placing predictions on the blind set's own mean and spread. The organisers do not publish those values; entrants estimate them from leaderboard scores. We used no leaderboard feedback, so we did not do this.
A6. Limitations
- No independent hold-out. We chose every option on the same five folds. The submitted model's score may therefore be optimistic.
- Not fully nested. The Ridge is cross-fitted. But the model predictions it learns from were made by models that trained on the held-out fold.
- CYP2D6. All models are weakest here. Only 8.6% of CYP2D6 training labels are below pIC50 4.0 (CYP3A4: 40.4%), and our lowest CYP2D6 test prediction is 3.74. In cross-validation, those low-label molecules give 15.5% of the CYP2D6 error. We applied no shift (A5).
- Single fits. ChemProp is one unseeded fit, with a fixed 50-epoch schedule and no early stopping. We did not measure the spread between repeated fits.
- Small gains. Several choices change the score by less than 0.003. We have no test-set estimate of these effects.
A7. Reproducibility
Code is not publicly released. This section gives the settings needed to rebuild the model.