2.6.1 数据为什么是脏的:来源、重复与四类污染
第 2 章前几节默认输入是一张干净的分子图;真实数据几乎从不干净。建模常用的化合物集并非为机器学习而生:它们从专利权利要求、文献数据表、供应商目录与高通量实验记录里拼合而来,各有各的记录习惯。供应商按"能买到什么"登记,目录里多为可溶的盐形式(salt form);专利按"主张什么"书写,倾向游离碱;文献按原文照录,原作者写哪种就抄哪种;高通量筛选记录的则是孔板里实际加入的样品,常以盐、甚至以混合物形式入库。同一化合物因此以不同面目反复入库:钠盐与游离酸并存、不同质子化状态(protonation state)并存、互变异构体以不同画法并存、立体标注时而明确时而缺失。
问题的实质是等价关系:化学意义上的"同一化合物"是一个等价类,而原始记录不满足这个等价关系——等价的记录长得不一样,不等价的记录有时长得一样。化学数据清洗(chemical data curation)与结构标准化(structure standardization)的任务,就是在建模之前把这个等价关系机械地、可复现地施加到数据上。
污染可以归为四类,见表 2.6-1。前三类是"表示层"的病:分子本身没错,只是写法不统一。第四类是"记录层"的病:结构或标签本身错了——结构张冠李戴(化合物名对应到错误的结构)、活性数值的小数点错位(微摩尔写成纳摩尔,差三个数量级)、单位抄错。表示层的病可以规则化处理;记录层的病没有通用解法,只能靠交叉核对与离群审查发现(Fourches et al., 2010)。
| 污染类型 | 典型表现 | 对建模的威胁 | 常规处置 |
|---|---|---|---|
| 盐与混合物 | 钠盐/盐酸盐与游离形式并存;共溶剂;混合物记录 | 同一分子多次入库,计数、指纹与划分全部失真 | 断盐、片段选择 |
| 价态与电荷异常 | 五价碳、错误的形式电荷、金属配位误写为共价 | sanitize 失败或描述符异常 | 有效性检查、金属处理 |
| 互变异构并存 | 酮式/烯醇式、内酰胺/内酰亚胺以不同构型入库 | 同一分子指纹差异巨大,被当作两个分子 | 互变异构规范化 |
| 记录级错误 | 结构对应错误、活性值小数点错位、单位错误 | 结构—活性错配,标签噪声 | 交叉核对、离群审查 |
2.6.2 标准化流水线:五个阶段及其顺序
清洗不是一堆可以随意排列的开关,而是一条顺序敏感的流水线。推荐顺序如下。
- 阶段 1结构有效性检查:sanitize 全流程(2.1.4)能否通过;不通过者隔离待查,不参与自动修补。
- 阶段 2断盐与片段分离:断开金属—配体连接,按重原子数选择最大片段。
- 阶段 3电荷中和与再电离:能写成中性形式的改为中性形式,不能者保留并记录。
- 阶段 4互变异构规范化:按固定规则集把互变族折叠到一个代表构型。
- 阶段 5官能团规范化与终检:非标准价写法改为标准形式,重跑 sanitize,生成规范化标识符。
阶段 1:有效性检查
第一道关卡承接 2.1.4 的 sanitize:价态计算、环感知、凯库勒化、芳构化逐项通过,图才有资格称为分子。公共数据集中总有一小部分记录连这一关都过不了——五价碳、六价氮、断键悬空的原子。处置原则是隔离而非硬救:解析失败与超价错误各有日志,人工复核后决定删除或改正。自动"修复"一个连价态都不满足的图,等于把错误合法化。
阶段 2:断盐与片段分离
盐在 SMILES 里表现为多个不相连的片段(2.2 节的圆点记法),如乙酰水杨酸钠写作酸根阴离子与 [Na+] 两段。断盐(salt stripping)先断开金属与配体之间的离子型连接,再按重原子数保留最大片段(largest fragment),丢弃反离子。这个默认有明确的化学依据:生物活性通常由游离形式(free form)贡献——测定环境下钠盐、盐酸盐迅速解离,到达靶点的物种是游离酸或游离碱,反离子只是陪伴。但"通常"不等于"总是",适用边界见下方警示框。
"最大片段"默认的适用边界。三类场景会出错。其一,共晶与复方:两个活性成分以固定比例共存,丢弃任何一个都改变了被测对象。其二,前药(prodrug)与活性代谢物:前药本身就是完整分子,"保留最大片段"无碍,但把前药记录与母体记录清洗后合并是错的——它们是不同物种,活性含义不同。其三,金属药物:顺铂的活性恰恰依赖铂中心,金属断开步骤会把 Pt–N 键拆掉,得到一个毫无意义的碎片。遇到这三类数据,流水线必须显式豁免,并写入清洗报告。
阶段 3:电荷中和
反离子丢掉之后,酸根还带着负电。中和步骤按固定规则再质子化:羧酸根改回羧酸,胺盐改回游离胺。有些电荷无法中和——季铵盐的第四个取代基不是质子,去掉就不再是原分子;这类记录保留原电荷并在报告中登记。还要交代一个局限:测定环境有特定 pH,分子在溶液里的优势电离形态未必是中性形式;中和是"表示约定",不是物理断言。约定无害,只要全数据集用同一条约定。
阶段 4:互变异构规范化
互变异构体(tautomer)。同一分子的两个异构体之间仅差一个原子(通常是氢)的位置与相应电子对的迁移,能在溶液中快速互相转化、共存于平衡之中,如酮式与烯醇式、内酰胺与内酰亚胺。互变异构体不同于共振结构:前者是真实共存的不同分子物种,后者只是同一种电子离域的两种画法。
互变异构对指纹是灾难。摩根指纹(2.5 节)以原子邻域为哈希输入,氢从氧迁到氮,元素标签与键级全变,哈希值随之全变。于是"同一分子"的两条记录相似度骤降,2.5 节的近重复检测完全失效。图 2.6-2 的 2-羟基吡啶/2-吡啶酮对是教科书案例:互变比例随溶剂极性移动,非极性环境偏向羟基式,极性环境偏向酮式(Sitzmann et al., 2010)。互变异构规范化(tautomer canonicalization)的思路是枚举互变族,再按固定规则集选一个代表构型,全族折叠到代表上。但"哪个代表"没有普适答案:优势互变体取决于 pH、溶剂与靶点结合环境,数据库之间也各行其是——Sitzmann 等人对逾亿条记录的分析显示,三分之二以上的独特结构可能存在互变异构,各库登记的构型并不一致(Sitzmann et al., 2010)。规范化选的是"一致",不是"正确";对 pH 敏感的建模任务,有时应保留整族或显式建模电离态。
阶段 5:官能团规范化
同一官能团常有多种合法却互异的写法:硝基可写成五价的 N(=O)=O,也可写成电荷分离的 [N+](=O)[O-];重氮、亚砜、胍都有类似的双写法。官能团规范化(functional group normalization)用一组模式改写规则把非标准价写法统一为标准形式,机理上是一族受限的"模式匹配—改写"变换:匹配到非标准子结构,替换为标准子结构,原子数与总电荷不变。两个动机:其一,五价氮写法在部分价规则下过不了 sanitize;其二,即使都能通过,两种写法的指纹与描述符也不同,等于人为制造了近重复。改写完必须重跑 sanitize——改写规则也是会出错的代码。
顺序为什么不能乱。断盐必须先于中和:反离子在场时"中性形式"无从定义,电荷账目也平不了。中和必须先于互变异构规范化:互变规则集定义在中性官能团上,烯醇负离子不在规则覆盖之内,先规范化再中和会把整族折叠到错误代表。官能团规范化必须作用于已断盐的单分子:否则模式改写会毫无意义地作用于柠檬酸根之类的大块反离子上。每一步都以前一步的输出为前提,这正是流水线的含义。图 2.6-1 以一条盐记录与一条游离酸记录走完全程为例。
2.6.3 清洗的传导效应:从指纹到划分与评估
不清洗的代价沿着建模链条向下传导。第一站是指纹比较。同一路径的盐形式与游离形式,摩根指纹(半径 2、2048 位)的 Tanimoto 相似度典型只有 0.6 上下——具体数值随设置浮动,但量级稳定:远低于"同一分子"应有的 1.0,也低于多数近重复阈值。原因可以数出来:盐记录多出的钠原子贡献自己的环形哈希位,被夺走质子的羧酸氧改变了整片邻域的哈希,共享的骨架位再被稀释一轮。定性地说,"同一分子"在未清洗数据里表现为"中等相似的另一个分子"。
from rdkit import Chem
from rdkit.Chem import AllChem, DataStructs
salt = Chem.MolFromSmiles("CC(=O)Oc1ccccc1C(=O)[O-].[Na+]") # 记录 A:钠盐
free = Chem.MolFromSmiles("CC(=O)Oc1ccccc1C(=O)O") # 记录 B:游离酸
fp = lambda m: AllChem.GetMorganFingerprintAsBitVect(m, 2)
print(DataStructs.TanimotoSimilarity(fp(salt), fp(free))) # 约 0.6,而非 1.0
print(salt.GetNumAtoms(), free.GetNumAtoms()) # 14 对 13:计数混入 Na
第二站是数据划分。1.3 节的骨架划分(scaffold split)以"测试集含训练集未见过的骨架"为目标;同一分子的盐形式与游离形式恰好共享骨架,两条记录分居训练集与测试集时,模型答对的与其说是泛化,不如说是认出了熟人。3.8 节的评估因此被系统性抬高。设某化合物在原始表中有 k 条记录,训练集比例为 q,则至少一条进训练集、至少一条进测试集的概率为
第三站是标签表本身。同一化合物常被多次测定:不同实验室、不同批次、不同年代。清洗后按标准化结构分组,组内多条活性取中位数:
清洗的直接后果可以一眼核对:唯一标识符数下降。标准化是确定性映射,原始记录集合经映射后像集的基数不大于原像集——重复被折叠,计数只减不增。
from rdkit.Chem import Chem
from rdkit.Chem.MolStandardize import rdMolStandardize
def key(smiles): # 固定一条流水线:断盐·中和·规范化
s = rdMolStandardize.StandardizeSmiles(smiles)
return Chem.MolToInchiKey(Chem.MolFromSmiles(s))
a = key("CC(=O)Oc1ccccc1C(=O)[O-].[Na+]") # 盐记录
b = key("CC(=O)Oc1ccccc1C(=O)O") # 游离酸记录
print(a == b) # True:唯一 InChIKey 计数由 2 降为 1
习题 2.6-1
某活性数据集有 100 000 条记录,其中约 2% 是"盐形式重复"——某化合物已有一条游离形式记录,又以钠盐形式再入库一条,即约有 2 000 个化合物各占 2 条记录。随机按 80/20 划分训练/测试集且不去重。(1) 用式 (2.6-1) 估计因盐形式重复而跨集的化合物数期望。(2) 这占 20 000 条测试集记录的多少?由此说明清洗对 3.8 节评估的意义。
参考解答(1) 每个此类化合物 k=2、q=0.8:P = 1 − 0.64 − 0.04 = 0.32,跨集化合物期望 2 000 × 0.32 = 640 个。(2) 每个跨集化合物恰有一条测试记录的"孪生"在训练集,受影响测试记录约 640 条,占测试集 3.2%。这 3.2% 的记录上模型只需"认出熟人"即可答对,指标被抬高;若模型在此类记录上的优势足够大,报告的整体性能差距可能主要来自泄漏而非泛化。先清洗去重再划分,才能让测试集考察真正的结构泛化。
2.6.4 质量审查的实证警示:Trust, but Verify
"清洗很重要"不是修辞,而是被反复量化过的事实。Fourches、Muratov 与 Tropsha 系统审查了公共数据库中的建模数据集,发现无效结构、重复记录(常以不同盐形式与互变异构形式出现)、价态异常与不一致记录在各数据集中占去了不可忽略的份额;他们对数据逐一清洗、重建 QSAR 模型后对比:清洗前后模型的测试集表现出现实质差异,残留错误仍继续压低模型质量。结论浓缩为一句格言——Trust, but verify:数据库可以省去从头测定的成本,但直接拿来建模必须先审查(Fourches et al., 2010)。该工作随后扩展为化学基因组数据清洗的实用指南(Fourches et al., 2016)。
清洗前后模型性能的实证差异。Fourches 等人 2010 年的研究流程可概括为四步:汇集公共数据集,逐条审查结构(有效性、盐与片段、互变异构、立体标注),删除或改正问题记录,再用清洗前后的数据分别训练模型并留出外部测试集验证。多个数据集上,清洗后的模型给出的预测更稳定、排序更一致;残留的错误记录即使数量不大,也会以离群点身份扭曲回归。同年 Sitzmann 等人对 24 个数据库、逾亿条记录的互变异构分析从另一个侧面印证了表示层问题的规模:三分之二以上的独特结构存在互变异构的可能,各库登记构型并不一致。
这一支文献也重塑了 QSAR 的方法论规范。Tropsha、Gramatica 与 Gombar 的纲领性论文指出:没有严格验证的构效模型无论拟合多好都不可信——内部交叉验证只是下限,外部测试集验证与 y 随机化对照(打乱标签重训,性能应坍缩到随机水平)才是必要条件(Tropsha et al., 2003)。数据清洗与严格验证是一枚硬币的两面:清洗定义了"模型看到的分子",验证定义了"模型可信的边界",两者共同构成 QSAR 验证规范的地基。
2.6.5 流程纪律:固定的规则、入库的脚本与被丢弃者的清单
清洗本身也是代码,也会出错,也在演化。三个纪律由此而来。第一,规则固定并记录版本:断盐阈值、互变规则集、官能团改写表、中和策略,全部写死在配置里,随代码版本管理;工具版本同样要记录——RDKit 的规范化行为跨版本偶有调整,同样的原始数据配不同版本的清洗代码,会得到不同的标准化集。5.2 节会看到,缺少这份版本对应关系,复现就从第一天开始崩塌。第二,清洗脚本与原始数据一起入库:只发布清洗后的数据而不发布清洗规则,他人既无法复现也无法审计;只发布规则而不留原始数据,丢弃了多少分子永远说不清。第三,报告被丢弃者:一份合格的清洗报告至少包含输入记录数、各阶段丢弃或修改的记录数与原因分类(解析失败、超价、多片段、金属断开、互变折叠、重复折叠)、输出唯一分子数,以及规则与工具版本。被丢弃的分子不是噪音,而是数据质量的第一手证据。
2.6.6 与 InChI 的关系:跨库对齐的标准层
清洗流水线为建模准备分子;跨数据库对账还需要一个独立于任何建模工具的标识符。InChI 在生成时自带一层标准化(Heller et al., 2015): perceived 互变异构被归入"移动氢"处理,质子数差异计入质子化层而不进入连接层。于是 InChIKey 的第一块——连接层哈希——成为跨库对齐的实用工具:盐形式与游离形式的连接层一致,两库记录即可判为同一化合物,图 2.6-1 的折叠正由这一性质支撑。2.2 节讨论过各家 canonical SMILES 互不相认;InChIKey 把"同一分子"压缩成十四个字符,库与库之间的对账才有了共同语言。
但 InChI 的标准层同样是一组选择,不是唯一真理。移动氢的合并范围有既定规则,也有 FixedH 等非标准选项保留特定互变异构;对 pH 敏感的对齐任务,连接层一致可能掩盖应当区分的物种。结论与 2.6.2 一致:标准化永远在"一致"与"保真"之间取舍,关键是选定一套规则、写明版本、贯彻到底。下一节转向另一类"不唯一"——化学反应的表示。
习题 2.6-2
判断下列记录对清洗后应否合并为同一化合物,并说明理由。(a) 盐酸苯海拉明与苯海拉明游离碱,同一靶点同批测定。(b) 某前药与其活性代谢物,两者均有独立测定的活性记录。(c) (R)-构型与 (S)-构型的同一分子,分别测定。(d) 同一化合物按酮式与烯醇式登记的两条记录,同批次测定。
参考解答(a) 合并。断盐后两者为同一游离碱,反离子不进入生物活性。(b) 不合并。前药与代谢物是不同物种,活性含义不同(吸收、首过转化都不同),结构清洗无权把不同化合物折叠为一个。(c) 不合并。两者立体构型不同,InChIKey 立体层不同,药理活性可差数量级;合并的前提是连接层与立体层都一致。(d) 合并。互变异构规范化把全族折叠到同一代表构型,同批测定的两条记录指向同一平衡体系。若两记录来自 pH 差异很大的测定体系且活性相差悬殊,应先核查测定方案——那可能是两个实验条件下的不同平衡组成,须谨慎处理而非机械合并。
习题 2.6-3
推证:设标准化流水线是原始记录集合 R 到标识符集合的确定性函数 f(同一条记录永远得到同一标识符)。证明清洗后数据集的唯一标识符数不超过清洗前去除解析失败后的唯一记录数,并给出取等条件。
参考解答记 R′ 为通过解析的记录集合,f: R′ → I 为确定性映射。像集 f(R′) 的基数恒满足 |f(R′)| ≤ |R′|(函数的像不大于定义域;不同记录可映射到同一标识符,反之不能)。唯一标识符数即 |f(R′)|,唯一记录数即 |R′|,故前者不超过后者。取等当且仅当 f 在 R′ 上是单射:任何两条记录都不落入同一标准化等价类——无盐形式重复、无互变异构重复、无官能团双写法重复。实践中该差值本身就是清洗报告的核心数字:|R′| − |f(R′)| 就是因表示层污染被折叠掉的记录条数。
关键术语
- 化学数据清洗 (chemical data curation)
- 建模前对结构记录逐条审查、纠错与统一表示的工序,模型可靠性的前置条件。
- 结构标准化 (structure standardization)
- 用固定规则集把同一化合物的多种写法映射到唯一标准形式的确定性过程。
- 断盐 (salt stripping)
- 断开金属—配体离子连接并丢弃反离子、保留有机主片段的清洗步骤。
- 最大片段 (largest fragment)
- 按重原子数选取的片段选择默认;依据是生物活性通常由游离形式贡献。
- 互变异构体 (tautomer)
- 仅差氢的位置与电子对迁移、在溶液中平衡共存的异构体,不同于共振结构。
- 互变异构规范化 (tautomer canonicalization)
- 枚举互变族并按固定规则折叠到一个代表构型的操作;选的是一致而非正解。
- 官能团规范化 (functional group normalization)
- 把硝基、重氮等官能团的非标准价写法改写为标准形式的模式变换。
- 近重复 (near-duplicate)
- 原始形式不同、标准化后相同的记录;未清洗时会污染指纹阈值与数据划分。
- 数据泄漏 (data leakage)
- 测试集信息以重复或近重复形式进入训练,使评估指标虚高的现象。
- InChIKey (hashed InChI)
- InChI 的分层哈希标识;连接层一致是跨数据库判别同一化合物的实用判据。
参考文献与延伸阅读
- Fourches D, Muratov E, Tropsha A. 2010. Trust, but verify: on the importance of chemical structure curation in cheminformatics and QSAR modeling research. Journal of Chemical Information and Modeling 50:1189–1204.
- Fourches D, Muratov E, Tropsha A. 2016. Trust, but verify II: a practical guide to chemogenomics data curation. Journal of Chemical Information and Modeling 56:1243–1252.
- Tropsha A, Gramatica P, Gombar VK. 2003. The importance of being earnest: validation is the absolute essential for successful application and interpretation of QSPR models. QSAR & Combinatorial Science 22:69–77.
- Sitzmann M, Ihlenfeldt W-D, Nicklaus MC. 2010. Tautomerism in large databases. Journal of Computer-Aided Molecular Design 24:521–551.
- Heller SR, McNaught A, Pletnev I, et al. 2015. InChI, the IUPAC International Chemical Identifier. Journal of Cheminformatics 7:23.
- Landrum G, et al. 2026. RDKit Documentation: Standardization(MolStandardize)与 Cookbook 相关章节. RDKit 2026.03 系列.