Maher el Ouahabi Senior Data Scientist
April 2026
We present an epigenetic age clock trained exclusively on publicly available DNA methylation data from the Gene Expression Omnibus (GEO). Using 11,328 samples across 17 cohorts and an Optuna-tuned ElasticNet model, we achieve a mean absolute error (MAE) of 3.37 years on an independent EPIC v2 test cohort (GSE246337, n=500). This closes 53% of the gap to DeepStrataAge, a 40.7M-parameter deep neural network trained on 29,167 proprietary samples (MAE 2.45). We demonstrate that the performance difference is primarily attributable to training data volume rather than model architecture, as DeepStrataAge's own linear baseline achieves MAE 2.02 — only 0.13 years worse than the full DNN. Our work also identifies three critical data quality issues in public methylation datasets that caused initial model failures (MAE > 24), reinforcing that data curation is the dominant factor in methylation clock accuracy.
DNA methylation patterns change predictably with age, enabling the construction of "epigenetic clocks" that estimate chronological or biological age from CpG beta values (Horvath, 2013; Hannum et al., 2013). Recent work has applied deep learning to this task: DeepStrataAge (De Lima Camillo et al., 2026) reports a 40.7M-parameter DNN ensemble achieving MAE 1.89 years on cross-validated data from 29,167 samples.
However, 96% of DeepStrataAge's training data comes from TruDiagnostic, a commercial methylation testing company, and is not publicly available. This raises the question: how much of the performance advantage comes from the deep learning architecture versus the proprietary data volume?
We address this by training standard machine learning models (ElasticNet, HistGradientBoosting) on public GEO datasets and evaluating on the same EPIC v2 test cohort used in the DeepStrataAge challenge (GSE246337). Our goal is not to beat DeepStrataAge — which would require comparable data — but to quantify how much of the gap is attributable to architecture versus data.
We assembled 17 training cohorts from GEO, totaling 11,328 samples with continuous chronological age annotations. Cohorts span the Illumina HumanMethylation450 (14 cohorts, 8,569 samples) and MethylationEPIC v1 (3 cohorts, 2,759 samples) platforms. Ages range from 10 to 101 years.
Each candidate dataset underwent a normalization compatibility check: per-CpG mean beta values were compared against a reference cohort (GSE40279). Datasets with systematic shifts exceeding |0.05| on shared CpGs were rejected. Five datasets were excluded:
- GSE147740 (n=1,032): Quantile Normalization produced a 0.20 systematic shift versus other EPIC datasets
- GSE87648 (n=174): Normalization shift of +0.05, confirmed by LOCO CV fold failure (MAE 13.97)
- GSE152026 (n=519): Shift of -0.045
- GSE80417 (n=304): No normalization issue but caused test regression when added
- GSE220622 (n=391): Same — test regression despite clean normalization
The held-out test set is GSE246337 (500 samples, EPIC v2, age 18-89), the Bank of America Epigenetic Clock Challenge dataset used in the DeepStrataAge publication.
We use the 12,234 CpG sites from the DeepStrataAge feature set, augmented with:
- Sex (binary)
- Platform indicator (is_450k, binary): 1 if sample originates from 450K array
- 5 batch features per sample: mean beta, standard deviation, median, fraction hypomethylated (<0.1), and fraction hypermethylated (>0.9), computed on the ~5,000 CpGs shared across all platforms
For 450K samples missing EPIC-specific CpGs, we apply population-mean imputation using statistics computed across all EPIC samples.
ElasticNet (scikit-learn): Linear regression with combined L1/L2 penalty. Hyperparameters tuned via Optuna: alpha=0.0012, l1_ratio=0.453, max_iter=5000, tol=1e-3, selection='random'.
HistGradientBoostingRegressor (scikit-learn): Gradient-boosted histogram trees with native missing value support. Hyperparameters tuned via Optuna with 50% subsampling: learning_rate=0.047, max_leaf_nodes=102, min_samples_leaf=71, l2_regularization=0.994.
DeepStrataAge: Pre-trained 3-model DNN ensemble (40.7M parameters total), evaluated using published weights from Zenodo. Input format: sex (first column) followed by 12,234 CpG beta values.
Cross-validation: Leave-One-Cohort-Out (LOCO) on the 17 training cohorts. Each fold holds out one entire cohort, training on the remaining 16. This prevents information leakage from shared technical variation within cohorts.
Hyperparameter tuning: Optuna with Tree-structured Parzen Estimator (TPE), fold-level pruning via MedianPruner. The test cohort (GSE246337) is excluded via hard assertion in the tuning script — it is loaded only during the final evaluation.
Metrics: MAE, Median AE, R², Pearson correlation, bootstrap 95% confidence intervals (1,000 resamples), paired Wilcoxon signed-rank test.
The optimal ElasticNet hyperparameters shifted significantly between the initial tuning (5,329 samples, 9 cohorts) and the final re-tuning (11,328 samples, 17 cohorts):
| Parameter | Initial (5K samples) | Final (11K samples) |
|---|---|---|
| alpha | 0.0008 | 0.0012 |
| l1_ratio | 0.064 (near-Ridge) | 0.453 (true ElasticNet) |
The shift toward higher L1 ratio with more heterogeneous cohorts is interpretable: increased sparsity helps ignore CpG sites whose methylation-age relationship is unstable across batches and platforms. With fewer cohorts, keeping all features (Ridge) was preferable because there was insufficient cross-cohort variation to distinguish stable from unstable CpGs.
HistGBR hyperparameter tuning improved LOCO CV MAE (3.66 → 3.50) but degraded test MAE (3.64 → 3.86), a classic manifestation of selection bias in model selection (Cawley & Talbot, 2010). The tuned tree parameters captured cohort-specific patterns that did not transfer to the EPIC v2 test set.
| Split | Model | MAE | 95% CI | MedAE | R² | Pearson r |
|---|---|---|---|---|---|---|
| CV | ElasticNet (tuned) | 2.34 | [2.30, 2.39] | 1.83 | 0.963 | 0.981 |
| CV | HistGBR (tuned) | 3.56 | [3.50, 3.61] | 2.88 | 0.920 | 0.960 |
| Test | ElasticNet (tuned) | 3.37 | [3.03, 3.77] | 2.23 | 0.937 | 0.977 |
| Test | HistGBR (tuned) | 3.79 | [3.45, 4.21] | 2.77 | 0.926 | 0.965 |
| Test | DeepStrataAge | 2.45 | [2.17, 2.80] | 1.79 | 0.959 | 0.980 |
Paired Wilcoxon tests on the test set: ElasticNet vs HistGBR (p=0.014, significant); ElasticNet vs DeepStrataAge (p<0.001); HistGBR vs DeepStrataAge (p<0.001).
The test MAE improved monotonically with training data size up to 11,328 samples:
| Training N | Cohorts | ElasticNet Test MAE |
|---|---|---|
| 3,140 | 7 | 4.38 |
| 5,329 | 9 | 3.57 |
| 8,722 | 11 | 3.52 |
| 11,328 | 17 | 3.37 |
However, further additions (12,716 samples, 21 cohorts) caused test regression, indicating that the marginal benefit of additional heterogeneous cohorts was exceeded by the added batch noise.
Three data bugs caused an initial test MAE of 24 years (model predicted a constant age for all samples):
-
Alternating beta/p-value columns in GSE196696: The supplementary file interleaved detection p-values with beta values. Including p-values as features collapsed the mean beta to 0.13, corrupting all cross-platform comparisons.
-
G-CSF mobilized donors in GSE196696: Transplant donors who received granulocyte colony-stimulating factor had dramatically altered blood cell composition. Their methylation profiles resembled individuals 22 years older due to granulocyte dominance.
-
Sample ID mismatch in GSE246337: The beta value matrix used Sentrix IDs while the metadata used GSM accessions, in different orders. This shuffled the age labels randomly, producing zero correlation between features and target.
Fixing these three issues reduced test MAE from 24 to 4.37 — a larger improvement than all subsequent modeling work combined.
DeepStrataAge's test MAE advantage over our ElasticNet is 0.91 years (2.45 vs 3.37). However, DeepStrataAge's own ElasticNet baseline (Marioni_cAge, trained on their full 29K dataset) achieves MAE 2.02 — only 0.13 years worse than their DNN. This strongly suggests that the performance gap we observe is primarily a data effect, not an architecture effect.
If we extrapolate our scaling curve, an ElasticNet trained on ~29K samples from a single lab would likely achieve MAE in the 2.0-2.5 range, comparable to or better than DeepStrataAge.
ElasticNet consistently outperformed HistGradientBoosting on the held-out test set, despite HistGBR's superior LOCO CV performance in some configurations. This is consistent with the observation that in high-dimensional settings with heterogeneous training data, linear models with appropriate regularization generalize better because they cannot overfit to complex cohort-specific patterns.
The shift in optimal l1_ratio from 0.064 (near-Ridge) to 0.453 (true ElasticNet) as training cohorts increased from 9 to 17 further supports this interpretation: with more sources of technical variation, sparsity becomes increasingly valuable for selecting CpGs with robust cross-cohort methylation-age relationships.
Adding public datasets improved test MAE from 4.38 to 3.37 (11 accepted cohorts). However, further additions from disease-study control subsets caused test regression, even when normalization checks passed. This suggests that at ~11K samples from ~17 heterogeneous cohorts, the signal-to-noise ratio of additional public data is insufficient to overcome the batch heterogeneity it introduces.
This finding has practical implications: acquiring data from fewer labs with consistent preprocessing may be more valuable than maximizing sample count from many sources.
The most impactful phase of this project was not modeling or tuning, but data curation. Three bugs caused an initial MAE of 24 years. Fixing them — before any modeling changes — reduced MAE to 4.37. All subsequent work (tuning, additional data) contributed a further 1.0 year improvement.
This reinforces a well-known but often overlooked principle: for applied machine learning, data quality dominates model choice.
An Optuna-tuned ElasticNet trained on 11,328 publicly available DNA methylation samples achieves MAE 3.37 years on an independent EPIC v2 test set, closing 53% of the gap to DeepStrataAge (MAE 2.45). The remaining gap is attributable to data volume (29K vs 11K) and homogeneity (single lab vs 17 labs), not model architecture. For cross-cohort epigenetic age prediction, properly regularized linear models outperform gradient-boosted trees and likely approach deep learning performance given equivalent training data.
- Cawley, G.C. & Talbot, N.L. (2010). On over-fitting in model selection and subsequent selection bias in performance evaluation. JMLR, 11, 2079-2107.
- De Lima Camillo, L.P. et al. (2026). DeepStrataAge: A Deep Learning Model for Stratified Epigenetic Age Prediction. npj Aging. DOI: 10.1038/s41514-026-00358-w.
- Hannum, G. et al. (2013). Genome-wide methylation profiles reveal quantitative views of human aging rates. Molecular Cell, 49(2), 359-367.
- Horvath, S. (2013). DNA methylation age of human tissues and cell types. Genome Biology, 14(10), R115.