1. ADMET 预测与 PCA 质控概述

说起来,ADMET 预测这件事,在药物研发里越来越重要了。
数据量暴涨,但质量却参差不齐——你有没有遇到过“垃圾进,垃圾出”的窘境?

我记得刚入行的时候,同事递给我一份 ADMET 预测数据,里头一堆异常值,结果用那个模型去筛选候选分子,真是浪费了整整 3 周实验资源。
打那以后,我养成了一个习惯:不管谁的预测数据进来,先做质控,再谈建模。

1.1 ADMET 预测到底在预测什么?

说白了,ADMET 是一串英文首字母拼起来的:
吸收 (Absorption)、分布 (Distribution)、代谢 (Metabolism)、排泄 (Excretion)、毒性 (Toxicity)。

打个比方:你设计了一个分子,想让它当口服药。
吸收 决定它能不能穿过肠壁;分布 决定它能不能到达靶点;代谢 和 排泄 决定它能在体内撑多久;毒性 则是一条红线——过了就得重来。

量化这些性质,以前全靠动物实验,烧钱又耗时。
现在算法抬了头,尤其是 QSAR / 机器学习模型 能在几天内跑出成千上万个分子的预测值。
但问题也来了——数据太脏,模型再好也救不了。

核心矛盾:预测模型的精度,往往受限于输入数据的质控水平。
你想想看,连训练集都有离群点,模型学到的“规律”还能靠谱吗?

1.2 PCA 是怎么粘上 ADMET 的?

PCA —— 主成分分析 —— 听起来像个统计学术语。
但其实它在我这里就三个作用:降维、去噪、可视化。

ADMET 特征呢?少则几十维,多则上千维。
比如 logP、分子量、氢键供体数、极性表面积、溶解度……一堆数字堆在一起,你根本看不出来哪些样品是“可疑”的。

PCA 能把高维数据压缩到两三个主成分上。
于是,那些藏在 50 个特征里的异常样品,一下子就飞出了 95% 置信椭圆 —— 这就是我想要的质控抓手。

个人习惯:拿到一份新的 ADMET 预测数据后,我第一件事不是跑模型,而是做一次 PCA + 置信椭圆的快速质控。
这么做至少能筛掉 10–20% 的错误录入或离群化合物。

1.3 为什么质控必须前置?

我在项目里遇到过几次,因为质控没做好,导致后面整个模型的 Q² 和 R² 都偏低。
花了大量时间去调参,最后发现是数据里混进了结构错误的分子 SMILES。

质控前置给你带来的好处,我列了个表:

环节 没有 PCA 质控 做了 PCA 质控
特征空间可见性 盲人摸象,只能看单变量统计 全局看到样品在特征空间里的分布
离群点检出 靠人工经验或极值判断,漏检多 基于马氏距离 / 置信椭圆自动化标记
共线性问题 特征冗余,模型不稳定 PCA 降维后消除共线性,模型更稳健
批次效应 不同实验室的预测数据混杂 PCA 投影直接暴露批次差异,可矫正

说白了,质控就是建模的下限保卫战。
别小看这个步骤,它往往能守住你后面几个月的建模工作量。

1.4 整个流程长什么样?

我给这个课程画了一张框架图,你扫一眼就能明白本章的核心逻辑:

ADMET 预测数据 PCA 质控框架 原始 ADMET 数据 特征标准化 + 缺失值处理 PCA 降维 (n_components=2/3) 质控检测
置信椭圆 / 马氏距离 质控干预
剔除 / 标记 / 重测
质控后 ADMET 数据 说明:PCA 质控不是一次性的,建议在每次数据更新或模型迭代后重新跑一遍流程

嗯,这里要注意:特征标准化这一步别跳。
我见过不少人直接拿原始 logP 和分子量去跑 PCA,结果 PC1 几乎被分子量这一个变量完全主导了——这是典型的一个变量就撑死了方差,反而把真正的多变量离群点给藏住了。

避坑指南:我曾经接手过一个外包项目的数据,对方说“已经做过质控了”。
结果我 PCA 投影一看,有一个样品飘到了 10 个标准差之外——原来他们根本没跑标准化,那个样品的分子量比其他化合物大了 3 倍。

1.5 你需要什么工具?

这个课程主要用 Python 生态 + 少量命令行工具。
我建议你先把这些装好:

# 基础数据科学生态
numpy >= 1.21
pandas >= 1.3
scikit-learn >= 1.0
matplotlib >= 3.4
seaborn >= 0.11

# 化学信息学工具
rdkit >= 2021.09

# 交互式可视化(可选)
plotly >= 5.5

装好后,跑一行简单的读取加 PCA,就能看到你的 ADMET 数据在质控前的“素颜”了:

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 读取你的 ADMET 预测数据(示例路径)
df = pd.read_csv("admet_predictions.csv")

# 选取数值特征列
features = ["logP", "MW", "HBA", "HBD", "TPSA", "logS"]
X = df[features]

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA 降到 2 维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 快速查看前两个主成分的方差解释率
print("Explained variance ratio:", pca.explained_variance_ratio_)

我通常会 在这步之后直接画一个散点图 + 置信椭圆,离群点一眼就能扫出来。
后面几章节我会手把手教你怎么画这个质控图。

1.6 本章要点回顾

  • ADMET 预测 靠的是数据驱动的 QSAR / 机器学习模型,但输入数据的质量直接决定模型上限。
  • PCA 质控 本质是用降维 + 可视化把高维特征空间的异常暴露出来。
  • 标准化不可省略:不做标准化,PCA 容易被尺度过大的变量绑架。
  • 质控一定要前置:数据进模型之前,先花 10% 的时间做质控,能省掉后面 40% 的 debug 时间。