4. 分子图特征工程

分子图预测模型的性能上限,往往不由网络结构决定,而由节点与边上的特征决定。分子图把原子视为节点、化学键视为边,但“原子”和“键”本身只是拓扑骨架,真正携带化学信息的是附着其上的属性:这个原子是什么元素、处于什么杂化态、带多少部分电荷、是否手性、是否属于芳香体系;这条键是单键、双键还是芳香键,是否在环上。特征工程的任务,就是把这些化学语义转成模型可读的数值向量,并保证不同分子、不同数据集之间量纲可比。

一、节点特征:从元素到化学环境

最基础的节点特征是原子类型。常见做法是维护一张元素表,用 one-hot 编码表示 C、N、O、S、F、Cl、Br、I、P 等常见元素,其余元素归入“其他”位。one-hot 的维度等于元素类别数,优点是互斥清晰,缺点是维度随元素种类增长。若数据集中元素种类很多,可改用可学习的嵌入向量,把每个元素映射到 16~64 维的稠密向量,让模型自行学习元素间的相似性。

杂化态是第二个关键特征。碳原子的 sp、sp²、sp³ 杂化直接决定键角与成键能力,通常用 one-hot 表示 {SP, SP2, SP3, SP3D, SP3D2, 未指定}。杂化态可由 RDKit 的 GetHybridization() 直接读取,也可由成键数与孤对电子推断。部分电荷则来自 Gasteiger、MMFF94 或半经验量子化学计算,是连续值,通常需要标准化。形式电荷(formal charge)是整数,取值如 -2、-1、0、+1、+2,可用 one-hot 或直接作为标量输入。

手性特征用于区分对映异构体。RDKit 中 FindMolChiralCenters() 可返回手性中心及其 R/S 标记,编码时常用 {R, S, 未指定} 三态 one-hot。芳香性则标记原子是否处于芳香环中,是布尔特征,可由 GetIsAromatic() 获得。此外,原子是否在环上、所属环的大小、是否为氢键供体/受体,也常作为补充节点特征。

二、边特征:键类型与环信息

边特征描述原子间的连接性质。键类型通常编码为 {单键, 双键, 三键, 芳香键} 的 one-hot 向量;若考虑共轭体系,还可加入“是否共轭”布尔位。键是否在环上(IsInRing())以及键所在最小环的大小,能帮助模型区分开链与环状结构。对于立体化学,双键的顺反构型(E/Z)和单键的楔形/虚线方向也应编码,否则模型无法区分顺反异构体。

环信息除了“是否在环上”,还包括环的数目、环的大小分布、是否共享边(稠合环)、是否为芳香环。这些信息可通过 RDKit 的 GetRingInfo() 获取。对于含多个环的分子,环的拓扑关系(如桥环、螺环)对性质影响显著,可用环的邻接矩阵或环大小直方图作为全局特征。

三、官能团编码与全局特征

官能团是分子性质的强指示器。常见做法是用 SMARTS 模式匹配官能团,例如羟基 [OX2H]、羧基 [CX3](=O)[OX2H1]、氨基 [NX3;H2,H1;!$(NC=O)]、硝基 [NX3+](=O)[O-]、苯环 c1ccccc1。匹配结果可编码为多热向量(multi-hot),每个官能团对应一个维度,出现为 1,否则为 0。若官能团数量较多,也可统计每个官能团的出现次数,形成计数向量。

全局特征则描述整个分子,包括分子量、LogP、TPSA、氢键供体/受体数、可旋转键数、环数、芳香环数、重原子数、形式电荷总和等。这些特征可由 RDKit 的 Descriptors 模块直接计算。它们不依附于某个原子或键,但对溶解性、渗透性、毒性等性质预测非常关键。

四、特征归一化与拼接

