4. 机器学习在ADMET中的应用

说到机器学习在ADMET里的落地,我个人觉得这其实是药物发现流程里最能体现“数据驱动”的地方。以前我们搞药物化学,更多是靠经验和运气,现在有了模型,至少能提前筛掉那些明显不合格的分子。

但你别以为拿个随机森林或者图神经网络往数据上一丢就能出好结果。我这些年踩过的坑,足够写一本避坑指南了。今天咱们就聊聊,机器学习到底怎么用在ADMET预测上,以及那些容易被忽略的细节。

4.1 数据准备:最容易被低估的一步

我见过不少项目,模型结构选得很花哨,最后效果却很差。问题出在哪?十有八九是数据本身有问题。

4.1.1 数据从哪里来

ADMET数据源大致分三类:

  • 公开数据库:比如ChEMBL、PubChem、Tox21。好处是量大,坏处是质量参差不齐。我曾经从ChEMBL拉了一批Caco-2渗透性数据,结果发现同一个化合物在不同实验室测的值能差两个数量级。
  • 企业内部数据:质量最高,但数量少,而且通常涉及机密。这时候就需要用迁移学习或者半监督学习来补足。
  • 文献挖掘:自然语言处理可以从论文里提取数据,但精度得靠人工校验。我有个合作项目,文本挖掘出来的IC50值,有15%是错的。
数据来源 优点 缺点
公开数据库(ChEMBL等) 数据量大,覆盖面广 噪声高,实验条件不统一
企业内部数据 质量高,实验条件可控 样本数量少,存在偏差
文献/专利挖掘 信息丰富,可获新知识 提取精度有限,需手动清洗

4.1.2 数据清洗:这步偷懒后面全白搭

拿到原始数据,第一件事不是建模型,而是清洗。我一般会做这几步:

  1. 去重:同一个SMILES在不同批次里出现,保留质量最高的那个。
  2. 标准化:把分子统一成标准SMILES,比如处理互变异构、电荷校正。
  3. 异常值处理:比如logD测出来是-10或者+15,这种明显不对劲。我会先用领域知识判断,再考虑要不要剔除。
  4. 数据分布检查:如果数据严重不平衡(比如99%是低毒性,1%是高毒性),直接建模基本要翻车。
我的小习惯:清洗完数据后,我会用t-SNE或者UMAP对分子指纹做个降维可视化。看一眼就知道有没有明显的离群点或者批次效应。这个方法我用过很多次,每次都帮我省下好几个调试模型的下午。

4.2 分子表征:机器看到的和你看到的完全不同

说白了,模型不认识分子结构。你得把分子翻译成它能理解的语言。为什么这个问题重要?因为再好的算法,喂进去的是垃圾特征,出来的必然是垃圾预测。

4.2.1 常用特征类型

目前主流的分子表征方式有:

  • 分子指纹:比如ECFP、MACCS。简单直接,但丢失了空间结构信息。
  • 物理化学描述符:分子量、logP、氢键供体/受体个数等。这些在ADMET里很靠谱,因为很多性质本身就跟它们高度相关。
  • 图神经网络(GNN)表征:直接把分子当图来学,自动提取特征。这是现在最火的方向,但需要注意数据集大小——小数据集上反而容易过拟合。
  • SMILES序列:让模型像学自然语言一样学SMILES,但SMILES顺序本身是任意的,容易引入噪声。
我个人习惯是:先用手把手构建的物理化学描述符+简单指纹搭一个基线模型(比如随机森林或者XGBoost)。如果数据集够大(>5000个样本),再上GNN或者Transformer这类模型。这样既能快速出结果,又不至于踩进“深度学习万能论”的坑。

4.3 模型选择与评估:别只盯着准确率

评价一个ADMET模型,光看准确率是不够的。你想想看,在药物发现中,一个模型如果犯了假阴性错误(把高毒性化合物预测成安全),那后面所有下游实验都白做了。假阳性虽然浪费钱,但至少能补救。

4.3.1 常用评价指标

  • AUC-ROC:分类任务的首选,但要注意不平衡数据下它可能过于乐观。
  • 精确率-召回率曲线:更适用于高度不平衡的ADMET数据。
  • 均方误差(RMSE)/平均绝对误差(MAE):回归任务用,比如logD、溶解度预测。
  • 可接受误差范围量化:比如“误差在0.5 log单位以内的比例”。这个更贴近实际需求。

