第3章 ADMET数据资源:PubChem, ChEMBL, ADMETlab介绍
做ADMET建模,第一步不是调模型,是找数据。
我刚接触这个领域时,也犯过傻——花两周优化模型结构,结果因为训练数据本身有问题,模型在验证集上看着还行,一换个数据集直接崩了。后来我懂了,数据质量决定了模型的上限,模型只是把天花板顶到。
这一章,咱们专门聊聊三套主流ADMET数据源:PubChem、ChEMBL和ADMETlab。每家的数据风格、适用场景都不一样。你把这个搞清楚了,后面建模才心里有数。
3.1 三大数据源全景对比
我先给个总览表格。你对着看,后面我们一个个拆开讲。
| 数据源 | 核心特点 | 数据量级 | 我最常用的场景 |
|---|---|---|---|
| PubChem | 免费、量大、结构多样 | 1.1亿+化合物 | 大规模数据挖掘、预训练 |
| ChEMBL | 专家手工整理、活性数据标注 | 200万+化合物 | 分类模型、QSAR建模 |
| ADMETlab | 专为ADMET设计、带预测模型 | 30万+标注集 | 快速验证、小样本建模 |
你想想看,这三家的定位其实互补。PubChem像一个大仓库,什么都有。ChEMBL更像一个精装修的房子,数据质量高。ADMETlab则是专门为ADMET这个工种定制的工具箱。
3.2 PubChem——规模最大的"数据池塘"
PubChem由美国国立卫生研究院运营。说它大,一点也不夸张。截至2024年,化合物记录数已经超过1.1亿条。
我个人的习惯是:做大规模数据挖掘、做分子特征预训练,第一优先看PubChem。它的数据量大,结构多样化程度高。
怎么获取数据?
PubChem提供了多种下载方式。我简单列下常用的几个,省得你一个个去官网找。
方式1:PUG REST API
直接用URL请求,适合小规模数据获取。举个例子,查阿司匹林(CID 2244)的信息:
GET https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/2244/JSON
方式2:批量下载SDF文件
适合大规模离线处理。PubChem提供了按月更新的化合物SDF压缩包:
# 下载完整SDF文件
wget ftp://ftp.ncbi.nlm.nih.gov/pubchem/Compound/CURRENT-Full/SDF/Compound_000000001_000500000.sdf.gz
PubChem里ADMET相关数据怎么找?
PubChem有一个叫"Bioactivity"的模块。你可以按ADMET属性做筛选。比如你想找有Caco-2细胞渗透性数据的化合物:
# 通过PUG REST查询有Caco-2数据的化合物
GET https://pubchem.ncbi.nlm.nih.gov/rest/pug/assay/aid/1014/sids/JSON
这里aid=1014是一个经典的Caco-2渗透性检测实验。返回的SID列表你可以再映射回CID,然后关联出分子结构。
PubChem数据的痛点
- 噪声大: 数据来源多,质量参差不齐。我见过同一个化合物在PubChem里有5套不同的LogD数据,数值能差3个log单位。
- 标注不一致: 实验条件不同(温度、pH、方法),结果不可直接合并。
- 下载速度: FTP有时候很慢,尤其在国内网络环境下。
所以我的建议是:用PubChem做粗筛选,拿到候选分子后,再用更干净的数据源做精标定。
3.3 ChEMBL——更干净、更专业的宝藏库
ChEMBL是欧洲生物信息学研究所维护的数据库。它和PubChem不一样的地方在于:数据是经过专家手工整理的。
我做过一个评估:从PubChem捞出来的数据,噪音率可能超过15%。但如果是ChEMBL的数据,噪音率普遍低于5%。原因是ChEMBL的每一篇文献、每一个活性数据都有专人审核。
ChEMBL的核心特性
- 数据附带有文献来源 —— 你可以追到论文原文。
- 标注了实验类型 —— IC50、Ki、EC50等分得清清楚楚。
- 标准化单位 —— 全部统一为nM,省得自己转换。
Python操作ChEMBL数据库
我推荐直接用ChEMBL webresource client这个Python库。安装和使用都非常方便。
# 安装
pip install chembl_webresource_client
# 查询特定化合物的ADMET数据
from chembl_webresource_client.new_client import new_client
molecule = new_client.molecule
activity = new_client.activity
# 查询阿司匹林(ChEMBL ID: CHEMBL25)的Caco-2渗透性数据
results = activity.filter(
molecule_chembl_id='CHEMBL25',
assay_description__icontains='Caco-2'
).only(['standard_value', 'standard_units', 'pchembl_value'])
for r in results:
print(f"Value: {r['standard_value']} {r['standard_units']}, pChEMBL: {r['pchembl_value']}")
ChEMBL的批下载
ChEMBL也提供了完整的SQLite和SDF下载。我个人更喜欢用SQLite版本,它包含全部关联关系,查询起来比API快得多。
# 下载ChEMBL 33 SQLite版本
wget ftp://ftp.ebi.ac.uk/pub/databases/chembl/ChEMBLdb/releases/chembl_33/chembl_33_sqlite.tar.gz
# 解压
tar -xzf chembl_33_sqlite.tar.gz
解压后得到一个 chembl_33.db 文件,约3.5GB。你可以直接用SQLite客户端连接,做复杂的多表联查。
3.4 ADMETlab——专为ADMET建模范式打造
ADMETlab是中南大学团队开发的一个ADMET预测平台。和前面两个不同,它一开始就是为ADMET建模准备的。
我记得有一次,我需要快速验证一个新模型在人体肠道吸收(HIA)数据集上的表现。用PubChem的话,我要自己整理数据、过滤冗余;用ChEMBL也不错,但还需要考虑实验条件的一致性。ADMETlab直接提供了一个20,000+化合物的标准训练集,节省了我至少一天的时间。
ADMETlab的核心亮点
- 数据对齐全: 同一个化合物,你在ADMETlab里可以查到它的HIA、Caco-2、P-gp底物、血浆蛋白结合率等多个ADMET属性,不用自己跨表匹配。
- 提供预测模型: 如果你只需要快速评估,可以直接用网页版上传SMILES,不需要自己训练模型。
- 公开数据集可下载: 部分数据集可以在GitHub上找到,用于模型训练。
如何获取ADMETlab的数据
ADMETlab 2.0提供了公开基准数据集。我强烈建议你从它的GitHub仓库获取这些数据:
# 克隆ADMETlab 2.0数据集
git clone https://github.com/du3355/ADMETlab2.0
# 进入目录后,data 文件夹下包含了多个ADMET任务的标注数据
ls ADMETlab2.0/data/
数据以CSV格式提供。每行是一个化合物,包含SMILES和多列ADMET标签。直接可以用pandas读入:
import pandas as pd
df = pd.read_csv("ADMETlab2.0/data/HIA.csv")
print(df.head())
print(f"数据集大小:{len(df)} 条")
ADMETlab的不足之处
- 数据量偏小: 每个任务仅有10,000-30,000条标注,不是深度学习最佳的量级。
- 数据覆盖面有限: 多数分子集中在小分子药物空间,对极端结构的泛化能力一般。
- 初期快速原型验证 → 使用ADMETlab数据。
- 数据扩增、提升泛化性 → 加入ChEMBL的高质量数据。
- 极限规模预训练 → 引入PubChem。
3.5 实战:用多数据源构建ADMET训练集
光说不练假把式。咱们来一个真实场景的代码示例,把三个数据源串起来。
任务: 构建Caco-2细胞渗透性的二分类训练集。
步骤:
- 从ADMETlab拿基准数据作为核心训练集。
- 用ChEMBL API补充高置信度的Caco-2数据。
- 最后用PubChem做外部验证集或数据增强。
import pandas as pd
from chembl_webresource_client.new_client import new_client
import requests
import json
# 1. 加载ADMETlab基准数据
base_df = pd.read_csv("ADMETlab2.0/data/Caco-2.csv")
print(f"ADMETlab基准数据: {len(base_df)} 条")
# 2. 从ChEMBL补充数据
activity = new_client.activity
chembl_data = []
for compound in ["CHEMBL25", "CHEMBL46", "CHEMBL59"]:
results = activity.filter(
molecule_chembl_id=compound,
assay_description__icontains='Caco-2'
).only(['molecule_chembl_id', 'standard_value', 'standard_units', 'pchembl_value'])
chembl_data.extend(results)
chembl_df = pd.DataFrame(chembl_data)
print(f"ChEMBL补充数据: {len(chembl_df)} 条")
# 3. PubChem外部验证集:通过PUG API获取
pubchem_url = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/assay/aid/1014/sids/JSON"
resp = requests.get(pubchem_url)
sids = json.loads(resp.text)['InformationList']['Information'][0]['SID']
print(f"PubChem外部验证集: {len(sids)} 条 SID")
# 合并训练集
combined_df = pd.concat([base_df, chembl_df], ignore_index=True)
combined_df = combined_df.drop_duplicates(subset='smiles')
print(f"最终训练集大小: {len(combined_df)} 条")
3.6 数据清洗须知
数据拿到手后,千万别直接喂模型。我总结了几条必须做的清洗步骤:
- 去除无机物和混合物 —— 只保留纯有机物。
- 检查SMILES合法性 —— 用RDKit解析,不合格的直接丢掉。
- 归一化标签 —— 比如把不同单位(mM、nM、%R)统一为同一个标准。
- 处理二分类阈值 —— 比如Caco-2渗透性,不同文献阈值不同(有的用1×10-6 cm/s,有的用0.5×10-6 cm/s)。标注时要保持一致。
3.7 常见问题解答
| 问题 | 我的建议 |
|---|---|
| 数据量不够大怎么办? | 用PubChem做数据增强。但记得做质量过滤,别盲目加噪声。 |
| ChEMBL下载速度太慢? | 用SQLite离线版本,本地查询。一次下载,永久使用。 |
| 三个数据库的标签不一致? | 以ChEMBL或ADMETlab为基准,做标签标准化。不要混用不同实验条件下的数据。 |
| 能不能直接用ADMETlab模型? | 可以,适合快速验证。但如果你想做自己的定制化模型,还是建议用原始数据重新训练。 |
好了,三个数据源的底细都给你摸清了。往下走,第四章我会讲如何把这些数据做特征工程,把它变成深度学习模型能吃的"数字饲料"。