3. 序列特征工程经典方法
把一条氨基酸序列送进模型之前,必须先把它变成数值向量。序列本身是变长的字符串,而绝大多数经典机器学习模型(逻辑回归、SVM、随机森林、XGBoost)以及早期的神经网络都要求定长、定维的数值输入。特征工程要解决的核心问题就是:用什么方式把序列的组成、顺序、位置和理化性质编码成固定维度的向量,并且让这个向量尽可能保留与下游任务相关的信息。本节围绕四类经典方法展开,并给出把它们拼接成统一特征向量的实践路径。
一、独热编码:最基础的定长表示
独热编码(One-Hot Encoding)把每个位置的氨基酸映射成一个长度为 20 的稀疏向量,对应氨基酸下标处为 1,其余为 0。若序列长度为 L,则编码矩阵形状为 L×20。它保留了完整的位置信息,但维度随序列长度变化,且完全不含氨基酸之间的相似性——赖氨酸和精氨酸的向量距离与赖氨酸和色氨酸一样远。
实践中通常配合两种处理:一是截断或补齐到固定长度 L(如 512),补齐位用全零向量表示;二是把 L×20 矩阵展平为 1×(L×20)向量,或对列求和得到 1×20 的氨基酸组成(AAC)。需要注意,展平后的维度可能高达上万,容易过拟合,因此独热编码更适合作为卷积网络的输入张量,而不是直接喂给树模型。
二、k-mer 频率:捕捉局部顺序
k-mer 频率统计序列中所有长度为 k 的子串出现次数,再除以总子串数归一化。k=1 时就是 20 维的氨基酸组成;k=2 时是 400 维的二肽组成;k=3 时是 8000 维的三肽组成。相比独热编码,k-mer 用固定维度隐式地编码了局部相邻顺序,且对序列长度不敏感。
维度爆炸是主要风险:k=3 已有 8000 维,k=4 达到 160000 维,而典型蛋白序列只有几百个残基,绝大多数 k-mer 计数为 0,特征极度稀疏。常用对策包括:只保留训练集中出现频率高于阈值的 k-mer、使用 gapped k-mer(允许中间跳过若干位)、或对计数做 TF-IDF 加权。示例中若某数据集含 5000 条长度约 300 的序列,取 k=2 得到 400 维特征,通常比 k=3 更稳健。
三、物理化学属性:用连续量刻画残基
每个氨基酸都有一组可量化的理化指标,常见的有疏水性(Kyte-Doolittle)、等电点、分子量、极性、α 螺旋倾向、β 折叠倾向等。做法是把序列中每个残基替换为其属性值,得到一条长度 L 的数值曲线,再对该曲线提取统计量:均值、标准差、最大值、最小值、偏度、峰度,以及沿序列滑窗的均值序列。
这类特征维度低(每种属性约 6~10 维)、可解释性强,能直接反映“这条序列整体偏疏水还是偏亲水”“疏水段是否集中”。它天然丢失了精确位置,因此常与 k-mer 或独热编码互补使用。选择属性时应对应任务:预测跨膜区优先用疏水性,预测结合亲和力可加入电荷与极性。
四、位置特异性打分矩阵(PSSM)
PSSM 由 PSI-BLAST 对序列做多轮迭代搜索后生成,形状为 L×20,元素是每个位置出现各氨基酸的对数几率分数。它把进化保守性编码进来:保守位置分数绝对值大,可变位置接近 0。相比独热编码,PSSM 的同一位置 20 个值有强弱之分,携带了同源家族的信息。
由于 PSSM 也是 L×20 的变长矩阵,常见处理是:按列求均值得到 20 维、取每行最大值与最小值得到 2L 维、或对整矩阵做池化。生成 PSSM 需要本地安装 BLAST 并准备 Swiss-Prot 等数据库,计算成本较高,通常离线预计算并缓存为 .pssm 文件。
五、手工特征拼接实践
单一特征往往只能覆盖一个侧面,实际项目中最常见的做法是把多类特征拼接成一个长向量。下面给出一个可复现的拼接示例,假设序列长度约 300,任务为二分类。
# 示例:四类特征拼接(参数为教学假设值)
# 1. AAC(氨基酸组成) 20 维
# 2. 二肽组成 k=2 400 维
# 3. 理化属性统计(5 种属性×6 统计量) 30 维
# 4. PSSM 列均值 20 维
# 合计 470 维
import numpy as np
from sklearn.preprocessing import StandardScaler
def build_features(seq, pssm_matrix, aa_props):
aac = amino_acid_composition(seq) # 20
dpc = kmer_frequency(seq, k=2) # 400
phys = physchem_stats(seq, aa_props) # 30
pssm = pssm_matrix.mean(axis=0) # 20
return np.concatenate([aac, dpc, phys, pssm])
X = np.array([build_features(s, p[s], props) for s in seqs])
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
拼接时有三个关键点。第一,量纲统一:k-mer 频率在 0~1 之间,PSSM 分数可能在 -10~10 之间,理化统计量跨度更大,必须用 StandardScaler 或 MinMaxScaler 在训练集上拟合、再变换测试集,避免数据泄漏。第二,维度权衡:470 维对几千条样本尚可,若样本只有几百条,应优先保留 AAC、理化统计和 PSSM 列均值,把 k=2 降为 k=1 或做特征选择。第三,缺失处理:PSSM 生成失败或序列过短时,对应特征用 0 填充,并在元数据中标记,避免静默污染训练集。
四类方法并非互斥,而是从不同粒度描述同一条序列:独热编码保留精确位置,k-mer 捕捉局部顺序,理化属性提供连续可解释的全局刻画,PSSM 注入进化保守性。理解每种方法的维度来源、信息偏好与计算代价,才能在具体任务中做出合理的取舍与组合。