Skip to content

Instantly share code, notes, and snippets.

@dehaenw
Created July 1, 2026 13:07
Show Gist options
  • Select an option

  • Save dehaenw/145dd8880087694fdd2261d4a2889bd3 to your computer and use it in GitHub Desktop.

Select an option

Save dehaenw/145dd8880087694fdd2261d4a2889bd3 to your computer and use it in GitHub Desktop.
CASPER report

PXR pEC50 Prediction — CASPER + HTC (submission methods)

Summary

A single 3D molecular descriptor (CASPER) feeding a single tabular foundation model (TabPFN-2.5), trained on the primary assay plus high-throughput-chemistry novel actives. No ensemble, no docking, no fine-tuning.

Holdout performance (253-compound phase-1 set):

  • MAE 0.4749 ± 0.0023 (20-seed band), R² ≈ 0.54

Locked configuration

Descriptor — CASPER (Conformer-Averaged Surface Property Encoded Representation):

  • conformers: ETKDG, n_confs=10, no force-field minimisation
  • surface: van-der-Waals dot surface, density=16 points/atom (validated knee of the accuracy/cost curve), probe=0.0
  • properties (surface colourings): gasteiger, abs_charge, logp, mr, tpsa
  • encoding: property histogram (n_bins=12) + density-invariant spatial autocorrelation (autocorr_bins=8, autocorr_max_dist=16 Å)
  • conformer pooling: mean + max
  • output dimensionality: 200

Training data:

  • primary assay (4139 compounds, raw pEC50 labels — NO label cleaning)
    • 441 HTC novel actives (yield-corrected pEC50 from crude + semi-pure libraries)
  • = 4580 training compounds

Model: TabPFN-2.5 default checkpoint (pypi tabpfn 6.x), mean readout, predictions averaged over 5 seeds for stability. Predictions clipped to the training range ± 20 %.

What helped, what didn't (judged on unblinded leaderboard 253 holdout)

Intervention Effect on holdout MAE Decision
CASPER descriptor (vs RDKit-2D) best standalone family core
HTC novel-active augmentation (441) +0.0175, monotone over count adopted
Isotonic calibration (low-pEC50 shrinkage) ~+0.007 (near noise) adopted
Counter-assay label cleaning −0.015 (HURT) rejected
Counter-assay / single-conc as features impossible (absent at test time) rejected
Reactive-electrophile / PAINS / Brenk / NIH exclusion ≤ 0 (no transfer) rejected
median / mode readout (vs mean) worse (low-skew target) rejected
TabPFN v3 (pypi 8.x) −0.006 (worse) rejected
Real-TabPFN / low-skew checkpoints ≤ baseline rejected
Feature concatenation (casper+rdkit/mordred) worse (dilution) rejected
Ridge stacking ensemble worse (weak families pollute) rejected
Frozen CheMeleon embeddings worse than Mordred (prior expt) rejected

The recurring theme: CV/OOF and the external holdout diverge. Interventions that improved cross-validation (label cleaning, structural-alert exclusion) consistently failed or hurt on the holdout, because the holdout shares the same assay characteristics the curation tried to remove.

Calibration

The active-enriched training set induces shrinkage: low-pEC50 compounds are over-predicted (signed bias +0.73 in the bottom bin). An isotonic recalibration (monotone, fit on cross-fit OOF predictions, never on the holdout) corrects this and gave a small Pareto improvement (overall MAE 0.4754→0.4688, low-region MAE 0.736→0.719) on a 3-seed run.

Disclosure: human + LLM authorship

This project was architected and coded by Claude Opus 4.8 (Anthropic), with steering, domain feedback, and experiment execution by the human in the loop. The human ran all GPU/TabPFN computations, supplied the datasets and challenge context, set research direction, and provided corrective feedback; the model wrote the code, designed the experiments, and interpreted results. Findings were validated empirically on a held-out test set rather than taken on the model's say-so.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment