A curated, ML-ready dataset and benchmark for PROTAC degradation activity prediction
Proteolysis-targeting chimeras (PROTACs) are a promising drug modality that induces targeted protein degradation by hijacking the cell's native ubiquitin–proteasome system. However, rational PROTAC design remains challenging due to the complex interplay between molecular structure, target proteins (POIs), E3 ligases, and cellular context.
TACK addresses three critical gaps in existing PROTAC ML benchmarks:
Ribes*, Dunlop*, and Mercado. TACK: A statistical evaluation of degradation activity on a novel TArgeting Chimeras Knowledge dataset. KDD AI for Sciences Track, 2026.
| Statistic | TPDdb | PROTAC-DB | PROTACpedia | TACK |
|---|---|---|---|---|
| Total records | 22,183 | 9,380 | 1,203 | 6,561 |
| Unique PROTACs | 21,429 | 6,110 | 1,189 | 3,514 |
| Degradation endpoints | 6,518 | 2,170 | 580 | 6,561 |
| POI targets | 184 | 441 | 79 | 164 |
| E3 ligases | 8 | 21 | 8 | 9 |
| Cell lines | 142 | — | 139 | 155 |
| Hold-out set entries | — | — | — | 913 |
The dataset contains 4,184 DC₅₀ and 2,377 Dmax measurements. Approximately 55% of entries are classified as active (DC₅₀ ≤ 100 nM and Dmax ≥ 80%).
Most represented biology:
| Config | Description | Examples |
|---|---|---|
default | All endpoints (DC₅₀ + Dmax combined) | 6,561 |
DC50 | Potency measurements only | 4,184 |
Dmax | Maximal degradation efficacy only | 2,377 |
multitask | Paired DC₅₀ + Dmax for the same PROTAC/assay, also used for binary activity classification | 1,563 |
from datasets import load_dataset
# All endpoints
ds = load_dataset("ailab-bio/TACK")
# DC50 only
ds_dc50 = load_dataset("ailab-bio/TACK", "DC50")
# Dmax only
ds_dmax = load_dataset("ailab-bio/TACK", "Dmax")
# Paired multitask (DC50 + Dmax for same compound)
ds_multi = load_dataset("ailab-bio/TACK", "multitask")
The SMILES_Held_Out column flags the structurally dissimilar held-out set (~10% of data). To reproduce the train/validation split used in the paper:
ds = load_dataset("ailab-bio/TACK", "DC50")["train"]
train_val = ds.filter(lambda x: not x["SMILES_Held_Out"])
held_out = ds.filter(lambda x: x["SMILES_Held_Out"])
| Column | Type | Description |
|---|---|---|
SMILES | string | Canonical RDKit SMILES of the PROTAC |
POI_Name | string | Gene name of the protein of interest |
POI_Sequence | string | UniProt amino acid sequence of the POI |
POI_UniProt | string | UniProt accession for the POI |
Ligase_Name | string | Name of the E3 ligase |
Ligase_Sequence | string | UniProt amino acid sequence of the E3 ligase |
Ligase_UniProt | string | UniProt accession for the E3 ligase |
Cell_Line | string | Cell line name (Cellosaurus-standardized) |
Cell_Line_ID | string | Cellosaurus identifier |
Cell_Line_Species | string | Species of origin for the cell line |
Cell_Line_Description | string | Textual description from Cellosaurus |
Value | float64 | Measured endpoint value |
Value_Unit | string | Unit of the value (nM for DC₅₀; % for Dmax) |
Value_Type | string | Endpoint type (DC50 or Dmax) |
Value_Operator | string | Comparison operator if censored (<, >, etc.) |
Value_Error | float64 | Reported measurement error (if available) |
Value_Range_Min | float64 | Lower bound for range-reported values |
Value_Range_Max | float64 | Upper bound for range-reported values |
Value_Concentration | float64 | Treatment concentration for Dmax assays |
Value_Concentration_Unit | string | Unit of treatment concentration |
Value_Category | string | Categorical activity label (where applicable) |
Assay_Time | float64 | Treatment duration in hours |
Assay | string | Standardized assay type (e.g., Western Blot, HiBit) |
Modality | string | Compound modality (PROTAC, molecular glue, etc.) |
Reference | string | Source literature or patent reference |
Description | string | Original assay description |
Database | string | Source database (TPDdb, PROTAC-DB, PROTACpedia) |
TPD_ID | string | Original identifier in the source database |
POI_Cluster | int64 | POI sequence-based cluster ID |
SMILES_Scaffold_Cluster | int64 | Murcko scaffold cluster ID (used for CV splitting) |
SMILES_Butina_Cluster | int64 | Butina/Tanimoto cluster ID |
SMILES_Held_Out | bool | True if this entry belongs to the structural hold-out set |
The multitask config replaces Value, Value_Unit, etc. with Value_DC50, Value_Dmax and analogous suffixed columns, enabling simultaneous supervision on both endpoints.
Raw data was aggregated from three repositories and cleaned through a multi-stage pipeline:
Please refer to this link for the codebase used to generate the data.
Models were evaluated using scaffold-based 5×5 repeated cross-validation with statistical testing (Friedman + Wilcoxon + Benjamini–Hochberg correction for feature selection; Tukey HSD for architecture comparison).
| Task | Model | MAE | RMSE | R² | Spearman ρ |
|---|---|---|---|---|---|
| pDC₅₀ | MLP | 0.58 | 0.80 | 0.66 | 0.76 |
| Dmax | XGBoost | 18.86 | 25.68 | 0.36 | 0.66 |
| Model | ROC-AUC | PR-AUC | MCC | Recall @ Prec≥0.8 |
|---|---|---|---|---|
| XGBoost | 0.851 | 0.870 | 0.523 | 0.777 |
| MLP | 0.799 | 0.824 | 0.448 | 0.600 |
| PROTAC-STAN | 0.746 | 0.773 | 0.405 | 0.443 |
All pairwise differences are statistically significant (Tukey HSD, p < 0.001).
Key findings:
Ensemble standard deviation correlates positively with absolute prediction error, enabling confidence-aware compound prioritization:
| Task | Method | RMSE | Spearman ρ (σ vs. |error|) |
|---|---|---|---|
| pDC₅₀ | Caruana (33 models) | 0.672 | 0.207* |
| pDC₅₀ | Uniform avg (500 models) | 0.683 | 0.355** |
| Dmax | Caruana (22 models) | 21.32 | 0.543** |
| Dmax | Uniform avg (500 models) | 22.92 | 0.694** |
** p < 0.001; * p < 0.01
Pre-trained ensemble models (XGBoost and MLP, all feature configurations, 25 CV folds each) are available on Zenodo:
If you use TACK in your research, please cite:
@misc{ribes2026tackstatisticalevaluationdegradation,
title={TACK: A statistical evaluation of degradation activity on a novel TArgeting Chimeras Knowledge dataset},
author={Stefano Ribes and Nils Dunlop and Rocío Mercado},
year={2026},
eprint={2605.19579},
archivePrefix={arXiv},
primaryClass={q-bio.QM},
url={https://arxiv.org/abs/2605.19579},
}
The TACK dataset is released under the MIT License. The underlying experimental data is sourced from PROTAC-DB, PROTACpedia, and TPDdb — please refer to the respective database licenses for conditions on downstream use of the original data.
SR and RM acknowledge funding from the Chalmers Gender Initiative for Excellence (Genie). RM and ND acknowledge funding from the Wallenberg AI, Autonomous Systems and Software Program (WASP), supported by the Knut and Alice Wallenberg Foundation. The authors thank Yossra Gharbi, Alexander Persson, and Felix Erngård for helpful discussions. Computations were enabled by Chalmers e-Commons and NAISS (grant 2022-06725).
A curated, ML-ready dataset and benchmark for PROTAC degradation activity prediction
Proteolysis-targeting chimeras (PROTACs) are a promising drug modality that induces targeted protein degradation by hijacking the cell's native ubiquitin–proteasome system. However, rational PROTAC design remains challenging due to the complex interplay between molecular structure, target proteins (POIs), E3 ligases, and cellular context.
TACK addresses three critical gaps in existing PROTAC ML benchmarks:
Ribes*, Dunlop*, and Mercado. TACK: A statistical evaluation of degradation activity on a novel TArgeting Chimeras Knowledge dataset. KDD AI for Sciences Track, 2026.
| Statistic | TPDdb | PROTAC-DB | PROTACpedia | TACK |
|---|---|---|---|---|
| Total records | 22,183 | 9,380 | 1,203 | 6,561 |
| Unique PROTACs | 21,429 | 6,110 | 1,189 | 3,514 |
| Degradation endpoints | 6,518 | 2,170 | 580 | 6,561 |
| POI targets | 184 | 441 | 79 | 164 |
| E3 ligases | 8 | 21 | 8 | 9 |
| Cell lines | 142 | — | 139 | 155 |
| Hold-out set entries | — | — | — | 913 |
The dataset contains 4,184 DC₅₀ and 2,377 Dmax measurements. Approximately 55% of entries are classified as active (DC₅₀ ≤ 100 nM and Dmax ≥ 80%).
Most represented biology:
| Config | Description | Examples |
|---|---|---|
default | All endpoints (DC₅₀ + Dmax combined) | 6,561 |
DC50 | Potency measurements only | 4,184 |
Dmax | Maximal degradation efficacy only | 2,377 |
multitask | Paired DC₅₀ + Dmax for the same PROTAC/assay, also used for binary activity classification | 1,563 |
from datasets import load_dataset
# All endpoints
ds = load_dataset("ailab-bio/TACK")
# DC50 only
ds_dc50 = load_dataset("ailab-bio/TACK", "DC50")
# Dmax only
ds_dmax = load_dataset("ailab-bio/TACK", "Dmax")
# Paired multitask (DC50 + Dmax for same compound)
ds_multi = load_dataset("ailab-bio/TACK", "multitask")
The SMILES_Held_Out column flags the structurally dissimilar held-out set (~10% of data). To reproduce the train/validation split used in the paper:
ds = load_dataset("ailab-bio/TACK", "DC50")["train"]
train_val = ds.filter(lambda x: not x["SMILES_Held_Out"])
held_out = ds.filter(lambda x: x["SMILES_Held_Out"])
| Column | Type | Description |
|---|---|---|
SMILES | string | Canonical RDKit SMILES of the PROTAC |
POI_Name | string | Gene name of the protein of interest |
POI_Sequence | string | UniProt amino acid sequence of the POI |
POI_UniProt | string | UniProt accession for the POI |
Ligase_Name | string | Name of the E3 ligase |
Ligase_Sequence | string | UniProt amino acid sequence of the E3 ligase |
Ligase_UniProt | string | UniProt accession for the E3 ligase |
Cell_Line | string | Cell line name (Cellosaurus-standardized) |
Cell_Line_ID | string | Cellosaurus identifier |
Cell_Line_Species | string | Species of origin for the cell line |
Cell_Line_Description | string | Textual description from Cellosaurus |
Value | float64 | Measured endpoint value |
Value_Unit | string | Unit of the value (nM for DC₅₀; % for Dmax) |
Value_Type | string | Endpoint type (DC50 or Dmax) |
Value_Operator | string | Comparison operator if censored (<, >, etc.) |
Value_Error | float64 | Reported measurement error (if available) |
Value_Range_Min | float64 | Lower bound for range-reported values |
Value_Range_Max | float64 | Upper bound for range-reported values |
Value_Concentration | float64 | Treatment concentration for Dmax assays |
Value_Concentration_Unit | string | Unit of treatment concentration |
Value_Category | string | Categorical activity label (where applicable) |
Assay_Time | float64 | Treatment duration in hours |
Assay | string | Standardized assay type (e.g., Western Blot, HiBit) |
Modality | string | Compound modality (PROTAC, molecular glue, etc.) |
Reference | string | Source literature or patent reference |
Description | string | Original assay description |
Database | string | Source database (TPDdb, PROTAC-DB, PROTACpedia) |
TPD_ID | string | Original identifier in the source database |
POI_Cluster | int64 | POI sequence-based cluster ID |
SMILES_Scaffold_Cluster | int64 | Murcko scaffold cluster ID (used for CV splitting) |
SMILES_Butina_Cluster | int64 | Butina/Tanimoto cluster ID |
SMILES_Held_Out | bool | True if this entry belongs to the structural hold-out set |
The multitask config replaces Value, Value_Unit, etc. with Value_DC50, Value_Dmax and analogous suffixed columns, enabling simultaneous supervision on both endpoints.
Raw data was aggregated from three repositories and cleaned through a multi-stage pipeline:
Please refer to this link for the codebase used to generate the data.
Models were evaluated using scaffold-based 5×5 repeated cross-validation with statistical testing (Friedman + Wilcoxon + Benjamini–Hochberg correction for feature selection; Tukey HSD for architecture comparison).
| Task | Model | MAE | RMSE | R² | Spearman ρ |
|---|---|---|---|---|---|
| pDC₅₀ | MLP | 0.58 | 0.80 | 0.66 | 0.76 |
| Dmax | XGBoost | 18.86 | 25.68 | 0.36 | 0.66 |
| Model | ROC-AUC | PR-AUC | MCC | Recall @ Prec≥0.8 |
|---|---|---|---|---|
| XGBoost | 0.851 | 0.870 | 0.523 | 0.777 |
| MLP | 0.799 | 0.824 | 0.448 | 0.600 |
| PROTAC-STAN | 0.746 | 0.773 | 0.405 | 0.443 |
All pairwise differences are statistically significant (Tukey HSD, p < 0.001).
Key findings:
Ensemble standard deviation correlates positively with absolute prediction error, enabling confidence-aware compound prioritization:
| Task | Method | RMSE | Spearman ρ (σ vs. |error|) |
|---|---|---|---|
| pDC₅₀ | Caruana (33 models) | 0.672 | 0.207* |
| pDC₅₀ | Uniform avg (500 models) | 0.683 | 0.355** |
| Dmax | Caruana (22 models) | 21.32 | 0.543** |
| Dmax | Uniform avg (500 models) | 22.92 | 0.694** |
** p < 0.001; * p < 0.01
Pre-trained ensemble models (XGBoost and MLP, all feature configurations, 25 CV folds each) are available on Zenodo:
If you use TACK in your research, please cite:
@misc{ribes2026tackstatisticalevaluationdegradation,
title={TACK: A statistical evaluation of degradation activity on a novel TArgeting Chimeras Knowledge dataset},
author={Stefano Ribes and Nils Dunlop and Rocío Mercado},
year={2026},
eprint={2605.19579},
archivePrefix={arXiv},
primaryClass={q-bio.QM},
url={https://arxiv.org/abs/2605.19579},
}
The TACK dataset is released under the MIT License. The underlying experimental data is sourced from PROTAC-DB, PROTACpedia, and TPDdb — please refer to the respective database licenses for conditions on downstream use of the original data.
SR and RM acknowledge funding from the Chalmers Gender Initiative for Excellence (Genie). RM and ND acknowledge funding from the Wallenberg AI, Autonomous Systems and Software Program (WASP), supported by the Knut and Alice Wallenberg Foundation. The authors thank Yossra Gharbi, Alexander Persson, and Felix Erngård for helpful discussions. Computations were enabled by Chalmers e-Commons and NAISS (grant 2022-06725).