TDC(Therapeutics Data Commons) 由哈佛 Marinka Zitnik 组发起,把药物研发全流程的机器学习任务整理成统一接口:一行代码拿到数据、划分和评测指标。它解决的是「每篇论文各用各的数据、结果没法比」这个长期痛点。
安装与第一次调用
pip install PyTDC
from tdc.single_pred import ADME
data = ADME(name="Caco2_Wang")
split = data.get_split(method="scaffold", seed=42)
print(split["train"].shape, split["valid"].shape, split["test"].shape)
print(split["train"].head()) # 列:Drug_ID / Drug(SMILES) / Y
数据按需下载并缓存到本地,返回的是 pandas DataFrame,可以直接接你自己的建模代码,不必接受它的模型假设。
三层任务体系
| 层级 | 问题形式 | 代表任务 |
|---|---|---|
| Single-instance | 单个实体 → 性质 | ADMET、HTS 活性、毒性、产量 |
| Multi-instance | 两个及以上实体的相互作用 | DTI 亲和力、药物组合、抗体-抗原、催化剂 |
| Generation | 生成或设计新实体 | 分子生成、逆合成、反应预测、成对分子优化 |
另有 Benchmark Group 把一组任务打包成带固定划分与排行榜的评测集,如 admet_group(22 个 ADMET 终点)、docking_group、drugcombo_group。做方法研究要报可比结果,就该用 Benchmark Group 而不是自己随便切。
from tdc.benchmark_group import admet_group
group = admet_group(path="data/")
predictions = {}
for benchmark in group:
name = benchmark["name"]
train_val, test = benchmark["train_val"], benchmark["test"]
# ...在 train_val 上做你自己的 5 折,再预测 test
predictions[name] = your_model_predict(test["Drug"])
results = group.evaluate(predictions) # 每个终点返回官方指标
划分方式:这是 TDC 最该被用好的功能
- random:只适合 sanity check,几乎必然高估。
- scaffold:按 Bemis-Murcko 骨架分组,逼近「遇到新骨架」的真实场景,是 ADMET 类任务的默认选择。
- cold-start:多实体任务专用,保证测试集里的药物或靶点在训练集中完全没出现过。DTI 模型在随机划分下的漂亮数字,换成 cold-start 常常掉一大截,这才是它面对新靶点时的真实能力。
- temporal:按时间切分,最接近前瞻性预测的实际处境。
用它的边界
- TDC 数据来自公开文献与数据库,测定条件不统一:同一个终点里可能混着不同实验室、不同 assay 的数值,噪声天然存在,指标天花板不是 1.0。
- 不少 ADMET 数据集只有几百到几千个分子,模型间的小幅差异常常在随机波动之内。报结果必须给多种子的均值与标准差,单次跑分没有说服力。
- 公开集的化学空间与你自家项目的系列化合物差别很大。TDC 上的排名只说明方法在该分布上的表现,不能直接推断在内部数据上的优劣——真要选型,得拿内部数据重跑。
上手提示
- 先用
tdc.utils.retrieve_dataset_names()把任务清单浏览一遍,这本身就是一张 AI 制药任务地图; - 做方法研究用 Benchmark Group 的官方划分,否则结果不可比;
- DTI 类任务一定要看 cold-start 划分下的表现,随机划分的数字会骗人;
- 小数据集报均值 + 标准差,别用单次跑分下结论。
延伸资源
- 教程与导航:005《Therapeutics Data Commons 教程》、009《Harvard TDC 资源导航》;
- 数据划分与评测陷阱:169《Benchmark 陷阱》;ADMET 任务背景见「成药性」模块;
- 配套框架:172《DeepChem》、174《Chemprop》。