173

TDC:药物发现数据集和 Benchmark 工具箱

PyTDC 一行加载贯穿研发全流程的标准数据集、划分与评测。这篇讲清它的三层任务体系、真正该用的划分方式,以及把公开 benchmark 结论迁到自家项目时的边界。

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_groupdrugcombo_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 划分下的表现,随机划分的数字会骗人;
  • 小数据集报均值 + 标准差,别用单次跑分下结论。

延伸资源