4. 分子描述符与理化性质预测
分子描述符是把化学结构翻译成数值向量的“中间语言”。在完成结构标准化、质子化状态枚举与三维构象生成之后,我们面对的仍然是一堆原子和键;而要让机器学习模型、相似性搜索或规则筛选真正“读懂”分子,就必须把它压缩成一组可计算、可比较、可解释的数字。本节围绕拓扑描述符、电子描述符、脂水分配系数、溶解度与 pKa 这几类最常用的性质展开,并讨论描述符筛选与共线性处理这一实际建模中最容易被忽视、却直接决定模型可靠性的环节。
拓扑描述符:从连接关系读出分子形状
拓扑描述符只依赖原子的连接方式,不依赖三维坐标,因此计算快、可复现性强,是描述符集合的“底座”。最基础的是原子计数与分子量,例如乙醇 C2H6O 的分子量为 46.07。再往上是环与不饱和度的刻画:环数、芳香环数、可旋转键数、氢键供体数(HBD)与氢键受体数(HBA)。以布洛芬为例,其分子式为 C13H18O2,分子量 206.28,含 1 个羧基(HBD=1,HBA=2)、1 个苯环、可旋转键约 4 个,这些数字直接对应它的亲脂性与膜渗透倾向。
更进一步的是基于图论的指数,如 Wiener 指数(所有原子对距离之和)、Randić 连接性指数、Balaban J 指数,以及扩展的 EState、Morgan 指纹等。它们把“分子长什么样”编码为连续数值。需要强调的是,拓扑描述符对立体化学不敏感:同一分子的对映体在多数拓扑描述符上完全一致,因此当手性影响活性时,必须额外引入手性描述符或三维描述符。
电子描述符:把电荷与极性量化
电子描述符刻画电子分布及其响应外场的能力,常见的有部分电荷(Gasteiger、MMFF94、AM1-BCC 等)、偶极矩、极化率、HOMO/LUMO 能级、电负性、以及拓扑极性表面积 TPSA。TPSA 是其中最具工程价值的一个:它近似反映分子表面极性区域的大小,常与 HBD/HBA 一起用于判断口服吸收。经验上,TPSA < 90 Ų 且 HBD ≤ 3 的分子更可能具备良好膜渗透性;当 TPSA > 140 Ų 时,被动扩散往往显著受限。
电子描述符对构象和质子化状态敏感。同一分子在中性态与阴离子态下,电荷分布、偶极矩和 TPSA 都会变化。因此计算电子描述符前,必须先确定目标 pH 下的主要质子化形态,否则得到的数值可能对应一个在生理条件下几乎不存在的物种。
脂水分配系数、溶解度与 pKa
脂水分配系数 logP 衡量中性分子在正辛醇与水之间的分配倾向,logD 则是在给定 pH 下所有形态的加权结果。二者关系可写为:
logD(pH) = logP - log10(1 + 10^(pH - pKa)) // 对一元酸
logD(pH) = logP - log10(1 + 10^(pKa - pH)) // 对一元碱
以一元酸为例,当 pH 远低于 pKa 时,分子以中性态为主,logD ≈ logP;当 pH 远高于 pKa 时,分子几乎完全解离,logD 随 pH 每升高 1 个单位下降约 1。这说明 logP 与 logD 不可混用:在 pH 7.4 的生理条件下,一个 pKa=4.5、logP=3.0 的酸,其 logD 约为 3.0 − (7.4 − 4.5) ≈ 0.1,亲脂性大幅下降。
溶解度分为热力学溶解度与动力学溶解度。热力学水溶解度常用 General Solubility Equation 估算:logS ≈ 0.5 − 0.01(MP − 25) − logP,其中 MP 为熔点(℃)。该式表明,高熔点与高 logP 都会降低溶解度。pKa 则决定电离程度,进而影响溶解度与 logD:可电离基团的引入常能显著提高水溶性,但也会改变被动渗透。实际工作中,pKa 可由实验测定,也可用 Henderson-Hasselbalch 关系从 logD-pH 曲线反推,或使用 RDKit、ChemAxon 等工具预测,预测值需与实验值交叉验证。
描述符筛选与共线性处理
把上述描述符全部算出来,一个分子很容易得到几百甚至上千维向量。直接送入模型会带来三个问题:维度灾难、过拟合,以及多重共线性导致的系数不稳定。共线性指的是两个或多个描述符高度线性相关,例如分子量与重原子数的相关系数常达 0.98,TPSA 与 HBA 也高度相关。当共线性严重时,线性回归的系数会随样本微小扰动而剧烈变化,模型解释性丧失。
处理流程通常分四步。第一步是缺失值与低方差过滤:删除缺失比例超过 20% 的描述符,删除方差接近 0 的常量列。第二步是相关性聚类:计算描述符两两之间的 Pearson 或 Spearman 相关系数,对 |r| > 0.9 的变量组,保留与目标性质相关性最高、或物理意义最清晰的一个。第三步是方差膨胀因子(VIF)检查:对每个描述符用其余描述符做回归,VIF = 1/(1−R²),当 VIF > 10 时认为存在严重共线性,应剔除或合并。第四步是标准化与特征选择:对量纲差异大的描述符做 Z-score 标准化,再用 LASSO、随机森林重要性或递归特征消除挑选最终子集。
实操建议:在 RDKit 中可用 Descriptors.descList 批量计算约 200 个描述符,再用 pandas 的 corr() 生成相关矩阵,配合 seaborn.clustermap 可视化聚类。对 VIF,可用 statsmodels 的 variance_inflation_factor 逐列计算。注意:所有筛选都必须在训练集上完成,再应用到验证集,否则会造成信息泄漏。
常见误区:把 logP 与 logD 同时放入模型,或在 pH 7.4 场景下使用中性 logP 解释渗透性。前者引入冗余,后者忽略电离,都会让结论偏离真实体系。另一个误区是只做单变量筛选而忽略交互项,导致重要组合特征被误删。
一个可复用的描述符筛选检查表
| 步骤 | 操作 | 判断阈值 | 输出 |
|---|---|---|---|
| 1 | 缺失值过滤 | 缺失率 > 20% 删除 | 有效描述符列 |
| 2 | 低方差过滤 | 方差 < 0.01 删除 | 去常量列 |
| 3 | 相关性聚类 | |r| > 0.9 保留代表 | 去冗余子集 |
| 4 | VIF 检查 | VIF > 10 剔除 | 低共线性子集 |
| 5 | 标准化 | Z-score | 统一量纲矩阵 |
| 6 | 特征选择 | LASSO / RF 重要性 | 最终特征集 |
完成上述流程后,得到的描述符子集通常从数百维降到 20~50 维,既保留了拓扑、电子与理化性质的关键信息,又显著降低了共线性。此时再用于 QSAR 建模、相似性搜索或 ADMET 预测,模型的稳定性与可解释性都会明显提升。需要牢记的是,描述符筛选不是一次性动作,而应随数据集、目标性质与 pH 场景的变化重新评估。