第一章:ADMET预测模型概述与常见错误分类

各位搞药物设计的同行,今天我们聊聊ADMET预测模型里那些坑。

我习惯把ADMET模型比作药物分子的「筛选漏斗」。分子设计得再花哨,最后过不了吸收、分布、代谢、排泄、毒性这几关,一切归零。但这几年我在项目中见过太多人把模型预测结果当成「圣旨」,出了问题第一反应是「模型不准」——其实很多错不在模型,在人。

好,咱们从头捋一遍。

1.1 ADMET到底在预测什么?

先快速对齐几个概念。ADMET不是一个指标,是一组性质。

缩写 全称 一句话解释 常见的预测终点
A Absorption 药物怎么进到血液里 Caco-2通透性、人结肠腺癌细胞系渗透性、F(口服生物利用度)
D Distribution 药物在体内怎么跑 血浆蛋白结合率、表观分布容积、组织/血浆分配比
M Metabolism 药物被哪些酶改造 CYP450抑制/诱导、代谢稳定性(半衰期)、代谢产物鉴定
E Excretion 药物怎么排出去 肾清除率、胆汁排泄、转运体介导的排泄
T Toxicity 药物有没有毒 hERG、AMES致突变、肝毒性、心脏毒性

我个人的经验:不要试图用一个模型预测所有ADMET性质。你想想看,溶出度和肝微粒体稳定性的物理机制天差地别,用一个骨架硬套两个任务,结果通常两边都不讨好。

1.2 常见错误类型:我在项目里踩过的那些雷

做ADMET预测模型时,错误基本集中在三个层面。我把它们分成「数据层」「模型层」和「应用层」。你对照着看看自己栽在哪个坑里过。

数据层错误

  • 数据质量不过关:我在一家药企做过内部数据集清洗。同一批化合物测了两遍,Caco-2值差出两个数量级。问下来是实验员用了不同的pH缓冲液。数据源有系统误差,模型学出来就是错的。
  • 数据分布不均:训练集里90%是阴性样本,模型学会了全判阴性——准确率还特别高,但完全没有预测能力。
  • 结构重复或近重复:同一个骨架以略微不同的结构重复出现,模型在训练集里过拟合了结构相似性,而不是真正的理化性质关联。

模型层错误

  • 特征工程出问题:别人做hERG预测用了一堆2D指纹,我也照搬。结果模型的AUC很高,但换一个骨架完全失效。后来发现我的分子骨架本来就和训练集高度相似——说白了,模型背的是结构模板,而不是毒性机制。
  • 验证方式不对:随机划分训练集测试集?我建议你用时间戳划分,或者按骨架聚类划分。随机划分会让模型看到太多结构近似的化合物,泛化能力被严重高估。实际应用时一见面孔新一点的分子,模型立刻「掉分」。
  • 超参数拍脑袋:我记得有次跑CYP2D6抑制预测,其他人用的是LightGBM,默认参数就跑出了不错的AUC。我换成深度神经网络,调了一个月的参数,结果还不如人家的默认配置。不是深度模型不好,是我在小数据集上强行上深度学习,数据量不够,模型学不到泛化的模式。

应用层错误

  • 适用范围外推:模型的适用域(Applicability Domain)是个常被忽略的东西。你用一个训练自含氟最多两个原子的模型,去预测含三氟甲基的分子?我曾经在项目里干过这种事,结果预测的logD和实测差了2.5个单位。模型根本没见过这类碎片,预测就是「自由发挥」。
  • 单一指标迷信:只看R²或AUC就下结论。R²高不代表模型能正确排序,AUC高不代表在阳性样本上预测准。在ADMET场景里,漏掉一个有毒的分子比误报十个无毒分子更致命。

避坑指南:我曾经把一个hERG预测模型投入项目时,只看了测试集AUC=0.92。实际筛完300个类似化合物,只找出了3个真的hERG高风险。模型把大部分阳性都判成了弱阳性——AUC高是因为它在阴性样本上预测得特别准。阴性样本占了98%。嗯,这个教训挺深刻的。

1.3 错误排查思路:给你个工作流

做ADMET预测模型,别出了错就开始改架构加数据。我建议从下面四条线入手排查。我首推「从失败用例反向追溯」的思路——先定位最离谱的预测错例,再反推问题出在哪个环节。

下面这张图是我自己做排查时画的:

ADMET预测模型错误排查流程 异常预测定位 数据质量审计 特征与表征 模型验证策略 适用域检查 数据质量审计 检查去重/异常值/批次效应 验证实验条件一致性 确认理化性质单位 特征与表征 指纹/描述符选择 是否保留手性信息 特征冗余/共线性 模型验证策略 骨架划分 vs 随机划分 时间和外部验证 交叉验证折叠设置 适用域检查 欧氏距离/密度估计 预测置信度评估 结构碎片归纳 修正:数据修复/特征清洗/模型结构调整/AD域过滤 再验证 → 部署/迭代 排查路线:从异常结果→分层诊断→修正→再验证

这张图我自己项目里一直在用。

发现预测结果离谱时,别急着调模型。先查数据,再查特征和验证方式,最后查适用范围。我个人最多遇到的情况是数据层出问题,尤其批次效应——不同批次的实验条件有差异,但被当作同一分布喂给了模型。

在实际项目中,核心排查思路可以用一句话概括:从预测误差最大的样本切入,反向分析每个环节的贡献。具体来说:

  1. 收集误差分布:在测试集或新数据上,找到预测值与实测值偏差最大的前5~10个案例。
  2. 数据端检查:这些案例有没有实验记录不清、数据拼接错误、单位不一致?我在某次排查中发现pH数据被混用了,因为实验记录里部分样本的pH是7.4,另一部分是6.8。模型学会了区分pH,而不是区分性质。
  3. 特征端检查:出错的分子有没有特殊子结构?它们包含训练集中极少见的片段?如果是,该考虑扩充数据或做AD域过滤。
  4. 模型端诊断:重新做一次骨架划分的验证。如果模型AUC大幅下降,说明泛化能力不够。我建议跑个简单的基线模型(比如随机森林+ECFP4),和你的复杂模型对比一下,看看复杂模型「好」在哪里——有时候基线就够用。
  5. 最终决策:如果所有策略都试过误差依旧大,那就接受模型在当前化学空间下不可用。强行部署只会给你更多项目麻烦。

一个小技巧:我每次做ADMET模型都会输出一张「预测误差 vs 训练集最近邻距离」的散点图。如果误差随着结构相似度降低而增大,说明模型外推能力不好——这是AD域外推问题的经典信号。

好,本章我们覆盖了ADMET的基本概念、我把最常遇到的错误归了类,也给出了一个实用的排查工作流。从下一次章节开始,我们会逐类深入,用实际案例拆解每种错误该怎么定位、怎么修。先有个全景印象,后面学起来更有底气。