2. 数据集获取与准备:ChEMBL、PubChem 等数据库归纳总结

说实话,搞 ADMET 预测,数据比模型重要多了。

模型调得再花哨,喂进去的数据是脏的、不完整的,结果基本就是废纸一张。我自己最开始做 ADMET 预测时,踩过最大的坑就是数据库选错了,或者拿到的数据没清洗干净,导致后面几个月的调参全白费。所以这一章,我们踏踏实实把数据源搞清楚。

2.1 为什么要从公共数据库获取数据?

你可能会问:自己测一批化合物,用自己的数据训练模型不行吗?行,但代价太高。合成、纯化、体外实验,一套下来几百个化合物,成本和时间都扛不住。

公共数据库的好处就在于,它们帮我们积累了上百万条实验数据。其中 ChEMBL 和 PubChem 是两条最粗的大腿,基本上覆盖了大部分药物相关的 ADMET 终点。

我的建议: 初期调研阶段,优先用 ChEMBL 的数据。它的数据是人工审核过的,质量相对稳定。PubChem 虽然量大,但含有很多高通量筛选的噪音,需要更严苛的清洗。

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 批量下载
避坑指南: 我曾经从 PubChem 拉了一批 hERG 毒性数据,结果发现里面混合了不依赖浓度的“阳性判断”和真正的 IC50 值。如果不做单位/条件过滤,模型直接学偏了。切记:用 PubChem 时,一定要按“assay type”和“result unit”做两级过滤。

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 数据准备阶段的三个关键动作

光把数据拉到本地是不够的。我每次拿到原始数据后,都会强制自己做三步:

  1. 标准化单位: 把所有 IC50/EC50 搞到 nM 单位,分类数据统一成 binary(active/inactive)。
  2. 去重: 同一个分子在同个终点下出现多次,取中位数而不是均值——这样能抗住少量异常值。
  3. 检查分布: 一定要画个直方图看看。我曾经遇到过一个 hERG 数据,99% 的点都在 10 uM 以下,那是因为数据库只收录了活性高的。这种偏倚分布直接调 SVR 核,结果是灾难。
小技巧: 用 ChEMBL 的 standard_value 和 standard_units 字段做单位转换,再用 molregno 去重。PubChem 那边则推荐用 CID 作为唯一键。

2.7 本章知识体系总览

下面这张图,是我自己总结的数据获取与准备的核心流程,很实用:

数据集获取与准备核心流程 ADMET 数据获取与准备流程图 ChEMBL 人工审核 · 高质量 PubChem 海量数据 · 需筛选 DrugBank/Tox21 专业领域补充 数据合并与标准化 标准化单位 统一到 nM / Binary 去重 取中位数 · 抗异常 分布检查 直方图 · 识别偏差 可用的训练数据集 SMILES + ADMET 标签 核心思路:多种来源交叉补充 + 严格清洗 = 高质量的 ADMET 训练数据

嗯,这个流程我已经跑过不下几十次了。每拿到一个新的 ADMET 终点,我都会重新走一遍,保证数据源干净、可复原。下一阶段,我们就要拿着这些清洗好的数据,去构建 SVR 模型的训练管线了。