化学数据结构与分子表示

在QSAR建模这条路上摸爬滚打这么多年,我最大的感触是:数据的准备决定了模型的上限。简单说,如果分子的表示方式搞错了,后面那些花里胡哨的算法再厉害也没用。作为一名质控策略专家,我得先跟大家聊聊这些“底子活”。

化学结构和分子表示,说白了就是如何让计算机“看懂”一个分子。你得保证三件事:第一,分子结构数据本身得正确;第二,表示方式得统一;第三,特征提取得稳定。能做到这三点,后面的质控才能有据可依。

QSAR质控第一原则:入口数据不干净,下游分析都是白费。质量控制必须从结构数据的清洗开始,而不是等模型做出来再去查问题。

2.1 分子结构数据文件

我刚开始做项目时,经常遇到不同同事给的分子格式五花八门。有人发SDF,有人发MOL,还有人直接把SMILES贴在Excel里。嗯,光统一格式就花了我三天时间。

常见的分子结构格式有这些:

格式 特点 适用场景
SDF 可包含多个分子,支持字段属性 批量化合物库、高通量筛选数据
MOL 单个分子,结构信息完整 单一化合物、中间产物
SMILES 文本表示,轻量易保存 数据库存储、网页搜索
InChI 标准国际化标识符 跨平台数据交换、专利检索

我个人习惯用SDF作为主流存储格式,因为它可以把活性数值、物化参数直接写进数据字段。这样在批处理时,结构信息和标签数据就捆绑在一起,不容易丢。

避坑指南:我曾经遇到过那种“空结构”的SDF文件——看着有记录,但分子根本没画。检查方法很简单:用RDKit读取所有分子,统计一下None值比例。超过5%,赶紧回源头处理。

2.2 分子指纹

把分子结构变成计算机能算的数字向量,这就是分子指纹的事。你想想看,一个分子有几十个原子、上百个键,怎么用一串0和1代表它?

最常用的几类指纹:

  • MACCS键指纹:166位预定义子结构,适合毒性、成药性筛选。优点:稳定、可解释性强。缺点:分辨率低。
  • ECFP4(圆形指纹):基于Morgan算法,从每个原子出发扩展半径2圈。优势:能捕获局部化学环境,适合活性预测。
  • 扩展连接性指纹:以每个重原子为中心,提取半径1-3范围内的拓扑特征。用在大数据集上效果不错。

我在项目中遇到过一个典型问题:用MACCS指纹训练A数据集的模型效果很好,但移植到B数据集就崩了。怎么回事?后来发现,B数据集里有一批含氟化合物,MACCS指纹并没有对应的子结构位点。说白了,指纹的“字典”太窄了,装不下新知识点。

重要提示:用RDKit生成MACCS指纹时,默认配置是166位子结构。但不同版本的RDKit对子结构的定义有细微差异。如果你在不同环境重复建模,一定要固定软件版本,否则指纹位点会“漂移”。

生成指纹的代码示例:

from rdkit import Chem
from rdkit.Chem import MACCSkeys, AllChem

# 读取分子
mol = Chem.MolFromSmiles("CC(=O)OC1=CC=CC=C1C(=O)O")

# 生成MACCS指纹 (166位)
maccs_fp = MACCSkeys.GenMACCSKeys(mol)

# 生成ECFP4指纹 (1024位)
ecfp4_fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=1024)

print("MACCS位长:", len(maccs_fp))
print("ECFP4位长:", len(ecfp4_fp))

2.3 物理化学描述符

除了指纹这种二维结构特征,我们还会用到物理化学描述符。这类特征能直接反映分子的物化性质,比如:

描述符类别 常见例子 质控要点
分子量 MW 计算值与理论值核对
脂水分配系数 LogP 不同计算方法差异大,保持一致
氢键供体/受体 HBD, HBA 注意互变异构体的计数
拓扑极性表面积 TPSA 对溶剂可及性敏感

这里有个坑:LogP的计算方法太多了。我记得有一次,我把实验值LogP和用RDKit计算的LogP直接混在一起做PCA分析,结果发现数据分布完全错位。后来才意识到,RDKit的LogP是野生估算值,跟实验测定值根本不是一个量纲。

实践建议:统计计算描述符时,建议把所有分子的描述符合并成一个矩阵,再检查缺失值。缺失比例超过10%的描述符,我一般会直接剔除。否则后期模型解释性会变得很玄学。

2.4 从结构到特征向量的标准化流程

有了上面的几类分子表示方法,下一步就是建立标准化的特征提取流程。这是我总结的“四步法”:

  1. 结构归一化:统一加氢、去溶剂、标准芳香性。
  2. 格式统一:一律转成SDF或标准SMILES,删除非法记录。
  3. 特征生成:同一批次用相同参数生成指纹和描述符。
  4. 格式校验:检查矩阵维度、是否出现全零行(指纹)或NaN值。

小技巧:我在做批处理时,喜欢写一个检查函数,对每个分子跑一遍“结构是否完整 → 指纹是否生成 → 描述符是否有效”的验证。如果某个分子在任何一步失败,我都把它记录下来,而不是直接跳过。这样方便回溯异常原因。

QSAR分子表示标准化流程 分子结构文件 SDF / MOL / SMILES 结构归一化 加氢/芳香性/去溶剂 格式检测 非法记录剔除 分子指纹 MACCS / ECFP4 物理化学描述符 LogP / MW / TPSA 其他特征 电荷 / 形状 / 拓扑 特征矩阵合并 维度对齐 + 缺失值检测 质控放行 → 建模 全零行/NaN/异常值处理 注意:每步都要校验,减少递进误差

2.5 现代分子表示方法

这几年分子表示领域变化很快。除了传统的指纹和描述符,还有一些新方法很值得关注,尤其是做质控时需要了解它们的特性。

  • 分子图:把原子作为节点,化学键作为边。优点是保留了分子的拓扑结构,适合图神经网络。质控上需要关注节点特征和边特征的一致性。
  • SMILES 增强:通过枚举同一分子的不同SMILES表示(如改变起始原子),来做数据增强。我曾经在一个项目里试过,把SMILES变成CANONICAL形式后再用,模型稳定性提升了20%。
  • 预训练分子表示:像ChemBERTa、MolCLR这类方法,在大规模无标签分子上预训练好,然后迁移到你的小数据集上。我用过一次,效果还不错,但要注意预训练数据的分布跟你目标数据是否匹配。

再次提醒:不管用哪种现代表示方法,质控都绕不开最基础的几件事:结构完整性检查、特征维度的物理意义验证、以及批次间特征分布的稳定性。新方法只是新工具,质控的底层逻辑没有变。

行了,化学数据结构和分子表示就聊到这。保证入口数据的质量,后面所有的特征工程和模型训练才能站得稳。下一步就是把这些结构特征跟活性数据结合起来,做真正的特征工程了。