分子描述符基础:定义、分类与计算工具
做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 + 关键1D(MW, LogP, HBA, HBD)就够了,成本最低
- QSAR建模:2D指纹(ECFP4, 1024位) + 核心1D(TPSA, RotBonds),效果稳定
- 结合模式预测:上3D描述符,但记得先做构象对齐,否则误差很大
- 可解释性要求高:优先用MACCS指纹和传统的理化描述符,模型结果容易解释
我的个人建议: 不要一上来就搞复杂的3D描述符。先用RDKit快速算一遍2D描述符,跑个随机森林看看效果。如果AUC已经0.85以上了,就别折腾3D了。做项目讲究性价比,不是吗?