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 几乎全由血浆蛋白结合率贡献
# 原因是这个终点方差极大,其他终点被淹没了。
正确的质控流程应该是这样的:
- 缺失值诊断:每个终点的缺失率多少?如果某个终点缺失 > 80%,我建议直接删掉这列,否则插补出来的方差全是假的。
- 异常值阈值:比如清除率数据,Clint 如果大于 300 μL/min/mg,大概率是实验误差。先做 Winsorize 缩尾,再归一化。
- 分层缩放:不同 ADMET 终点的量纲不一样(logD 是 0-5,Caco-2 是 0-100)。必须做 Z-score 标准化,而且我习惯按终点分组做标准化,而不是全局标准化。
我的小技巧:
做 PCA 之前,先跑一个简单的相关性热图。如果你看到某个描述符跟所有成品主成分都不相关,或者和其他描述符高度共线,先剔除这些冗余特征,能大大提升 PCA 的可解释性。
4.4 本章知识体系:一张图搞清楚
下面这张 SVG 图,展示了我刚才说的整个 ADMET 数据挑战与质控流程。你把这个流程背下来,后面分析的时候就能快速定位问题。
4.5 数据质量分档表
最后给一张我常用的数据质量分级标准。新手老手都适用,你可以在项目实施前根据这张表给数据打个分。
| 质量等级 | 标准 | PCA 适用性 |
|---|---|---|
| A 级(高质) | 缺失率 < 10%,无显著批效应,阈值统一 | 直接做,效果很好 |
| B 级(待处理) | 缺失率 10%-40%,有少量异常值 | 需清洗/插补后使用 |
| C 级(危险) | 缺失率 > 40%,或者维度严重超标 | 建议放弃该终点,或做特征选择 |
| D 级(不可用) | 标注矛盾(同一分子正负标签冲突) | PCA 结果不可信,先修复数据源 |
我的建议:
拿到数据集后,先花 10 分钟做一次快速扫描:打印每个终点的缺失数量,看看异常值分布,再画个批次-得分分布图。这 10 分钟往往能帮你省掉后面几天的无效分析。