2. 药物分子数据获取与整理

分子性质预测模型的上限,几乎在数据准备阶段就已经被决定。一个常见的误区是:先选模型、调超参,最后才处理数据。而在实际工程中,数据来源的可靠性、覆盖范围、标签定义一致性,往往比模型结构更能左右最终预测性能。本节围绕“从哪里拿数据、拿到后怎么整理成可建模的形态”展开,重点讲清三类来源的取舍逻辑,以及清洗与标准化的具体做法。

三类数据来源及其取舍

公开数据库是起步阶段的主力。ChEMBL 以人工抽取的文献活性数据为核心,每条记录带有靶点、活性类型(IC50、Ki、EC50 等)、单位与测定条件,适合构建靶点相关的活性预测任务;PubChem 覆盖化合物结构与生物测定结果,规模大但噪声相对更高;DrugBank 侧重已上市与在研药物的药代、靶点与相互作用信息;BindingDB 专注蛋白-小分子结合亲和力;PDBbind 则提供共晶结构衍生的结合数据,适合结构与亲和力联合建模。使用公开库时,务必记录数据快照日期与版本号,因为同一靶点的记录会随版本更新而变化,不记录版本会导致实验无法复现。

文献数据的价值在于补充公开库未收录的活性值、特殊测定条件或新骨架。从文献中抽取数据时,需要同时抓取“数值 + 单位 + 活性类型 + 靶点 + 测定方法 + 细胞系/缓冲条件”。同一化合物在不同实验条件下测得的 IC50 可能相差一个数量级,若不加区分地合并,会直接污染标签分布。

实验数据通常来自内部湿实验,标签质量最高,但规模小、批次效应明显。不同批次、不同操作者、不同仪器测得的同一化合物活性可能存在系统偏差,建模前应做批次校正或至少将批次作为协变量记录。

药物分子数据获取与整理流程 公开数据库 ChEMBL / PubChem DrugBank / BindingDB PDBbind 记录版本号与快照日期 文献数据 数值 + 单位 + 活性类型 靶点 + 测定方法 细胞系 / 缓冲条件 条件不一致不可直接合并 实验数据 标签质量最高 规模小、批次效应明显 需记录批次与操作者 建议做批次校正 数据清洗与标准化 ① 去重与冲突消解:同一化合物-靶点多条记录取中位数或按条件分层 ② 单位统一:nM / μM / pIC50 换算,活性类型对齐 ③ 结构标准化:去盐、中和电荷、互变异构体规范化 ④ 异常值处理:超出合理范围或与同类偏差过大的记录标记复核 建模就绪数据集 统一 SMILES + 标准化标签 + 来源追溯字段 train / valid / test 按骨架或时间划分 关键检查点 标签分布是否偏斜 重复结构是否残留 单位是否全部统一 来源字段是否完整

数据清洗:从原始记录到可用标签

清洗的第一步是去重与冲突消解。同一化合物对同一靶点常有多条记录,来源不同、条件不同。工程上通常按“化合物-靶点-活性类型”分组,若组内记录数较少且条件一致,取中位数作为标签;若条件差异大(如不同细胞系),则保留条件字段并分层建模,而不是强行合并。示例:某化合物对 EGFR 的 IC50 在三条记录中分别为 12 nM、15 nM、480 nM,前两条接近,第三条可能来自不同突变型或不同实验体系,应标记复核而非直接取均值。

第二步是单位与活性类型统一。常见活性类型包括 IC50、Ki、Kd、EC50,单位有 nM、μM、mg/mL。建模前统一换算为同一量纲,通常转为 pIC50 = 9 − log10(IC50[M]),使数值分布更接近正态,也便于跨靶点比较。注意:IC50 与 Ki 不可混用,若必须合并,应明确标注并作为特征而非直接等同。

第三步是结构标准化。同一分子可能以盐形式、不同互变异构体或不同电荷状态出现。标准做法包括:去盐保留母体结构、中和可电离基团、规范化互变异构体、统一芳香环表示。RDKit 提供了较完整的处理链,示例代码如下:

from rdkit import Chem
from rdkit.Chem.MolStandardize import rdMolStandardize

def standardize(smiles):
    mol = Chem.MolFromSmiles(smiles)
    if mol is None:
        return None
    mol = rdMolStandardize.FragmentParent(mol)      # 去盐
    mol = rdMolStandardize.Uncharger().uncharge(mol) # 中和电荷
    mol = rdMolStandardize.TautomerEnumerator().Canonicalize(mol)  # 互变异构规范化
    return Chem.MolToSmiles(mol, isomericSmiles=True)

# 示例
print(standardize("CC(=O)[O-].[Na+]"))  # 输出 CC(=O)O

第四步是异常值处理。活性值常跨越多个数量级,需设定合理范围(如 pIC50 在 3~12 之间),超出范围的记录应回查原始来源。此外,若某化合物与同类结构活性偏差超过 2 个对数单位,也应标记复核,避免录入错误或条件误标。

标准化后的数据集组织

清洗完成后,数据集至少应包含以下字段:标准化 SMILES、标准化标签值、活性类型、靶点标识、来源数据库或文献编号、原始数值与单位、批次或条件备注。这些字段不仅用于建模,也用于后续误差分析与可追溯性审计。数据划分建议按骨架(scaffold split)或时间划分,而非随机划分,因为随机划分会因相似结构同时出现在训练与测试集中而高估性能。

实践建议:在数据整理阶段就建立一份“数据字典”,记录每个字段的含义、单位、允许范围与缺失处理方式。这份字典在多人协作和模型复现时能显著降低沟通成本。
常见陷阱:直接合并不同来源的 IC50 数据而不区分测定条件,会导致标签噪声被模型当作真实信号学习,表现为训练集表现良好但外部验证集性能骤降。遇到这种情况,应回到数据层排查条件字段是否被正确保留。

总体而言,数据获取与整理不是建模前的“准备工作”,而是建模工程的核心组成部分。来源选择决定了数据的天花板,清洗与标准化决定了模型能否稳定逼近这个天花板。把版本、条件、单位、结构四类信息管清楚,后续的特征工程与模型训练才有可靠的基础。