想象你刚加入一家 AI 制药公司,导师丢给你一个任务:用分子性质数据训练一个预测模型。你面前摆着三座风格迥异的“数据档案馆”——ZINC、ChEMBL 和 PubChem。ZINC 像一座大型样品超市,货架上全是可下单购买的化合物;ChEMBL 像一间实验记录馆,管理员从文献里工整地抄下每一个活性实验值;PubChem 则像一座开放的公共数据广场,四面八方都往这里堆放档案,数量惊人却难免混乱。不了解这三座馆的分工,你很可能拿到一堆数据却不知从哪下手。 本文就用这三座档案馆的比喻,带你搞懂三者的定位、数据规模、标注类型、许可与更新机制,并帮你学会如何选型、融合,为训练分子性质模型备好可靠数据。
对 AI 从业者而言,掌握分子性质数据集的差异,能避免“拿错数据乱训练”的灾难,直接提升数据选型、模型质量与项目落地效率。
可视化演示
展示ZINC、ChEMBL、PubChem三大数据集的维度对比、数据规模及融合流水线,点击步骤切换分析维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
三数据集维度对比 ZINC: 规模大,标注少 ChEMBL: 生物活性标注丰富 sz×ann×lic×upd四维评分 根据任务需求选择合适数据集
背景与价值
想象你要给档案馆里的每份“分子档案”做一张借书卡:卡片上既要有分子结构,也要有它的性质标签。分子本身非常小,小到肉眼看不见,于是化学家发明了 SMILES 这类“分子身份证”字符串。靠着这张身份证,计算机才能读懂分子长什么样子;再把溶解度、毒性、活性等性质贴上去,就成了机器学习要用的分子性质数据集。
化学信息学就是研究“分子身份证”与“性质标签”如何互相对应的学科。对 AI 从业者来说,这相当于建立了从结构到性质的桥梁。ZINC、ChEMBL、PubChem 三个数据集,正是这座桥上三座存储量巨大的仓库。
1. N 条记录数:N 代表档案馆里有多少条分子档案,规模越大,越能支撑大模型训练。
2. x_i 分子结构:每条记录的核心是分子结构,通常用 SMILES 或 InChI 字符串表示,相当于分子的身份证号。
3. y_i 性质标签:标签可以是活性、毒性、LogP 等性质,这是模型要预测的目标值。
4. m_i 元数据:记录中还附带来源、供应商、文献编号等信息,用来做溯源和审计。
理解了这个基本结构,再看三座档案库,你就能明白:它们真正的差异不是“谁的文件多”,而是“每份档案上贴了哪些标签、由谁整理、能不能合法使用”。
$$ \displaystyle D = \{ (x_i, y_i, m_i) \}_{i=1}^{N}$$
ZINC数据规模
ZINC 更像一座巨大的化合物样品超市。走进超市,你会看到货架上摆着数不清的小分子,每个瓶子上都贴着供应商编号和价格。它回答的问题是:“这个分子我能不能买到?去哪买?”而不是“这个分子对某个靶点有没有活性”。
从技术上说,ZINC 收录的是商业可购买化合物,并提供 SMILES、SDF 文件、三维构象等格式。ZINC20 的规模已达到亿级以上,尤其适合做虚拟筛选的起点:先在海量分子里筛出候选结构,再去实验室购买验证。它与实验活性库最大的区别,是缺少高质量的生物活性标签。
回到比喻:ZINC 的优势是“货架大、标签清楚”,标签主要指供应商和可购买性,而不是实验活性。因此,如果任务是活性预测而不是货源筛选,直接拿 ZINC 当训练集就不合适,容易学到“能不能买到”而不是“有没有效”。
- N_ZINC 库内分子总数这是 ZINC 的“总货架数”,决定虚拟筛选时可探索的空间大小。
- 供应商集合 SZINC 里的化合物来自上百家化学品供应商,相当于超市里不同的供货柜台。
- n_s 单个供应商贡献量把每个供应商提供的可购买分子数相加,就得到整个库的规模。
ChEMBL活性注释
ChEMBL 则完全不同,它像一间由专业图书管理员整理的实验记录馆。管理员们从成千上万篇学术文献中,把“化合物 A 对靶点 B 的 IC50 是多少”这类实验记录工整地抄下来,并标注出原始论文编号,方便你回看证据。
正是这种人工整理过程,让 ChEMBL 成为分子性质数据集中“标签质量”的代表。它的核心字段通常是分子结构、靶点、活性值、测定类型等。IC50 可以通俗理解为:要抑制某个靶点一半活性所需药物浓度,数值越小,通常代表这个分子越强。
ChEMBL 的许可通常采用 CC BY-SA,更新也较规律,非常适合作为活性标签的训练集。但要注意,它只包含已被文献报道过的化合物,覆盖度远不如 ZINC 和 PubChem 的“全量货架”。所以它更像“精确但有限”的实验档案,而不是面面俱到的大全。
- 化合物 c 与靶点 t档案的核心是一对关系——某个分子和某个生物靶点。
- IC50(c, t) 活性测定表示该化合物对靶点的半数抑制浓度,是活性强弱最基本的量化指标。
- min 取最强记录同一实验可能有多次重复,ChEMBL 会取其中最优值作为代表记录。
PubChem多源聚合
PubChem 的定位则像一座开放公共广场,任何人都可以来摆摊。美国 NIH 把全球大量机构提交的数据聚合在一起,包括化合物结构、生物活性、药物信息、专利片段等。它不追求由同一批管理员统一整理,而是尽量把所有来源的档案都留下。
这让 PubChem 变得非常庞大,但也带来了重复和混乱:同一个分子可能被不同机构以不同格式上传,同一个字段在不同子库里含义也可能不一样。它的优势是可以跨库交叉检索,通过 PUG 接口做程序化访问,非常适合做补充查询和广覆盖筛查。
用 PubChem 做模型训练前,一定要有心理准备:它适合“查资料”,但不适合直接拿来训练。你要像整理一个共享书架那样,去重、去冲突、补齐缺失值,才能真正把公共数据变成高质量训练集。
- 子库集合 DPubChem 下面有大量子库,每个子库可以看作广场上的一个摊位。
- 每条数据 d每个摊位可能贡献结构、活性、毒性、文献等不同维度的记录。
- 并集合并取所有子库的并集,所以 PubChem 必然存在重复和字段不一致。
三大库对比
现在,你站在三座档案馆的十字路口,需要做一次横向对比。ZINC 回答“哪里买”,ChEMBL 回答“活性多少”,PubChem 回答“还能查到什么”。三者的关系不是替代,而是互补。
| 维度 | ZINC | ChEMBL | PubChem |
|---|---|---|---|
| 核心定位 | 可购买化合物目录 | 实验活性文献库 | 多源聚合公共平台 |
| 典型字段 | SMILES、供应商、可购买性 | IC50、靶点、文献来源 | 结构、疾病、基因、毒性等 |
| 许可特点 | 免费开放,重分发需看版本条款 | CC BY-SA,开放友好 | 整体开放,子库许可各异 |
| 更新方式 | 代际更新 | 定期版本发布 | 持续聚合更新 |
回到比喻:如果你要开药店,首先去 ZINC 超市进货;如果要写药效报告,就去 ChEMBL 实验馆查记录;如果想了解某分子是否被其他人研究过,再去 PubChem 广场搜一圈。三座馆各有专长,选库本质是项目需求的映射。
- Score_i 综合得分每个候选数据集都有一个业务匹配度得分,表示“适不适合当前项目”。
- Scale、Quality、License规模代表数据量,质量代表标注可靠性,许可代表能否合法商用。
- 权重 alpha、beta、gamma不同任务对三个维度的侧重不同,比如做生成模型更看重规模,做活性预测更看重质量。
选型与融合
真实项目往往不只依赖一座馆。做一次药物发现管线,可以用 ZINC 提供候选分子,用 ChEMBL 提供活性标签,用 PubChem 补充毒性和专利信息。就像做一道大菜,既要有食材市场,也要有菜谱和营养检测报告。
融合的关键不是简单地把三个文件拼在一起,而是要做去重和冲突处理。同一个分子在三个库中都出现,SMILES 写法可能不同,活性值也可能互相矛盾。通常的做法是先把结构标准化,再以高可信来源为准,并保留每一份记录的来源,做到可追踪。
这里还有一个常被忽略的点:许可合规。ZINC 的条款、ChEMBL 的 CC BY-SA、PubChem 子库的不同授权,决定了你的产物能否商用。数据融合前,最好让数据工程师和法务一起做一张“使用权限清单”,否则模型训练得再好,上线时也可能被版权问题拦下。
- 三库并集先把 ZINC、ChEMBL、PubChem 的数据放在一起,形成候选池。
- dedup 去重通过标准化后的分子指纹或规范 SMILES,把同一个分子识别出来并合并。
- 训练集 D_train最终用于模型训练的数据集必须干净、可靠、有来源可查。
实践与流程
最后,把选好的档案变成模型,需要一条完整流程。首先是下载与解析,ZINC 常用 FTP 或分块 SDF 下载,ChEMBL 可以从官网直接获取 TSV 或 SDF,PubChem 则推荐用 PUG 接口做程序化查询。拿到原始文件后,第二步不是立刻训练,而是清洗、筛选和标准化。
清洗内容至少包括:统一原子连接性、去除明显无机盐或结构异常、修正不合法 SMILES、处理缺失值。随后要根据任务做分子表征,例如把 SMILES 转为指纹或图数据。最后再把数据集划分成训练、验证、测试三部分,训练性质预测模型。
从下载、清洗到建模,每一步都像档案馆的整理流程。只有档案编号统一、标签可靠、摆放整齐,模型才能从数据中学到真实的化学规律。记住:数据决定上线,训练只决定上线后的表现。
- 参数 theta模型内部需要学习的权重,可以理解为预测分子的决策规则集合。
- 预测函数 f_theta(x)输入分子结构 x,输出模型预测的性质值。
- 均方误差把预测值和真实 y 的差平方后取平均,是衡量模型训练好坏的常见指标。
AI 应用场景
虚拟筛选候选池搭建
阶段:数据准备与虚拟筛选
解决的问题:传统方式是人工从海量化合物中挑候选分子,费时费力且容易遗漏。使用 ZINC 数据集,可以程序化下载数亿可用分子,再用简单规则过滤成药性指标,快速得到虚拟筛选候选池。
具体案例:一家 AI 制药公司希望寻找某激酶抑制剂先导化合物。工程师从 ZINC20 下载活性位匹配的 3D 分子库,保留可购买、分子量适中、LogP 在规定范围内的结构,再配合分子对接工具,把候选规模从 1 亿压到 5000,进入实验验证。
分子活性预测模型训练
阶段:训练集构建与模型训练
解决的问题:没有活性质心标签,监督模型便无从下手。ChEMBL 的人工整理活性值提供了可靠标签,使模型能学习“分子结构到靶点活性”的映射关系。
具体案例:团队从 ChEMBL 中下载某靶点全部已知活性数据,取 IC50 小于 1μM 的分子作为正样本,大于 30μM 的作为负样本,并划分训练集和测试集,训练了一个基于分子指纹的梯度提升模型,用于预测新化合物活性。
多源数据合规融合
阶段:数据治理与合规审计
解决的问题:单一数据库覆盖不全,融合多个数据库又可能带来许可和一致性问题。通过梳理 PubChem 子库来源和许可,再与 ZINC、ChEMBL 做去重合并,可建立安全合规的私有训练集。
具体案例:某数据平台搭建化合物知识图谱时,使用 PubChem PUG 接口检索 100 个分子的专利、疾病和结构信息,记录每个字段来自哪个子库,并标记可否商用,最终形成一份合规的数据血缘报告。
Python 演示
import math MOLE_LIMIT = 1000000 def coverage(records, field): known = [r for r in records if r.get(field) is not None] return len(known) / len(records) if records else 0.0 def average_coverage(records): fields = ["purchasable", "activity", "safety"] return sum(coverage(records, f) for f in fields) / len(fields) def merge_datasets(groups): merged = {} for group in groups: for rec in group: key = rec["canonical_smiles"] or rec["id"] merged[key] = rec return list(merged.values()) def choose_score(records): size_score = min(1.0, len(records) / MOLE_LIMIT) return 0.6 * size_score + 0.4 * average_coverage(records) if __name__ == "__main__": zinc = [ {"id": "ZINC0001", "canonical_smiles": "CCO", "vendor": "Sigma", "purchasable": True, "activity": None, "safety": None}, {"id": "ZINC0002", "canonical_smiles": "CCN", "vendor": "TCI", "purchasable": True, "activity": None, "safety": None}, {"id": "ZINC0003", "canonical_smiles": "c1ccccc1", "vendor": "Alfa", "purchasable": False, "activity": None, "safety": None}, ] chembl = [ {"id": "CHEMBL1", "canonical_smiles": "CCO", "vendor": None, "purchasable": None, "activity": -3.2, "safety": "ok"}, {"id": "CHEMBL2", "canonical_smiles": "CCN", "vendor": None, "purchasable": None, "activity": -5.4, "safety": "ok"}, {"id": "CHEMBL3", "canonical_smiles": "O=C(O)C", "vendor": None, "purchasable": None, "activity": None, "safety": "unknown"}, ] pubchem = [ {"id": "PUBCHEM1", "canonical_smiles": "CCO", "vendor": "Sigma", "purchasable": True, "activity": None, "safety": "ok"}, {"id": "PUBCHEM2", "canonical_smiles": "CC=O", "vendor": "TCI", "purchasable": True, "activity": None, "safety": "ok"}, {"id": "PUBCHEM3", "canonical_smiles": "c1ccccc1", "vendor": "Alfa", "purchasable": False, "activity": None, "safety": "unknown"}, ] merged = merge_datasets([zinc, chembl, pubchem]) print("merged_records", len(merged)) print("zinc_score", round(choose_score(zinc), 3)) print("chembl_score", round(choose_score(chembl), 3)) print("pubchem_score", round(choose_score(pubchem), 3))
def merge_datasets(groups):把所有数据源按序遍历,准备合并。key = rec["canonical_smiles"] or rec["id"]优先用规范 SMILES 做主键,实现分子级去重。merged[key] = rec后写入的记录会覆盖同结构旧记录,模拟多源冲突时的优先级处理。return list(merged.values())去重后返回干净记录列表,供后续模型训练使用。def coverage(records, field):统计某个字段的记录覆盖率,是评判数据质量的重要指标。known = [r for r in records if r.get(field) is not None]过滤掉缺失值,只统计有标签的记录。return len(known) / len(records) if records else 0.0防止空列表导致除零错误。def choose_score(records):综合规模和覆盖率给出选型分数。return 0.6 * size_score + 0.4 * average_coverage(records)当前任务更看重标签覆盖,因此覆盖率权重占四成。merged = merge_datasets([zinc, chembl, pubchem])执行三库合并,得到最终训练集雏形。
常见误区
误区我以为 ZINC 是公开数据集,里面有很多分子,应该可以直接拿来做活性预测训练,下载之后才发现根本没有 IC50 这类标签。
正解ZINC 的核心标签是“可购买性”与供应商,而不是生物活性。它更像样品超市,货架上不会写“这个药对什么病有效”。活性标签应优先来自 ChEMBL,或通过实验、公开文献补充。
为何常见:初学者看到 ZINC 规模很大、又是分子数据集,容易默认所有分子数据集都带活性标签,忽略了不同数据集的立馆之本。
误区PubChem 最大的好处是数量多,模型训练应该“数据越多越好”,所以我直接把 PubChem 全部下载下来训练。
正解PubChem 是多源聚合平台,不同子库的字段含义、质量控制都不一致,还存在大量重复与半结构化信息。未经清洗直接训练,可能让模型学到噪声而不是化学规律。
为何常见:在普通机器学习中,数据量常被视为重要优势,这让人忽略了生物数据更依赖标注一致性和质量。
误区两座馆里都写了 IC50,训练前我直接把数值合并,反正都是活性值。
正解IC50 会因实验方法、单位、重复次数、细胞环境不同而不可直接比较。正确做法是先统一单位,记录实验类型,必要时做标准化,或者以 ChEMBL 的保守人工整理值为主。
为何常见:字段名相同就以为是同一种语义,这是跨库数据融合最常见的天真假设。
误区申请 ZINC 账号下载数据没花钱,ChEMBL 也是开放的,那我用它训练商用模型应该没问题。
正解免费下载不等于可任意商用。ChEMBL 采用 CC BY-SA,需要遵循署名和相同方式共享条款;ZINC 有明确的使用条款;PubChem 的子库许可也各不相同。商用前必须做许可审计。
为何常见:国内团队容易混淆“公开可得”和“公共领域”,忽略了数据使用许可与最终产品分发方式之间的法律关联。
误区两个分子只要 SMILES 字符串长得一样就是同一个分子,所以我用 Python 的集合去重就够了。
正解同一分子可能有多种合法 SMILES 写法,必须先用 RDKit 等工具转成规范 SMILES 或计算分子指纹,再做去重和相似度判断。否则大量同分异构体或等价表示会被当成不同分子。
为何常见:SMILES 看起来像字符串,掩盖了它作为化学图编码的复杂性,导致数据工程师用普通文本处理方式去重。
面试题
Q1. ZINC 数据集最核心的定位是什么?
- A.商业可购买化合物目录← 正确答案
- B.文献活性值档案
- C.多源公共数据平台
- D.分子生成模型库
答案:A。ZINC 的核心是可购买化合物目录,解决“从哪里买”的问题;活性、多源、模型库分别是 ChEMBL、PubChem 和生成模型的任务。
Q2. ChEMBL 最突出的数据特点是?
- A.商业采购和供应商信息
- B.生物活性实验数值← 正确答案
- C.多源异构数据聚合
- D.分子三维坐标文件
答案:B。ChEMBL 由专家从文献中整理活性实验值,如 IC50 和靶点关系,是训练活性预测模型的重要标签来源。
Q3. PubChem 的数据来源主要特征是?
- A.单一厂商独家供给
- B.只收录人工实验资料
- C.多来源整合汇聚← 正确答案
- D.仅提供分子图片
答案:C。PubChem 是典型的多源聚合平台,来自全球很多机构,因此数据量庞大但需要清洗去重。
Q4. 关于三大数据集许可与更新,下列说法正确的是?
- A.ZINC 以可购买目录见长
- B.ChEMBL 采用 CC BY-SA← 正确答案
- C.PubChem 只来自美国机构
- D.三者均不允许下载
答案:B。ChEMBL 采用开放且带署名要求的 CC BY-SA 许可;A 说的是定位,C 说法错误,D 与实际不符。
Q5. 使用 ZINC 做虚拟筛选时,最应优先关注哪个字段?
- A.供应商和可购买性← 正确答案
- B.半抑制浓度 IC50
- C.化合物在研专利
- D.二维结构图片
答案:A。ZINC 是样品超市,核心优势是货源信息;IC50 需要到 ChEMBL 去找,专利和图片不是 ZINC 的主打标签。
Q6. 为什么 PubChem 不能直接替代 ChEMBL 训练活性模型?
- A.数据量太少无法训练
- B.来源混杂且字段不统一← 正确答案
- C.全部都是付费数据
- D.只有蛋白质结构数据
答案:B。PubChem 聚合多个子库,字段口径差异大,需要大量清洗;它适合检索,但活性标签的规范性不如 ChEMBL。
Q7. 三库融合时,同一个分子出现不同活性记录,首选处理方式是?
- A.随机保留其中任意一条
- B.优先高可信来源并记录出处← 正确答案
- C.三份记录全部删除
- D.不做处理直接合并
答案:B。数据融合要保持可追溯性。随机保留会引入噪声,全部删除浪费信息,直接合并会传染冲突,因此应优先参考规范来源并保留出处。
Q8. 以下哪些属于分子性质数据集中常见的标注类型?
- A.活性浓度 IC50← 正确答案
- B.脂水分配 LogP← 正确答案
- C.供应商报价单
- D.靶点名称注释← 正确答案
答案:ABD。IC50、LogP、靶点名称都是描述分子性质或生物注释的字段;供应商报价属于商业元数据,不属于分子性质标注。
Q9. 在 ZINC、ChEMBL、PubChem 之间做选型时,需要重点考察哪些维度?
- A.数据规模与覆盖范围← 正确答案
- B.标注质量与数据口径← 正确答案
- C.许可协议与更新机制← 正确答案
- D.页面配色与官网布局
答案:ABC。数据规模决定覆盖度,标注质量决定模型上限,许可与更新决定能否商用和维护成本;页面配色只是 UI 问题,不影响选型。
Q10. 关于 PubChem 的使用,下列说法正确的有哪些?
- A.聚合了多种子数据库← 正确答案
- B.子库许可可能不同← 正确答案
- C.所有字段都人工审核
- D.PUG 接口可程序化检索← 正确答案
答案:ABD。PubChem 是多源聚合平台,各子库许可不同,且提供 PUG 接口便于程序化访问;但并非所有字段都经过人工审核,很多数据来自自动上传。