2. 数据集获取与准备:ChEMBL、PubChem 等数据库归纳总结
说实话,搞 ADMET 预测,数据比模型重要多了。
模型调得再花哨,喂进去的数据是脏的、不完整的,结果基本就是废纸一张。我自己最开始做 ADMET 预测时,踩过最大的坑就是数据库选错了,或者拿到的数据没清洗干净,导致后面几个月的调参全白费。所以这一章,我们踏踏实实把数据源搞清楚。
2.1 为什么要从公共数据库获取数据?
你可能会问:自己测一批化合物,用自己的数据训练模型不行吗?行,但代价太高。合成、纯化、体外实验,一套下来几百个化合物,成本和时间都扛不住。
公共数据库的好处就在于,它们帮我们积累了上百万条实验数据。其中 ChEMBL 和 PubChem 是两条最粗的大腿,基本上覆盖了大部分药物相关的 ADMET 终点。
2.2 ChEMBL 数据库速览
ChEMBL 是欧洲生物信息研究所(EBI)搞的,专注在“药物靶点亲和力、ADMET 性质、毒性数据”上。它的核心特点就是——精。
| 维度 | 特点 |
|---|---|
| 数据量 | 约 200 万条活性测量值,来自 8 万多篇文献 |
| 数据类型 | IC50, Ki, KD, EC50, 以及多种 ADMET 终点 |
| 质量 | 高——人工审核 + 标准化处理 |
| 适用场景 | 构建训练集、验证集、模型对比基准 |
| 访问方式 | Web 界面、REST API、批量下载 SDF/C SV |
我个人的习惯是,从 ChEMBL 搞数据时,一定会先看它的 target confidence score。低于 9 分的,我通常会直接排除掉,因为这些数据对应的靶点可能只是个推测。
2.3 PubChem 数据库速览
PubChem 是美国国立卫生研究院(NIH)维护的。它更像一个“化学信息大杂烩”,里面不光有活性数据,还有大量理化性质、安全数据表、参考文献。量极大,但不一定都靠谱。
| 维度 | 特点 |
|---|---|
| 数据量 | 超过 1.1 亿个化合物条目,约 3 亿个生物活性结果 |
| 数据类型 | 生物活性、毒性、化学性质、安全注意事项 |
| 质量 | 参差不齐——部分数据来自自动化的高通量筛选 |
| 适用场景 | 大规模筛选、补充 ChEMBL 缺少的终点、外部测试集 |
| 访问方式 | Web 界面、PUG REST、PUGy SOAP、FTP 批量下载 |
2.4 其他值得关注的数据库
除了上面两大主力,还有几个专业库,偶尔也能帮上大忙:
- DrugBank: 已上市/临床药物数据。适合做外部验证,因为结构多样性受限。
- Tox21: 美国毒理学项目,专门针对毒性相关核受体和应激反应通路。处理毒性分类任务时,它是第一手选择。
- eMol/Ther: 专注理化性质(logP, LogD, 溶解度)。做 ADMET 的物理化学性质预测时,很有用。
说白了吧,没有哪个库能覆盖所有的 ADMET 终点。实战中往往是——ChEMBL 打底,PubChem 补充,Tox21 或者 DrugBank 做交叉验证。
2.5 核心数据获取流程
知道了有哪些库,还得知道怎么拿数据。我不建议你每次都去点网页下载,那太慢了。下面是我最常用的一套流程:
2.5.1 从 ChEMBL 获取数据
ChEMBL 提供了 REST API,可以直接用 Python 请求。我个人推荐用 chembl_webresource_client 这个库,封装得比较舒服。
# 安装
pip install chembl_webresource_client
# 查询人源 hERG 的 IC50 数据
from chembl_webresource_client.new_client import new_client
target = new_client.target
herg = target.search('hERG')[0]
herg_id = herg['target_chembl_id']
activity = new_client.activity
herg_data = activity.filter(
target_chembl_id=herg_id,
standard_type='IC50',
standard_relation='='
).only(['molecule_chembl_id', 'standard_value', 'standard_units'])
# 转成列表
records = list(herg_data)
print(f'共获取 {len(records)} 条 hERG IC50 记录')
2.5.2 从 PubChem 获取数据
PubChem 的 PUG REST 接口稍微原始一点。我一般通过 pubchempy 或者直接发 HTTP 请求来拿。
# 用 pubchempy 获取特定 AID 下的数据
import pubchempy as pcp
# AID: PubChem 生物活性测试的编号
results = pcp.get_assays(aid=588342,
assay_type='confirmatory',
result_type='primary')
# 提取 SMILES 和活性值
data = []
for res in results:
smiles = res['PUBCHEM_EXT_DATASOURCE_SMILES']
activity = res['PUBCHEM_ACTIVITY_OUTCOME']
data.append((smiles, activity))
print(f'活动数据共 {len(data)} 条')
2.6 数据准备阶段的三个关键动作
光把数据拉到本地是不够的。我每次拿到原始数据后,都会强制自己做三步:
- 标准化单位: 把所有 IC50/EC50 搞到 nM 单位,分类数据统一成 binary(active/inactive)。
- 去重: 同一个分子在同个终点下出现多次,取中位数而不是均值——这样能抗住少量异常值。
- 检查分布: 一定要画个直方图看看。我曾经遇到过一个 hERG 数据,99% 的点都在 10 uM 以下,那是因为数据库只收录了活性高的。这种偏倚分布直接调 SVR 核,结果是灾难。
standard_value 和 standard_units 字段做单位转换,再用 molregno 去重。PubChem 那边则推荐用 CID 作为唯一键。
2.7 本章知识体系总览
下面这张图,是我自己总结的数据获取与准备的核心流程,很实用:
嗯,这个流程我已经跑过不下几十次了。每拿到一个新的 ADMET 终点,我都会重新走一遍,保证数据源干净、可复原。下一阶段,我们就要拿着这些清洗好的数据,去构建 SVR 模型的训练管线了。