4. ADMET 数据特点与常见挑战归纳总结

好,咱们把数据拿到手了,也大致看了看长什么样。

但别急着往上套 PCA 模型。做 ADMET 预测,首先得搞清楚一个核心问题:这批数据到底有多“难搞”?

我做了这么多年药物化学和数据分析,坦白讲,ADMET 数据是所有分子数据里最让人头疼的。它不像理化性质数据那么规整,也不像活性数据那么容易解释。你看我接下来列出的这几个特点,基本上每一个都踩过坑。

4.1 ADMET 数据四大特点

先说数据特点。你想想看,几百几千个分子描述符,加上多个 ADMET 终点,是什么概念?

  • 高维度与小样本(High Dimension, Low Sample Size):说白了就是个“高维小样本”问题。分子描述符动辄上千维(比如 Morgan 指纹、RDKit 描述符),但实测的 ADMET 数据点可能就几百个。我个人习惯是先做一次粗筛,否则 PCA 的协方差矩阵都可能算不出来。
  • 稀疏性(Sparsity):大部分分子对大部分 ADMET 终点是没有标注的。比如一个化合物有 Caco-2 数据,但没测过 hERG。这种稀疏矩阵做 PCA 时,缺失值处理稍有不慎,结果就偏了。
  • 异质性(Heterogeneity):数据来源五花八门。有高通量筛选的(噪声大),有实验室精确测的(量少但准),还有文献里扒的(单位都未必统一)。我在项目中遇到过同一批分子,两个实验室的肝微粒体清除率差了 3 倍,这种异质性直接会拉偏主成分。
  • 多重共线性与冗余(Multi-collinearity & Redundancy):分子描述符之间本来就是相关的。比如 logP 和分子极性表面积(TPSA)强相关,分子量和分子折射率也相关。PCA 本质上是降维去冗余,但如果冗余数据本身就有噪声,第一主成分很可能只是个“噪声放大器”。

数据特点速查表

特点表现对 PCA 的影响
高维度特征数 > 样本数协方差矩阵不稳定,易过拟合
稀疏性大量缺失值缺失插补方法选择不当会扭曲方差
异质性来源多样,噪声不统一异常值主导主成分方向
多重共线性描述符之间强相关主成分解释性变差,方差聚集

4.2 三大常见挑战:踩坑实录

光有特点还不够,咱们得聊聊实战中的挑战。说白了,这三个坑我当年都踩过。

挑战一:标注偏差(Label Bias)

为什么说标注偏差是大问题?因为 ADMET 数据的金标准往往是“有或无”或者“活性/非活性”。但不同课题组对“活性”的阈值定义不同。
比如 hERG 抑制,有人用 IC50 < 1 μM 算阳性,有人用 < 10 μM。这种二分类阈值的不一致,直接导致数据集的分布偏移。做 PCA 时,这种偏差会混进方差里,你根本分辨不出哪个维度是真实的化学空间差异,哪个是定义差异。

我曾经踩过的坑:

有一次我整理公开数据集做 PCA 质控,发现第一主成分完美区分了两个子集。一开始我还以为找到了关键结构特征,后来仔细一查,原来是两个实验室用的酶批次不一样,导致活性标定差了 2 个数量级。嗯,这种偏差你必须先做校正,否则 PCA 等于白做。

挑战二:批效应(Batch Effect)

这个问题在工业界太常见了。同一台仪器,不同时间测的板子(Plate),结果就是有系统性差异。哪怕细胞批次不同,代谢稳定性数据都会飘。

  • 表现:PCA 打点时,不同批次的数据自动聚成几个独立的簇,且跟化学结构无关。
  • 诊断:用颜色标记批次,看 PCA 得分图。
  • 怎么办:先做批量校正(比如 Combat 算法),再跑 PCA。

挑战三:类别极度不平衡(Extreme Imbalance)

拿毒性数据举例。真正有强毒性(比如 Ames 试验阳性)的分子其实很少,可能只有 5%-10%。剩下的都是无毒的。这种时候,PCA 如果只做无监督降维,它根本看不到“毒性特征”的方差,因为少数类的方差被多数类淹没了。

# 以 Ames 数据为例,极不平衡下的 PCA 警告
# 如果你在二维 PCA 图上强行画决策边界,基本没用。
# 因为 PC1 和 PC2 解释的都是非毒性相关的结构差异。
# 正确的做法是先做数据平衡(如 downsampling 或 SMOTE),
# 或者直接做 supervised PCA(利用标签指导成分提取)。

4.3 实战案例:一个药物 ADMET 数据清洗案例

理论讲完了,咱们看个我当年做过的实际案例。

那是一个含有 5000 个化合物、12 个 ADMET 终点(包括 Caco-2, hERG, CYP, 血浆蛋白结合率等)的数据集。上来就做 PCA 会怎么样?

# 原始数据直接 PCA(错误示范)
from sklearn.decomposition import PCA
import pandas as pd

df_raw = pd.read_csv("admet_raw.csv")  # 包含缺失值、噪声
pca = PCA(n_components=2)
# 这里省略缺失值处理,直接填充均值
result = pca.fit_transform(df_raw.fillna(df_raw.mean()))
print(result)  
# 结果:PC1 几乎全由血浆蛋白结合率贡献
# 原因是这个终点方差极大,其他终点被淹没了。

正确的质控流程应该是这样的:

  1. 缺失值诊断:每个终点的缺失率多少?如果某个终点缺失 > 80%,我建议直接删掉这列,否则插补出来的方差全是假的。
  2. 异常值阈值:比如清除率数据,Clint 如果大于 300 μL/min/mg,大概率是实验误差。先做 Winsorize 缩尾,再归一化。
  3. 分层缩放:不同 ADMET 终点的量纲不一样(logD 是 0-5,Caco-2 是 0-100)。必须做 Z-score 标准化,而且我习惯按终点分组做标准化,而不是全局标准化。

我的小技巧:

做 PCA 之前,先跑一个简单的相关性热图。如果你看到某个描述符跟所有成品主成分都不相关,或者和其他描述符高度共线,先剔除这些冗余特征,能大大提升 PCA 的可解释性。

4.4 本章知识体系:一张图搞清楚

下面这张 SVG 图,展示了我刚才说的整个 ADMET 数据挑战与质控流程。你把这个流程背下来,后面分析的时候就能快速定位问题。

ADMET 数据特点与挑战 - 质控框架 原始 ADMET 数据集 高维度小样本 稀疏性与异质性 标注偏差/阈值定义 批次效应 & 仪器差异 挑战1:类别不平衡 挑战2:数据冗余/共线性 挑战3:噪声干扰方差 质控后清洗数据集 PCA 质控分析

4.5 数据质量分档表

最后给一张我常用的数据质量分级标准。新手老手都适用,你可以在项目实施前根据这张表给数据打个分。

质量等级标准PCA 适用性
A 级(高质)缺失率 < 10%,无显著批效应,阈值统一直接做,效果很好
B 级(待处理)缺失率 10%-40%,有少量异常值需清洗/插补后使用
C 级(危险)缺失率 > 40%,或者维度严重超标建议放弃该终点,或做特征选择
D 级(不可用)标注矛盾(同一分子正负标签冲突)PCA 结果不可信,先修复数据源

我的建议:

拿到数据集后,先花 10 分钟做一次快速扫描:打印每个终点的缺失数量,看看异常值分布,再画个批次-得分分布图。这 10 分钟往往能帮你省掉后面几天的无效分析。