4. 药物数据集介绍:MoleculeNet、Tox21、HIV、BACE 等
做药物数据分析,数据是根本。
我见过不少同学,GCN 模型调得再好,换了个数据集就崩了。
为什么?因为没吃透数据本身的脾性。
这一章,我就带你把这些常用数据集挨个捋一遍。
你想想看,GCN 输入的是图结构。
分子数据集里,每个分子就是一个图,原子是节点,化学键是边。
但不同数据集,图的大小、标签分布、任务类型差异很大。
选错数据集,轻则模型不收敛,重则结论全是错的。
我个人的习惯是:上手一个新数据集,先做三步:
查规模、看标签分布、算平均图大小。
这三步走完,心里就有底了。
4.1 MoleNet:药物图学习的基准平台
MoleculeNet 不是单个数据集,而是一个基准平台。
它由 DeepChem 团队维护,目标是统一药物图数据的评测标准。
里面集成了十几个子数据集,覆盖分类、回归、多任务等场景。
我个人习惯把它当作“药物图数据的 Imagenet ”。
你在上面跑通一个模型,基本就证明这个架构能处理分子图。
| 子数据集 | 任务类型 | 分子数 | 任务数 | 典型应用 |
|---|---|---|---|---|
| ESOL | 回归 | 1128 | 1 | 水溶性预测 |
| FreeSolv | 回归 | 643 | 1 | 水合自由能 |
| Lipophilicity | 回归 | 4200 | 1 | 脂水分配系数 |
| HIV | 分类 | 41127 | 1 | HIV 活性 |
| BACE | 分类 | 1522 | 1 | β-分泌酶抑制 |
| Tox21 | 多任务分类 | 8014 | 12 | 毒性预测 |
注意看这个表。
不同数据集规模差了几十倍。
ESOL 只有 1128 个分子,HIV 却有 41127 个。
你如果用 GCN 跑 ESOL,模型稍微深一点就过拟合。
换到 HIV,又得担心欠拟合。
要发通用方法论文,用 HIV 或 Tox21,样本量大、任务难。
要做具体分子性质预测,用 ESOL 或 FreeSolv,专注回归任务。
这两个场景对 GCN 的要求完全不同。
4.2 Tox21:多任务毒性预测的金标准
Tox21 这个数据集,我印象很深。
它来自美国 Tox21 挑战赛,目标是预测 12 种不同毒性指标。
每个分子可能激活多种毒性通路,所以是个多标签分类问题。
为什么它是金标准?
第一,数据质量高,经过严格实验验证。
第二,标签分布极度不平衡——大多数分子是无毒的。
我曾经在一个毒性预测项目里,直接拿原始 Tox21 跑 GCN。
结果模型全预测成“无毒”,准确率 90% 多,但召回率是 0。
说白了,模型学到的就是“全部猜无毒”。
亏得我当时检查了混淆矩阵,不然就交了篇垃圾论文。
一定要关注每个任务的 AUC、精确率、召回率。
我建议用加权交叉熵或 Focal Loss 来缓解类别不平衡。
Tox21 的图结构也有特点。
8014 个分子,平均原子数约 26,平均键数约 28。
这个规模对 GCN 比较友好,2-3 层图卷积就够了。
层数再深,容易过平滑,所有节点表征趋同。
加载 Tox21 的代码示例:
# 使用 DeepChem 加载 Tox21
import deepchem as dc
tasks, datasets, transformers = dc.molnet.load_tox21(
featurizer='GraphConv',
splitter='random',
reload=False
)
train_dataset, valid_dataset, test_dataset = datasets
# 查看数据集信息
print(f"训练集分子数: {len(train_dataset)}")
print(f"任务数: {len(tasks)}")
print(f"任务名称: {tasks}")
这里我用了 GraphConv featurizer。
它会自动把 SMILES 转成图结构数据,节点特征包含原子类型、度数等。
你不需要自己写图构建代码,DeepChem 帮你做了。
4.3 HIV:大规模分子活性筛选
HIV 数据集来自 Drug Therapeutics Program (DTP) HIV 筛查。
它包含 41127 个分子,只有 1 个任务:判断是否抑制 HIV 复制。
这个数据集的难点在于:
活性分子只占 3.5% 左右。
剩余的 96.5% 都是非活性分子。
我记得第一次跑 HIV 时,模型 AUC 一直上不去。
后来发现,数据划分方式有问题——随机划分会把少量活性样本均匀分到各集。
但实际应用中,我们希望模型能泛化到全新的活性分子结构。
所以,我建议用 scaffold 划分,把结构相似的分子分在一起,模拟更真实的场景。
优先使用 scaffold_split 而不是 random_split。
这样才能评估模型对全新分子骨架的泛化能力。
HIV 的图平均大小约 40 个原子,对比 Tox21 大了一号。
这意味 GCN 需要更深的层数或者图池化策略来捕捉全局信息。
4.4 BACE:靶向药物设计的经典案例
BACE 数据集专注于 β-分泌酶 1 (BACE1) 抑制剂的活性预测。
BACE1 是阿尔茨海默病药物研发的重要靶点。
数据量不大,1522 个分子,但每个分子都有实验测定的 IC50 值。
我个人觉得,BACE 的价值在于它的“可解释性”需求高。
你预测出一个分子有活性,化学家会追问:哪个基团贡献最大?
这时候,GCN 的注意力机制或者梯度热力图就能派上用场。
我遇到过一个有意思的情况:
用 GCN 在 BACE 上训练完,模型在某些分子上预测很准。
分析模型内部表征后发现,它自动学到了 “磺酰胺基团” 对 BACE 抑制的重要性。
这正好和已知的化学知识吻合。
你看,GCN 不仅能预测,还能帮你挖掘分子机制。
BACE 的数据加载类似:
tasks, datasets, transformers = dc.molnet.load_bace(
featurizer='GraphConv',
splitter='scaffold'
)
train, valid, test = datasets
print(f"BACE 训练集: {len(train)} 分子")
print(f"BACE 测试集: {len(test)} 分子")
4.5 本章核心知识结构
下面这张图梳理了 MoleculeNet、Tox21、HIV、BACE 的关系和关键指标。
你可以把它当作选数据集时的速查表。
4.6 数据集选择的实用建议
我根据自己做项目的经验,总结了一个简单的选型逻辑:
- 练手/验证模型:用 ESOL 或 FreeSolv,数据小,跑得快
- 多任务学习:用 Tox21,12 个任务可以测试模型的多标签能力
- 大规模二分类:用 HIV,挑战类别不平衡
- 靶向药物设计:用 BACE,兼顾预测准确性和可解释性
- 综合评测:选 MoleculeNet 中的多个子集,做一个对比实验
我建议你始终使用 scaffold split 作为默认划分。
无脑 random split 容易高估模型泛化能力,这在论文审稿时会被猛批。
嗯,数据集这部分就先讲到这。
你把这些背景信息吃透,后面跑 GCN 的时候就知道怎么调整模型结构了。