分子描述符基础:定义、分类与计算工具

做ADMET预测这么多年,我越来越觉得——分子描述符的选择,决定了你模型的天花板在哪。说白了,你得先弄明白分子描述符到底是什么玩意儿,然后才能谈筛选和特征选择。

什么是分子描述符?

分子描述符,就是把化学结构变成数字。一个分子长什么样,有什么官能团,极不极性,能不能穿过细胞膜——这些信息都得量化成数值,才能喂给机器学习模型。

我个人习惯把它分成两个层面去理解:

  • 物理化学属性:分子量、LogP、氢键供体/受体数——这些是ADMET模型最常用的基础特征。我在做口服药物筛选时,Lipinski五规则里的描述符几乎次次都要算。
  • 结构拓扑特征:原子连接方式、环系数量、分子柔性——这些描述符能捕捉分子的三维空间信息和电子分布。

核心认知: 描述符的质量决定了模型的“上限”。垃圾描述符进来,再好的算法也救不了。

描述符分类:从0D到3D

搞计算化学的人,通常按维度和物理意义把描述符分成四层。我觉得这个分类挺实用的——你想想看,它其实反映了我们对分子信息利用的深度。

维度 特征 常用属性 应用场景
0D 组成信息,不依赖结构 原子数、分子量、原子类型计数 快速初筛,高吞吐量计算
1D 片段/基团信息 氢键供体/受体数、可旋转键数、官能团计数 药化性质评估,Rule-of-Five
2D 拓扑连接关系 分子指纹(ECFP、Morgan)、拓扑极性表面积(TPSA) QSAR建模、相似度搜索
3D 空间构象依赖 分子体积、溶剂可及表面积、偶极矩、静电势 结合模式分析、手性药物设计

0D描述符:最简单,也最容易被忽略

0D描述符就是分子配方表。原子数、重原子数、分子量……说它们简单,但它们真的管用。我在做早期虚拟筛选的时候,如果分子量都超过500,后面就不用算了,肯定口服生物利用度堪忧。

不过要注意:0D描述符没有结构信息。两个分子量完全相同的同分异构体,用0D描述符根本无法区分。嗯,这时候就需要往高维走。

1D描述符:基团层面的量化

1D描述符关注的是分子“拥有什么”。比如:

  • 氢键供体/受体数(影响透膜性)
  • 可旋转键数(影响分子柔性)
  • 环系数量(影响刚性)

我记得有一次做CYP抑制模型,刚开始只用了2D指纹,效果一般。后来加了氢键供体数和TPSA,AUC直接涨了0.08。原因很简单——这些1D描述符本身就关联了药物与酶的结合模式。

2D描述符:分子指纹时代的王牌

2D描述符是目前应用最广的。分子指纹(特别是ECFP/Morgan指纹)算得上是ADMET领域的标配。我把常用的2D指纹列一下:

  • ECFP (Extended-Connectivity Fingerprint):基于Morgan算法,捕捉每个原子的局部拓扑环境。我用的是默认2Å半径,生成1024位向量。
  • MACCS (Molecular ACCess System):166位预定义指纹,简洁好解释,我一般拿它做对比基线。
  • Topological Torsion Fingerprint:考虑了原子间的拓扑距离,线性分子和环状分子区分度不错。

我曾经踩过一个坑: 跑相似度搜索时,直接用默认的2048位ECFP指纹,结果内存爆了。后来才发现,对于5000个分子的库,1024位就已经够用。少即是多,别盲目追求“多”而忽略了“有效”。

3D描述符:计算代价最大的信息层

3D描述符依赖分子的三维构象,包括分子体积、溶剂可及表面积(SASA)、偶极矩、静电势极值等。优点是信息量极大,缺点也同样明显——计算慢,而且构象采样容易不稳定。

我自己一般只在做结合模式分析时才上3D描述符。筛选阶段用2D就够了,性价比最高,你觉得呢?

常用计算工具:RDKit和PaDEL

