第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这个工种定制的工具箱。

ADMET 数据资源框架 PubChem ChEMBL ADMETlab 1.1亿+ 化合物 200万+ 化合物 30万+ 标注集 预训练 + 数据挖掘 QSAR建模 + 分类 快速验证 + 小样本 高质量训练集 → 可靠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
踩过的坑: 我曾经直接下载完整的1亿条SDF,解压后发现硬盘只剩2GB。一条化合物SDF占多少空间知道吗?平均1-2KB。1亿条就是100-200GB。建议按需分段下载,不要一次性拉全部。

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里,如果你只关注ADMET相关数据,可以使用目标类型过滤。比如你可以只用"Toxicity"、"ADME"等作为过滤字段,避免把活性数据混进来。

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条标注,不是深度学习最佳的量级。
  • 数据覆盖面有限: 多数分子集中在小分子药物空间,对极端结构的泛化能力一般。
我的推荐策略:
  1. 初期快速原型验证 → 使用ADMETlab数据。
  2. 数据扩增、提升泛化性 → 加入ChEMBL的高质量数据。
  3. 极限规模预训练 → 引入PubChem。

3.5 实战:用多数据源构建ADMET训练集

光说不练假把式。咱们来一个真实场景的代码示例,把三个数据源串起来。

任务: 构建Caco-2细胞渗透性的二分类训练集。

步骤:

  1. 从ADMETlab拿基准数据作为核心训练集。
  2. 用ChEMBL API补充高置信度的Caco-2数据。
  3. 最后用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)} 条")
经验之谈: 多源数据合并时,去重是最容易出问题的一步。同一个分子在不同数据库可能用不同的SMILES表示(比如标准化问题)。我最常用的做法是:先用RDKit做标准化,再基于标准化后的Canonical SMILES去重。

3.6 数据清洗须知

数据拿到手后,千万别直接喂模型。我总结了几条必须做的清洗步骤:

  1. 去除无机物和混合物 —— 只保留纯有机物。
  2. 检查SMILES合法性 —— 用RDKit解析,不合格的直接丢掉。
  3. 归一化标签 —— 比如把不同单位(mM、nM、%R)统一为同一个标准。
  4. 处理二分类阈值 —— 比如Caco-2渗透性,不同文献阈值不同(有的用1×10-6 cm/s,有的用0.5×10-6 cm/s)。标注时要保持一致。

3.7 常见问题解答

问题 我的建议
数据量不够大怎么办? 用PubChem做数据增强。但记得做质量过滤,别盲目加噪声。
ChEMBL下载速度太慢? 用SQLite离线版本,本地查询。一次下载,永久使用。
三个数据库的标签不一致? 以ChEMBL或ADMETlab为基准,做标签标准化。不要混用不同实验条件下的数据。
能不能直接用ADMETlab模型? 可以,适合快速验证。但如果你想做自己的定制化模型,还是建议用原始数据重新训练。

好了,三个数据源的底细都给你摸清了。往下走,第四章我会讲如何把这些数据做特征工程,把它变成深度学习模型能吃的"数字饲料"。