4. 分子描述符与分子指纹:基本概念,用于辅助模型评估

大家好,今天我们来讲一个在分子生成模型评估中真正起决定性作用,但又经常被入门者忽略的环节——分子描述符和分子指纹。

你想想看,虽然SMILES是用字符串来表示分子,但深度学习模型本质上是一个数学函数,它只认识数字。所以,把分子结构转化成计算机能理解的特征向量,是训练和评估模型的第一步,也是最关键的一步。

我刚开始做分子生成的时候,只盯着Loss曲线看,觉得Loss降得挺漂亮,结果一测生成分子的化学性质,全都不合格。后来我养成了一个习惯:每次实验必须看三个东西——1)生成分子的QED分布,2)与训练集的平均Tanimoto相似度,3)SA Score的分布。这三个指标组合起来,基本能反映一个生成模型的好坏。

4.1 分子描述符:基于知识的特征工程

说白了,分子描述符就是给分子做体检,量身高、测体重、数一数身上有几个口袋。

描述符是标量值,通常具有明确的物理化学意义。常见的描述符包括:

  • 分子量 (MolWt):最基础的描述符,影响药物的吸收和分布。
  • 脂水分配系数 (LogP):评估分子的亲脂性,过高或过低都会影响成药性。
  • 氢键供体/受体计数 (HBD/HBA):影响分子与靶点的结合能力。
  • 可旋转键数 (NumRotatableBonds):评估分子的柔韧性。
  • 拓扑极性表面积 (TPSA):预测分子的肠道吸收和血脑屏障穿透能力。
描述符名称 类别 评估中的典型用途
MolWt 物理性质 过滤超过500道尔顿的分子
MolLogP 疏水性 评估类药性(Lipinski规则)
NumHDonors 氢键能力 与ADME性质相关
TPSA 极性表面积 预测口服生物利用度

我个人习惯在训练之前,先用RdKit把所有分子的基础描述符算好,存成npy文件。这样在评估的时候直接加载,不用每次都重新计算,能省下不少时间。

4.2 分子指纹:子结构的局部表示

描述符虽然有用,但它丢掉了分子的局部结构信息。指纹就是为了解决这个问题而生的。指纹通常是一个固定长度的位向量(bit vector),每一位代表分子中是否存在某种特定的化学子结构。

常用的指纹主要有两类:

  • MACCS 键:一个包含166个预定义子结构查询的字典。优点是速度快、可解释性强;缺点是覆盖的化学空间有限。
  • ECFP (Extended-Connectivity Fingerprints):基于Morgan算法生成,不依赖预定义字典。优点是能捕捉丰富的拓扑结构;缺点是可解释性差。

来看看具体的代码实现,这段代码我在项目中非常常用:

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

mol = Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(=O)O')

# 计算描述符
mw = Descriptors.MolWt(mol)
logp = Descriptors.MolLogP(mol)
print(f"分子量: {mw:.2f}, LogP: {logp:.2f}")

# 计算 MACCS 指纹
maccs = MACCSkeys.GenMACCSKeys(mol)
print(f"MACCS 指纹长度: {maccs.GetNumBits()}")

# 计算 ECFP4 指纹 (半径2, 2048位)
ecfp4 = GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048)
print(f"ECFP4 指纹长度: {ecfp4.GetNumBits()}")
嗯,这里有个坑要注意:指纹的位宽(nBits)设置不是越大越好。我见过有人把nBits设成16384,结果算出来的Tanimoto系数普遍很低,因为位宽太大导致大多数位都是0,失去了比较意义。通常ECFP4用1024或2048位就足够了。

4.3 从相似性到分布:指纹在评估中的核心应用

这一节是重点。有了指纹,我们才能科学地评估生成模型的好坏。我不只看Loss,那些数字太抽象了。我更关心生成分子在化学空间里的分布是什么样的。

我利用下面这张图来概括从SMILES到评估指标的数据流。我个人特别喜欢这种抽象方式,它能清晰地展示数据是如何一步步被转化的。

分子特征在模型评估中的核心流程 SMILES 输入 分子描述符 分子指纹 (ECFP) 数值特征向量 Tanimoto 新颖性 QED 类药性 SA 合成可及性 MMD 分布相似性 说明:先通过描述符和指纹提取特征,再基于这些数值特征计算评估指标

具体来说,指纹在这几个核心指标上非常有用:

  • Tanimoto 系数(新颖性):衡量生成分子与训练集分子的相似度。平均相似度过高说明模型在记忆,过低则说明模型在乱生成。
  • QED(定量类药物评估):结合多个描述符的加权评分。虽然它不能完全替代专家判断,但作为初筛非常高效。
  • SA Score(合成可及性):评估分子是否容易合成。我之前遇到只看性质不管合成的项目,结果生成了一堆理论上完美的分子,但有机合成团队看了直摇头。
  • MMD(最大均值差异):在指纹空间里比较两个集合的分布差异,判断生成分布是否逼近训练分布。

4.4 实战建议与避坑

OK,我们总结一下。描述符和指纹是连接化学语言和深度学习模型的桥梁。下面是我的一些实战建议:

起步建议: 对于分子生成模型的评估,我个人建议先从 ECFP4(半径2, 2048位)开始,配合3个核心描述符(MW, LogP, TPSA)。这个组合简单、高效、信息量大。
避坑指南: 我曾经在一个项目中试图把所有能用RdKit算出来的描述符(大概200多个)直接拼成一个向量喂给模型做评估。结果维度灾难立刻显现,相似度矩阵变得非常稀疏,模型评估彻底失效。记住,不是特征越多越好,冗余特征反而会淹没有效信息。

最后想说的是,评估体系不是一成不变的。不同的项目侧重点不同。比如做抗菌肽生成的,可能更关注阳离子性和疏水性;做激酶抑制剂的,可能更关注特定子结构的匹配。描述符和指纹给了你一个标准化的工具,但用好这些工具,还是需要你对具体问题有深入的理解。