不同特征的量纲差异极大:部分电荷可能在 -1 到 1 之间,分子量可达数百,而 one-hot 特征只有 0/1。若直接拼接,连续特征会主导梯度。因此需要对连续特征做标准化,常用 z-score:(x - μ) / σ,其中 μ 和 σ 从训练集统计得到,验证集和测试集复用同一组参数,避免数据泄漏。对于偏态分布的特征(如分子量),可先取对数再标准化。one-hot 和 multi-hot 特征本身已在 0~1 之间,通常不再缩放。

拼接时需注意维度对齐:节点特征向量长度必须一致,边特征同理。若某些分子缺少某类特征(如无手性中心),用全零向量占位,而不是删除该维度。最终节点特征向量可表示为 [元素 one-hot | 杂化 one-hot | 形式电荷 | 部分电荷 | 手性 | 芳香性 | 环信息 | 官能团 multi-hot],边特征为 [键类型 one-hot | 共轭 | 环上 | 立体标记]。

分子图特征工程:从化学语义到数值向量 输入分子(示例) C C C C C C O H 特征提取(RDKit) • GetHybridization() • GetIsAromatic() • FindMolChiralCenters() • GetRingInfo() • SMARTS 官能团匹配 节点特征向量拼接 元素 杂化 电荷 手性 芳香 环信息 官能团 连续特征 → z-score 标准化 离散特征 → one-hot / multi-hot 缺失维度 → 全零占位 边特征与全局特征 边特征 键类型 共轭 环上 立体 全局特征 分子量 LogP TPSA 可旋转键 特征归一化与数据划分 训练集 计算 μ 和 σ 拟合标准化参数 z-score 标准化 x' = (x − μ) / σ 偏态特征先取对数 验证集 / 测试集 复用训练集 μ、σ 禁止重新拟合

五、实操示例:苯酚的特征构建

以苯酚(C₆H₅OH)为例,说明特征构建过程。苯环上 6 个碳原子均为 sp² 杂化,GetIsAromatic() 返回 True,形式电荷为 0,Gasteiger 部分电荷在 -0.1 到 +0.1 之间。羟基氧为 sp³ 杂化,部分电荷约 -0.4,氢约 +0.2。手性中心不存在,手性特征全零。环信息方面,6 个碳均在 6 元芳香环上。官能团匹配到羟基和苯环,multi-hot 向量中对应位为 1。全局特征包括分子量 94.11、LogP 约 1.46、TPSA 20.23、氢键供体 1、受体 1、可旋转键 0、芳香环数 1。

拼接后节点特征维度示例为:元素 one-hot(9 维)+ 杂化 one-hot(6 维)+ 形式电荷(1 维)+ 部分电荷(1 维)+ 手性(3 维)+ 芳香性(1 维)+ 环信息(2 维)+ 官能团 multi-hot(20 维)= 43 维。边特征维度为:键类型 one-hot(4 维)+ 共轭(1 维)+ 环上(1 维)+ 立体(3 维)= 9 维。所有连续特征在训练集上计算 μ 和 σ,验证集和测试集直接套用。

实践建议:特征维度并非越多越好。若某些特征在数据集中几乎不变(如所有分子都含苯环),该维度方差接近零,标准化时 σ 极小,会导致数值不稳定。建议在标准化前先剔除方差低于阈值的特征,或改用 min-max 缩放。此外,one-hot 编码的元素表应基于训练集统计,测试集中出现的新元素归入“其他”位,避免维度不一致。
常见错误:在划分训练集和测试集之前就对全量数据做标准化,导致测试集信息泄漏到训练过程。正确顺序是:先划分数据,再在训练集上拟合标准化参数,最后用同一组参数变换验证集和测试集。对于图神经网络,节点特征和边特征的标准化参数应分别统计,不可混用。

特征工程完成后,建议保存一份特征字典(feature dictionary),记录每个维度的含义、类型、标准化参数和缺失值处理方式。这样在推理阶段,新分子可以按照完全相同的流程生成特征向量,保证训练与推理的一致性。分子图特征工程不是一次性工作,而是随着数据集和任务目标不断迭代的过程:先构建基础特征,观察模型表现,再针对性地补充缺失的化学信息。