3. 传统ADMET预测方法介绍

说到ADMET预测,大家可能觉得这是个新东西。其实在我们搞药物设计的圈子里,这活儿已经干了几十年了。今天我就带大家捋一捋,那些年我们是怎么在没有深度学习、没有大模型的情况下,硬着头皮预测化合物性质的。

嗯,这里要先说明我的立场。我不是说传统方法过时了,恰恰相反。很多经典方法到今天依然是工业界的标配。我见过太多团队一上来就上复杂模型,结果连最基本的LogP都算不准,那才叫尴尬。

3.1 物理化学性质预测

这部分是最基础的,也是最靠谱的。说白了就是靠化合物的结构,算出一些物理化学参数。我刚开始做项目时,第一个学的东西就是怎么用手算pKa——虽然现在都用软件了,但那个思路我一直留着。

性质 常用方法 我踩过的坑
LogP(脂水分配系数) 原子贡献法、碎片法 芳香族化合物的LogP经常偏大,尤其是含杂环时
pKa(酸解离常数) Hammett方程、DFT计算 溶剂效应必须考虑,真空下的pKa完全不可信
溶解度 YSI法、General Solubility Equation 晶型影响比计算大得多,我吃过亏
渗透性 分子量、TPSA、氢键供体/受体计数 Lipinski规则只适合口服,眼用制剂完全不同

我个人习惯用开源工具先跑一轮,比如RDKit里内置的LogP计算器。速度快,而且对于大多数非专利药,精度够用。

核心思路:传统物理化学性质预测,靠的是经验参数和统计回归。不依赖大量数据,但适用范围有限。

3.2 基于规则的方法

说起规则方法,我脑海里第一反应就是Lipinski五法则。1997年那篇论文我读了不下十遍。你想想看,一个简单的规则,只靠几个阈值,就能筛掉大量的失败候选药——这在工业界简直是神器。

但我也要泼个冷水。我在诺华做项目时遇到过一个化合物,完全满足五法则,结果在大鼠体内吸收率不到5%。做了PEPT1转运体实验才发现,这化合物是转运体的底物,但饱和之后就直接穿不过去了。

常见的规则方法包括:

  • Lipinski五法则(Ro5): 分子量≤500、LogP≤5、氢键供体≤5、氢键受体≤10。用于判断口服生物利用度。
  • Veber规则: 可旋转键≤10、TPSA≤140 Ų。用于预测大鼠口服暴露量。
  • GSK四规则: 分子量≤400、LogP≤4、溶解度≥60 μg/mL、Caco-2渗透性≥100 nm/s。偏商业化,更严格。
  • Pfizer三规则: 分子量≤300、LogD≤3、氢键供体≤3。适合中枢神经系统(CNS)药物。

避坑指南: 我曾经在一个CNS项目中完全依赖Lipinski规则筛选化合物库,最终一个候选分子都没进临床。问题出在规则对CNS药物过于严格——实际上CNS药物的分子量上限可以到450,只要LogD和BBB渗透性合适。从那以后我每次都会检查规则是否适用于项目靶点和适应症。

3.3 定量构效关系(QSAR)

QSAR这个词听起来很高大上,其实就是找结构和活性之间的数学关系。1960年代Hansch和Fujita提出了经典的Hansch分析,用疏水参数、电子参数和立体参数做多元线性回归。咱们做药物化学的,应该有印象吧?

我记得在GSK工作那段时间,一个老前辈教我怎么用手算QSAR:拿一把尺子量分子的疏水常数,再用纸笔解方程。他说:“孩子,你先把基础打牢了,后面用什么AI都不怕。”现在想来,这句话是真的有道理。

常见的QSAR方法可以分成这几类:

  1. 线性方法:多元线性回归(MLR)、偏最小二乘法(PLS)。适合小数据集,解释性好。
  2. 非线性方法:人工神经网络(ANN)、支持向量机(SVM)。适合大数据,但容易过拟合。
  3. 分类方法:决策树、随机森林、k近邻(kNN)。适合二元分类问题,如是否hERG阳性。

举个代码例子,用Scikit-learn做简单的QSAR分类模型:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score

# 假设 X 是分子描述符矩阵,y 是ADMET标签(1=好,0=差)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

model = RandomForestClassifier(
    n_estimators=100, 
    max_depth=10,
    random_state=42)

model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"ROC-AUC: {roc_auc_score(y_test, y_pred):.3f}")

看到没?核心就那么几行。但参数调优和特征选择才是真正花时间的部分。我遇到过有人拿到400多个描述符直接扔进模型,结果ROC-AUC只有0.55——比瞎猜好不了多少。

3.4 基于物理模型的模拟方法

这部分是计算化学的看家本领。分子动力学、自由能微扰、对接打分...听起来都挺吓人,但咱们做ADMET预测,不用全部精通。挑几个关键的就行。

  • 分子对接:预测小分子是否可能与人血清白蛋白结合。结合分数高了,说明游离浓度低,药效差。
  • 分子动力学模拟:看小分子在膜中的渗透行为。一般跑个100ns就能看出趋势。
  • 量子化学计算:精确预测pKa和氧化还原电位。适合代谢位点预测。

个人建议: 物理模型计算成本高,不适合大规模筛选。我一般用它做最后几个化合物的精细评价,或者用来验证QSAR模型的外推能力。

下面我画了一张图,把传统ADMET预测方法的体系整理了一下。你看这个结构,就是从分子结构出发,向不同方向发散。

传统ADMET预测方法知识体系 分子结构 物理化学性质预测 LogP/pKa 溶解度 渗透性 基于规则的方法 Lipinski规则 Veber规则 企业级规则 定量构效关系(QSAR) 线性模型 非线性模型 集成方法 传统方法的核心特征 依赖经验参数和统计回归;适合小数据集,解释性强; 局限性:泛化能力差,对新型骨架预测精度低 不适合处理高维描述符和复杂非线性关系

图里能看出来,传统方法虽然结构清晰,但也有明显短板。比如说QSAR模型,我对一个化合物库训练得很好,但换一个完全不同的骨架,可能就直接失效了。

3.5 传统方法的局限与启示

聊了这么多,我总结一下传统方法的几个痛点,也是后面为什么需要交叉验证的根源:

  • 泛化能力有限: 我说的直白点,很多传统模型就是个“死记硬背”的货。训练集里的化合物会做,出了域就完蛋。
  • 评估指标单一: 以前大家就看看R²,看看Q²(交叉验证的R²)。但这两个指标对于ADMET这种高异质性数据,根本不靠谱。
  • 没有不确定性量化: 模型给你一个预测值,你敢直接用吗?你不知道它有多自信。
  • 数据利用不充分: 传统的QSAR通常只用一个训练集和一个测试集,明明是少得可怜的数据,还只用了浅层的模式。