4. 多模态数据预处理与质量控制
多模态药物靶点预测的输入通常同时包含分子结构(SMILES/图)、蛋白序列或结构、表达谱、通路注释、亲和力标签等。不同模态的采集方式、量纲、噪声结构和缺失模式差异极大,如果直接把原始数据拼接后送入模型,模型学到的往往不是“药物—靶点相互作用规律”,而是“哪个文件来自哪一批实验”。因此,预处理与质量控制不是建模前的杂务,而是决定模型能否泛化、结果能否复现的核心环节。本节按“缺失值—去噪—标准化—批次效应—版本管理”的顺序展开,并给出可落地的参数与判断依据。
一、缺失值处理:先判断机制,再决定策略
缺失值处理的第一步不是填补,而是判断缺失机制。以靶点亲和力矩阵为例,若某靶点对所有药物都无测量值,属于结构性缺失(MNAR,缺失与未测量本身相关);若某批次仪器故障导致随机若干孔无读数,则接近随机缺失(MCAR)。两者处理方式完全不同:前者应删除该靶点或改用其他数据源,后者可安全填补。
常用策略及适用条件如下:
- 删除:当某特征缺失率 > 60% 且无生物学先验支持时,直接删除该特征列;当某样本缺失特征数 > 30% 时删除该样本。
- 均值/中位数填补:仅适用于 MCAR 且缺失率 < 5% 的连续特征,中位数比均值更抗离群值。
- KNN 填补:对表达谱等连续矩阵,取 k=5~10 个最近邻样本的加权均值;需先做标准化,否则量纲大的特征会主导距离。
- 多重插补(MICE):对存在相关结构的特征(如多个通路评分),用链式方程迭代插补,通常迭代 10~20 轮,适合缺失率 5%~30% 的场景。
- 掩码建模:在深度模型中保留缺失位置并加入 missing mask 通道,让模型自行学习缺失模式,适合缺失率较高但样本量大的情况。
示例:某激酶抑制数据集含 1200 个化合物 × 320 个靶点,亲和力矩阵缺失率 42%。检查发现其中 18 个靶点缺失率 > 90%,判定为结构性缺失,直接剔除;剩余矩阵缺失率降至 27%,对连续 pIC50 采用 KNN(k=7)填补,并在特征中额外加入一列“是否被填补”的二值掩码,供模型区分真实值与插补值。
二、去噪:区分随机噪声与系统伪影
去噪的目标是压制随机波动,同时保留真实信号。不同模态的噪声来源不同:分子指纹可能因盐离子、立体化学未指定而产生伪差异;蛋白结构坐标存在实验分辨率带来的原子位置抖动;表达谱存在低表达基因的泊松噪声。对应处理方式也不同。
对连续信号(如表达谱、结合曲线),常用 Savitzky-Golay 滤波(窗口 5~11,多项式阶数 2~3)或小波软阈值去噪;对分子图,可先做标准化处理:去盐、去电荷、统一互变异构体、保留最大片段,再生成指纹或图表示。对蛋白结构,若使用 AlphaFold 预测结构,可按 pLDDT < 70 的残基做柔性标记而非直接删除,避免丢失 loop 区信息。
判断去噪是否过度的一个实用指标是:去噪前后分别计算同一化合物在重复实验中的相关性,若去噪后重复相关性下降,说明信号被削弱;若噪声方差下降但重复相关性保持或提升,则去噪有效。
三、标准化:让不同模态可比
标准化解决的是量纲与分布差异。常用方法包括 Z-score(均值 0、标准差 1)、Min-Max(缩放到 [0,1])、Robust Scaling(用中位数和 IQR,抗离群)以及分位数归一化(Quantile Normalization,强制分布一致)。选择依据是分布形态与离群值比例:
| 方法 | 适用场景 | 注意点 |
|---|---|---|
| Z-score | 近似正态、离群少 | 离群值会拉偏均值与标准差 |
| Robust Scaling | 含离群值 | 保留离群信息,不强行压缩 |
| Quantile | 表达谱跨样本比较 | 会改变原始分布形状 |
| Min-Max | 需固定范围输入 | 对新增样本敏感,需保存 min/max |
关键原则:标准化参数必须只在训练集上拟合,再应用到验证集和测试集,否则会造成信息泄漏。例如用全量数据计算均值方差,测试集分布信息就提前进入了训练过程。
四、批次效应校正:消除“来源”而非“生物学”差异
批次效应来自不同实验日期、仪器、细胞系、测序平台等。若不做校正,模型可能把“批次”当作预测依据。常用方法有 ComBat(经验贝叶斯)、limma removeBatchEffect、以及基于对抗学习的域适应。ComBat 适合表达谱等连续矩阵,需提供批次标签和可选的协变量(如组织类型),以保护真实生物学差异。
校正效果判断:用 PCA 观察校正前后样本分布。若校正前批次在 PC1/PC2 上明显分离,校正后批次混合而生物学分组仍可区分,说明校正合理;若校正后所有样本混成一团、分组信息消失,说明过度校正,需减小校正强度或加入协变量保护。
五、数据版本管理与可复现性
可复现性要求“同样的输入、代码、参数、环境,得到同样的输出”。建议做到:原始数据只读保存,任何清洗步骤生成新的派生版本并记录哈希;使用 DVC 或 Git-LFS 管理大文件;预处理脚本参数化,随机种子固定;记录每个版本的样本数、特征数、缺失率、标准化参数和批次校正前后指标。
# 示例:预处理版本记录(YAML)
version: v1.3
raw_hash: sha256:9f2c...
steps:
- drop_targets: missing_rate > 0.9
- impute: KNN(k=7) + missing_mask
- denoise: SavitzkyGolay(window=7, poly=2)
- scale: RobustScaler(fit_on=train)
- batch: ComBat(batch=plate_id, covar=cell_line)
seed: 42
outputs:
train: 960 x 302
valid: 120 x 302
test: 120 x 302
把上述五步串起来,预处理就不再是“清洗一下数据”,而是一条可审计、可回滚、可复现的工程链路。真正决定模型上限的,往往不是网络结构多复杂,而是这条链路是否把批次、缺失和噪声挡在了模型之外,同时把生物学信号完整保留下来。