3. 药物分子数据工程

药物分子生成模型的上限,往往不由网络结构决定,而由训练数据的质量与一致性决定。ChEMBL、ZINC、PubChem 三个数据源在生成任务中扮演不同角色:ChEMBL 提供带活性标签的“有监督信号”,ZINC 提供大规模“类药性化学空间”,PubChem 提供广覆盖的化合物与生物测定记录。本节围绕“接入—清洗—标准化—标签对齐—划分”这条数据管线展开,重点讲清每一步的实际操作对象与判断依据。

一、三类数据源的定位与接入方式

ChEMBL 以 activities、molecule_dictionary、assays 等表组织数据,核心字段包括 canonical_smiles、standard_type(如 IC50、Ki、EC50)、standard_value、standard_units、pChEMBL_value 与 target_chembl_id。接入时通常按靶点或按活性类型筛选,例如只取 standard_type='IC50' 且 standard_units='nM' 的记录。ZINC 以 smiles、zinc_id、purchasability、logP、MW 等字段提供可购买或已生成分子,适合做预训练或无标签微调。PubChem 通过 PUG-REST 或 FTP 获取 CID、CanonicalSMILES、IsomericSMILES 及 BioAssay 结果,适合补充活性覆盖与结构多样性。

接入阶段的关键不是“下载多少”,而是“保留哪些字段”。建议统一落成一张中间表,字段至少包含:source、source_id、smiles_raw、target_id、activity_type、activity_value、activity_unit、assay_id。这样后续清洗与对齐才有统一入口。

二、清洗、去重与标准化

原始 SMILES 常含盐、溶剂、同位素、立体信息缺失或互变异构体不一致等问题。清洗顺序建议为:去盐 → 去溶剂 → 去同位素 → 电荷中和 → 标准化互变异构体 → 生成规范 SMILES。以 RDKit 为例,可用 SaltRemover 去盐,rdMolStandardize 做电荷中和与互变异构标准化,最后用 Chem.MolToSmiles(mol, isomericSmiles=True) 生成规范形式。

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.Cleanup(mol)
    mol = rdMolStandardize.FragmentParent(mol)
    mol = rdMolStandardize.Uncharger().uncharge(mol)
    te = rdMolStandardize.TautomerEnumerator()
    mol = te.Canonicalize(mol)
    return Chem.MolToSmiles(mol, isomericSmiles=True)

去重不能只看字符串。同一分子可能因互变异构、立体写法不同而出现多个 SMILES。工程上通常用“标准化 SMILES + InChIKey 前 14 位(骨架层)”双键去重:先按标准化 SMILES 精确去重,再按 InChIKey 骨架层合并互变异构体。若同一骨架下活性差异极大,应保留多条记录并标注 assay_id,而不是简单取均值。

三、活性与性质标签对齐

活性标签对齐的核心是把不同单位、不同测定类型统一到可比较的尺度。常用做法是将 IC50、Ki、EC50 等转换为 pActivity:pActivity = -log10(value_in_mol/L)。例如 IC50 = 100 nM,即 1e-7 mol/L,pIC50 = 7.0。若单位是 μg/mL,需先用分子量换算为 mol/L。对于“>”“<”等限定符,应单独标记为删失数据,训练时可作为区间约束或直接剔除。

性质标签(logP、MW、TPSA、QED、SA)通常由 RDKit 或类似工具计算,属于确定性标签,可直接与标准化分子对齐。需要警惕的是:不同来源的 logP 可能来自实验或计算,混用时应在字段中区分 logp_source,避免模型学到来源偏差。

多源药物分子数据管线:接入 → 清洗 → 对齐 → 划分 ChEMBL 活性 / 靶点 / assay ZINC 类药性 / 可购买 PubChem CID / BioAssay 统一中间表 source / source_id smiles_raw target_id / assay_id activity_type / value / unit logp_source / properties 字段统一,来源可追溯 清洗与标准化 去盐 / 去溶剂 电荷中和 互变异构标准化 规范 SMILES SMILES + InChIKey 去重 输出:唯一分子集合 标签对齐 单位统一 → mol/L pActivity = -log10 限定符单独标记 性质标签计算 来源字段保留 输出:分子-标签对 训练 / 验证 / 测试划分策略 随机划分 同分布,易高估 骨架划分 Murcko 骨架不重叠 时间/靶点划分 评估外推能力

四、训练集/验证集/测试集划分策略

划分策略直接决定评估结论是否可信。随机划分(如 8:1:1)适合初步调试,但同一骨架的近似物可能同时落入训练与测试,导致指标虚高。更严格的方案是骨架划分:用 Murcko 骨架或 Bemis-Murcko 框架聚类,保证同一骨架只出现在一个子集中。若目标是评估对全新靶点的泛化,应按 target_id 分组划分;若关注时间外推,则按数据入库时间或文献年份切分。

实操中建议同时保留两套划分:一套随机划分用于快速迭代,一套骨架划分用于最终报告。划分前必须完成去重与标准化,否则同一分子可能跨集泄漏。对于活性数据,还需注意同一 assay_id 的记录应整体归入同一子集,避免测定条件泄漏。

建议在数据管线中固定随机种子(如 seed=42),并将划分结果落盘为 split_train.csv、split_val.csv、split_test.csv,保证实验可复现。

五、可执行的数据检查清单

检查项判断标准处理动作
SMILES 可解析率≥ 99%低于阈值时排查来源编码问题
标准化后重复率≤ 1%按 SMILES + InChIKey 骨架去重
活性单位一致性全部为 nM 或 mol/L统一换算,保留原始单位字段
pActivity 范围通常 3~11超出范围记录人工复核
骨架重叠率训练/测试骨架交集 = 0重新按骨架分组划分
assay 泄漏同一 assay 不跨集按 assay_id 分组划分