2. 药物分子数据获取与整理
分子性质预测模型的上限,几乎在数据准备阶段就已经被决定。一个常见的误区是:先选模型、调超参,最后才处理数据。而在实际工程中,数据来源的可靠性、覆盖范围、标签定义一致性,往往比模型结构更能左右最终预测性能。本节围绕“从哪里拿数据、拿到后怎么整理成可建模的形态”展开,重点讲清三类来源的取舍逻辑,以及清洗与标准化的具体做法。
三类数据来源及其取舍
公开数据库是起步阶段的主力。ChEMBL 以人工抽取的文献活性数据为核心,每条记录带有靶点、活性类型(IC50、Ki、EC50 等)、单位与测定条件,适合构建靶点相关的活性预测任务;PubChem 覆盖化合物结构与生物测定结果,规模大但噪声相对更高;DrugBank 侧重已上市与在研药物的药代、靶点与相互作用信息;BindingDB 专注蛋白-小分子结合亲和力;PDBbind 则提供共晶结构衍生的结合数据,适合结构与亲和力联合建模。使用公开库时,务必记录数据快照日期与版本号,因为同一靶点的记录会随版本更新而变化,不记录版本会导致实验无法复现。
文献数据的价值在于补充公开库未收录的活性值、特殊测定条件或新骨架。从文献中抽取数据时,需要同时抓取“数值 + 单位 + 活性类型 + 靶点 + 测定方法 + 细胞系/缓冲条件”。同一化合物在不同实验条件下测得的 IC50 可能相差一个数量级,若不加区分地合并,会直接污染标签分布。
实验数据通常来自内部湿实验,标签质量最高,但规模小、批次效应明显。不同批次、不同操作者、不同仪器测得的同一化合物活性可能存在系统偏差,建模前应做批次校正或至少将批次作为协变量记录。
数据清洗:从原始记录到可用标签
清洗的第一步是去重与冲突消解。同一化合物对同一靶点常有多条记录,来源不同、条件不同。工程上通常按“化合物-靶点-活性类型”分组,若组内记录数较少且条件一致,取中位数作为标签;若条件差异大(如不同细胞系),则保留条件字段并分层建模,而不是强行合并。示例:某化合物对 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)或时间划分,而非随机划分,因为随机划分会因相似结构同时出现在训练与测试集中而高估性能。
总体而言,数据获取与整理不是建模前的“准备工作”,而是建模工程的核心组成部分。来源选择决定了数据的天花板,清洗与标准化决定了模型能否稳定逼近这个天花板。把版本、条件、单位、结构四类信息管清楚,后续的特征工程与模型训练才有可靠的基础。