4.3.2 模型比较:我踩过的坑

我在一个肝毒性预测项目上,最开始用传统机器学习(随机森林、XGBoost)跑了几个模型,AUC都在0.85左右。后来上了图神经网络,AUC冲到0.90。我差点以为自己捡到宝了。

结果在做时间轴验证(用2019年的数据训练,预测2020年新发表的化合物)时,GNN的AUC掉到了0.72,而随机森林只降到0.81。为什么会这样?因为GNN学到了训练集里某些分布特征,而不是真正的化学规律。嗯,这里要注意:泛化能力才是硬道理。

我当年犯过的错:在一个ADMET建模任务上,我随机拆分数据后取得了0.92的准确率,沾沾自喜。后来才发现,同一个化合物骨架的不同类似物被分到了训练集和测试集里,本质上是在“记忆”而非“预测”。从那以后,我再也不用随机拆分来评估ADMET模型了——必须用骨架拆分或时间轴拆分。

4.4 集成学习与ADMET:1+1>2

单一模型通常存在系统偏差。比如决策树容易过拟合,支持向量机在数据空间分布上容易产生误判。怎么办?把多个异质模型集成起来。

我用得最多的是堆叠(Stacking):

# 伪代码思路:两层集成
# 第一层:基学习器
model_1 = RandomForestClassifier()
model_2 = XGBClassifier()
model_3 = GraphNeuralNetwork()

# 第二层:元学习器(用简单模型)
meta_model = LogisticRegression()

# 训练流程
# 1. 用5折交叉验证,让每个基学习器输出OOF预测
# 2. 把OOF预测作为新特征,训练元学习器
# 3. 在测试集上,先让基学习器预测,再喂给元学习器

4.4.1 为什么集成在ADMET里特别有效

ADMET数据噪声大、样本量小。单一模型容易掉进局部最优。集成学习本质上是“投票”:大家的共识往往更接近真实。我测试过一个CYP450抑制预测数据集,集成模型的AUC比最好的单一模型高出0.04。别小看这0.04,在药物发现早期阶段,它可能意味着少做一轮40个化合物的实验。

4.5 可解释性:模型告诉你“为什么”

药化同事最受不了的就是“黑箱”。你跑了一个模型说这个化合物有问题,他们总要问一句:“为什么?”所以,可解释性在ADMET建模里绝对不是可选项,而是必选项。

4.5.1 常用可解释性方法

  • SHAP值:能告诉你哪个分子特征对预测贡献最大。比如在hERG毒性预测中,SHAP可能会指出碱性氮原子是风险源。
  • 注意力权重(Attention):用于GNN或Transformer,可视化模型重点关注哪些原子或化学键。
  • 描述符重要性排序:对树模型来说,展示特征重要性排名。
我记得有一次,SHAP分析发现在一个CYP2D6抑制模型中,“芳香环数量”居然是第二重要的特征。我们后来跟踪实验验证,确实是更多芳香环的分子更容易与CYP2D6结合。这个发现后来直接被用到了新化合物的设计中。

4.6 知识图谱:把ADMET关联起来看

单个ADMET性质之间其实存在复杂的耦合关系。比如增加溶解度常会降低渗透性(Lipinski规则里的“矛盾三角”)。单独预测每个性质,就没有考虑到这种内在关联。

我最近两年在推的一个方向是多任务学习+知识图谱:把ADMET的15-20个核心性质放在一个统一框架里,共享底层的分子表征,但每个性质有自己的输出头。这样做的好处有两个:

  1. 数据互补:某个性质数据少,其他性质的数据可以帮助学习更好的分子表征。
  2. 一致性约束:例如logD和溶解度之间存在物理关系,模型不能违背这个关系。
不过要小心:多任务学习要求不同任务的数据量不能差距太大,否则数据多的任务会“霸占”底层表征,让数据少的任务学不到东西。我踩过这个坑,后来用了一个动态权重调整策略才解决。

4.7 本章知识体系总结

上面这张图把机器学习在ADMET应用中的核心流程串起来了。从原始数据开始,经过清洗、表征、建模、评估,到最后交付给药化学者。每个环节都有需要注意的“坑”。

说实话,我这么多年的经验归结起来就是一句话:数据质量第一,模型结构第二,评估方式第三。顺序不要搞反了。很多人一上来就问“该用哪个深度学习框架”,我反而会问“你数据洗了几遍?你用了什么拆分方式验证?”。答案不一样。