工具选得好,能省你一半时间。这些年我试过好几套方案,最常用的还是这两款。

RDKit(Python):量产与效率之王

RDKit是我日常的主力。Python接口,开源免费,社区活跃。跑10000个分子算ECFP指纹,基本秒出。下面我贴一段最常用的代码——批量计算2D描述符:

from rdkit import Chem
from rdkit.Chem import Descriptors, AllChem
import pandas as pd

smiles_list = ["CCO", "CCN", "c1ccccc1", "O=C=O"]
mols = [Chem.MolFromSmiles(smi) for smi in smiles_list]

names = ["MolWt", "LogP", "HBA", "HBD", "TPSA", "RotBonds"]
data = []
for mol in mols:
    if mol is None:
        data.append([None] * len(names))
        continue
    data.append([
        Descriptors.MolWt(mol),
        Descriptors.MolLogP(mol),
        Descriptors.NumHAcceptors(mol),
        Descriptors.NumHDonors(mol),
        Descriptors.TPSA(mol),
        Descriptors.NumRotatableBonds(mol)
    ])

df = pd.DataFrame(data, columns=names)
print(df)

一个小技巧: 我在项目中遇到大库(10万+分子)时,会在计算前加个mol = Chem.MolFromSmiles(smi)的try-except,防止个别不规范的SMILES导致整个流程崩掉。

PaDEL-Descriptor(Java):传统药化标配

PaDEL-Descriptor是新加坡国立大学开发的Java桌面工具。它能算1444个1D/2D描述符,还有OED、CPSA等3D描述符。虽然更新不频繁,但在传统药化圈里用的人很多。

命令行调用方式:

java -jar PaDEL-Descriptor.jar \
    -dir ./input_sdf \
    -file ./output_descriptors.csv \
    -2d \
    -descriptortypes ./all_2D.txt

参数说明:

  • -dir:输入SDF文件夹路径
  • -file:输出CSV路径
  • -2d:只算2D描述符(算3D很慢)
  • -descriptortypes:指定要算的描述符种类文件(可选,我一般用all_2D.txt)

避坑指南: PaDEL对SDF文件格式很严格。我最早用的时候,因为SDF里一个空行的问题,跑了半小时才发现结果全是NaN。推荐先用-maxcount 100测10个分子,确认没问题再全量跑。

核心知识图谱

下图是我自己理的一个0D→3D维度提升框架,方便你快速把握本章的知识脉络:

分子描述符分类与应用框架 分子描述符核心框架:从0D到3D 分子结构 (SMILES/SDF) 0D 成分描述符 原子数 · 分子量 · 原子类型 快速初筛 · 高吞吐量 1D 片段描述符 HBA · HBD · 可旋转键 · 环 药化评估 · Rule-of-Five 2D 拓扑描述符 ECFP · MACCS · TPSA QSAR · 相似度搜索 3D 构象描述符 体积 · SASA · 偶极矩 · 静电势 结合模式分析 · 手性设计 RDKit (Python) 量产 · 开源 · 社区活跃 PaDEL-Descriptor (Java) 1444个描述符 · 传统药化标配 ADMET 预测模型 说明: 虚线箭头表示计算复杂度递增 实际建模中2D描述符性价比最高

实际项目中怎么选?

说了这么多,你可能会问:到底用哪套描述符组合最好?我的经验是这样的:

  • 早期快速筛选:0D + 关键1D(MW, LogP, HBA, HBD)就够了,成本最低
  • QSAR建模:2D指纹(ECFP4, 1024位) + 核心1D(TPSA, RotBonds),效果稳定
  • 结合模式预测:上3D描述符,但记得先做构象对齐,否则误差很大
  • 可解释性要求高:优先用MACCS指纹和传统的理化描述符,模型结果容易解释

我的个人建议: 不要一上来就搞复杂的3D描述符。先用RDKit快速算一遍2D描述符,跑个随机森林看看效果。如果AUC已经0.85以上了,就别折腾3D了。做项目讲究性价比,不是吗?