Dinesh4311/drugage-lifespan-benchmark
DrugAge Lifespan-Extension Benchmark Predict the maximum reported percentage change in lifespan for a small molecule, from structure alone. 754 compounds curated from DrugAge (Human Ageing Genomic Resources), which aggregates measured lifespan experiments across C. elegans, Drosophila, mouse and yeast. Geroscience is missing from ML drug-discovery benchmarking. Public benchmarks are potency, ADME and tox; none of them asks whether a molecule extends lifespan. This fills that gap… See the full description on the dataset page: https://huggingface.co/datasets/Dinesh4311/drugage-lifespan-benchmark.
DrugAge Lifespan-Extension Benchmark
Predict the maximum reported percentage change in lifespan for a small molecule, from structure alone. 754 compounds curated from DrugAge (Human Ageing Genomic Resources), which aggregates measured lifespan experiments across C. elegans, Drosophila, mouse and yeast.
Geroscience is missing from ML drug-discovery benchmarking. Public benchmarks are potency, ADME and tox; none of them asks whether a molecule extends lifespan. This fills that gap — with the failure mode visible rather than hidden.
The headline result is a negative one
A similarity-weighted 5-NN over Morgan(r=2, 2048) scores roughly the same on all three splits, and every value sits within about one standard error of the others and of zero.
Report a number here only with its error bar. A point estimate on a single split is not interpretable.
We know how easy it is to get this wrong, because we did. An earlier build of this curation produced a clean random > scaffold > frontier gradient that looked like a textbook generalization-collapse result. It was an artifact of two curation choices. Three successive curation passes produced three different orderings of the same three splits. An effect whose sign flips with curation is noise.
Usage
from datasets import load_dataset
ds = load_dataset("Dinesh4311/drugage-lifespan-benchmark", split="train")
# The three splits ship as columns, not as separate HF splits, so one row is one
# compound and you choose which split to score on.
train = ds.filter(lambda r: r["split_scaffold"] == "train")
test = ds.filter(lambda r: r["split_scaffold"] == "test")Columns
split_frontier exists because scaffold splits are known to overestimate generalization (arXiv 2406.00873), and because de-novo design operates precisely on matter with no close neighbour in any training set.
Curation decisions that change results
Metal salts are NOT desalted. Running a standard FragmentParent desalting step over this data merges lithium chloride (a GSK-3-mediated lifespan extender) with sodium chloride, methylmercury acetate with acetic acid, and vanadyl sulfate with sulfuric acid — because for metal compounds the metal is the pharmacology. Organic drug salts are desalted against an explicit counterion allow-list; metal-containing entries are left intact.
`chem_class` separates four populations. Metal and elemental compounds are isolated in fingerprint space for reasons that have nothing to do with medicinal chemistry, and including them changes which split appears hardest. State which subset you scored.
21 duplicate structures filed under different names were merged on InChIKey.
The label
max_lifespan_pct is the maximum reported percentage lifespan change, aggregated across species and study designs. It is noisy. That is a property of the field, not of this curation, and it bounds what any model can achieve here.
Where the data came from
Preprocessing, in order:
- Name → structure. DrugAge ships compound names, not structures. Names were resolved to SMILES via the PubChem PUG REST API; 775 of 1,046 resolved. The remaining 271 are mostly extracts, mixtures and non-specific entries with no single structure.
- Fields kept.
name,smiles,max_lifespan_pct,is_itp. This isdata/drugage_source.json. - Curation — classification, counterion stripping, InChIKey dedup, splits, baseline — is
polaris_benchmark.py, and is fully reproducible from step 2.
Honest scope note. This repo reproduces steps 2→3. It does not re-run step 1: the PubChem name resolution was done upstream and its results ship as drugage_source.json. If you re-resolve the names today you may get a slightly different set, because PubChem records change. Start from the shipped file to reproduce the published numbers exactly.Reproduce
pip install rdkit==2026.3.4 numpy==2.4.6
python polaris_benchmark.py # rebuilds data/drugage_lifespan.csv + manifest.jsonPublished numbers were produced on Python 3.12.10, RDKit 2026.03.4, NumPy 2.4.6. The pins matter more than they look: the splits depend on Bemis-Murcko scaffold perception and Morgan fingerprints, both from RDKit, and a change to either can move compounds across the train/test boundary. Given SE ≈ 0.08 a small drift will not change the conclusion, but it can change the third decimal.
Citation
Cite both this dataset and the underlying DrugAge database.
@misc{geroqubit2026drugage,
title = {DrugAge lifespan-extension benchmark},
author = {K, Dinesh},
year = {2026},
url = {https://huggingface.co/datasets/Dinesh4311/drugage-lifespan-benchmark}
}
@article{barardo2017drugage,
title = {The DrugAge database of aging-related drugs},
author = {Barardo, Diogo and Thornton, Daniel and Thoppil, Harikrishnan and
Walsh, Michael and Sharifi, Samim and Ferreira, Susana and Anzic, Andreja and
Fernandes, Maria and Monteiro, Patrick and Grum, Tjasa and Cordeiro, Rui and
De-Souza, Evandro Araujo and Budovsky, Arie and Araujo, Natali and Gruber, Jan and
Petrascheck, Michael and Fraifeld, Vadim and Zhavoronkov, Alexander and
Moskalev, Alexey and de Magalhaes, Joao Pedro},
journal = {Aging Cell},
volume = {16}, number = {3}, pages = {594--597}, year = {2017},
doi = {10.1111/acel.12585}
}License
Code: MIT. Data: derived from DrugAge (Human Ageing Genomic Resources), CC BY 4.0 — redistributed with attribution.
Mirror: github.com/Dinesh431786/drugage-lifespan-benchmark · Curated by GeroQubit.
