化学数据结构与分子表示
在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 从结构到特征向量的标准化流程
有了上面的几类分子表示方法,下一步就是建立标准化的特征提取流程。这是我总结的“四步法”:
- 结构归一化:统一加氢、去溶剂、标准芳香性。
- 格式统一:一律转成SDF或标准SMILES,删除非法记录。
- 特征生成:同一批次用相同参数生成指纹和描述符。
- 格式校验:检查矩阵维度、是否出现全零行(指纹)或NaN值。
小技巧:我在做批处理时,喜欢写一个检查函数,对每个分子跑一遍“结构是否完整 → 指纹是否生成 → 描述符是否有效”的验证。如果某个分子在任何一步失败,我都把它记录下来,而不是直接跳过。这样方便回溯异常原因。
2.5 现代分子表示方法
这几年分子表示领域变化很快。除了传统的指纹和描述符,还有一些新方法很值得关注,尤其是做质控时需要了解它们的特性。
- 分子图:把原子作为节点,化学键作为边。优点是保留了分子的拓扑结构,适合图神经网络。质控上需要关注节点特征和边特征的一致性。
- SMILES 增强:通过枚举同一分子的不同SMILES表示(如改变起始原子),来做数据增强。我曾经在一个项目里试过,把SMILES变成CANONICAL形式后再用,模型稳定性提升了20%。
- 预训练分子表示:像ChemBERTa、MolCLR这类方法,在大规模无标签分子上预训练好,然后迁移到你的小数据集上。我用过一次,效果还不错,但要注意预训练数据的分布跟你目标数据是否匹配。
再次提醒:不管用哪种现代表示方法,质控都绕不开最基础的几件事:结构完整性检查、特征维度的物理意义验证、以及批次间特征分布的稳定性。新方法只是新工具,质控的底层逻辑没有变。
行了,化学数据结构和分子表示就聊到这。保证入口数据的质量,后面所有的特征工程和模型训练才能站得稳。下一步就是把这些结构特征跟活性数据结合起来,做真正的特征工程了。