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
建议每次预处理后输出一份 QC 报告:各模态缺失率、去噪前后重复相关性、标准化前后分布、批次校正前后 PCA 轮廓系数、以及最终训练/验证/测试划分的样本数与标签分布。报告与数据版本一同归档,便于回溯。
多模态数据预处理与质量控制链路 原始多模态数据 SMILES / 序列 表达谱 / 亲和力 批次标签 缺失值处理 机制判断 MCAR/MNAR 删除 / KNN / MICE + missing mask 去噪 SG 滤波 / 小波 分子标准化 pLDDT 柔性标记 标准化 Z-score / Robust Quantile / Min-Max 仅训练集拟合 批次效应校正 ComBat / limma 协变量保护 PCA 前后对比 数据版本管理与可复现性(贯穿全链路) 原始数据只读 raw_hash 记录 DVC / Git-LFS 参数化脚本 seed=42 固定 每步输出派生版本 QC 报告 缺失率 / 重复相关性 PCA 轮廓系数 版本归档 v1.3 train/valid/test 可回溯、可复现 干净、可比、可复现的建模输入 train 960×302 / valid 120×302 / test 120×302 校正效果判断 批次混合 + 分组保留 → 通过 分组消失 → 过度校正,回调

把上述五步串起来,预处理就不再是“清洗一下数据”,而是一条可审计、可回滚、可复现的工程链路。真正决定模型上限的,往往不是网络结构多复杂,而是这条链路是否把批次、缺失和噪声挡在了模型之外,同时把生物学信号完整保留下来。