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,避免模型学到来源偏差。
四、训练集/验证集/测试集划分策略
划分策略直接决定评估结论是否可信。随机划分(如 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 分组划分 |