4. 代谢(Metabolism)预测模型的性能评估
代谢预测,说白了就是猜你的药进了人体会被肝脏怎么处理。是快速被分解,还是慢悠悠地在体内转悠?代谢位点又在哪里?这些信息直接决定了药效能持续多久、会不会产生毒性。
我在这行摸爬滚打十来年,见过太多候选分子因为代谢预测不准,后期实验数据惨不忍睹。所以,怎么用正确的指标去衡量模型的“踩坑”能力,这事特别重要。
4.1 代谢稳定性预测
代谢稳定性,指的是药物分子在体内被代谢掉的快慢。模型输出的通常是一个半衰期(t½)或者内在清除率(CLint)。
这个任务分成回归和分类两种玩法。
4.1.1 回归指标:R² 与 RMSE
如果你想让模型直接预测 t½ 的数值,那就要看回归指标了。
- R² (决定系数):衡量模型解释了多少数据的变异。越接近1,说明模型的预测趋势越准。我个人习惯,一个合格的代谢稳定性模型,R²至少要在0.6以上。
- RMSE (均方根误差):衡量预测值和真实值之间的绝对偏差。单位和你预测的数值一样,比如分钟或者 mL/min/kg。RMSE越小越好。
给大家看一段我用 Python 计算这些指标的例子:
from sklearn.metrics import r2_score, mean_squared_error
import numpy as np
# 真实值 (实际半衰期, 单位: 分钟)
y_true = [30.2, 145.7, 8.9, 220.1, 65.3]
# 模型预测值
y_pred = [28.5, 138.2, 10.1, 215.0, 70.8]
r2 = r2_score(y_true, y_pred)
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f"R²: {r2:.3f}")
print(f"RMSE: {rmse:.2f} 分钟")
4.1.2 分类指标:准确率、敏感度、特异度
很多时候,我们不需要精确数值,只需要判断代谢是“快”还是“慢”。这就变成了二分类问题。
为什么会有这种分类场景?因为实验噪音大,数值本身就是个范围。你想想看,如果一个分子肝微粒体实验测三次,结果分别是 19、22、28 分钟,你还非得让模型精确预测到 23 吗?没必要。
我会把 t½ < 30 分钟 定义为“快速代谢”,t½ > 120 分钟 定义为“慢速代谢”。中间的归为中等。
评估这类模型,我们看的是混淆矩阵衍生的指标:
- 敏感度 (Sensitivity):实际是快速代谢的分子里,模型找对了多少。我更关心这个,因为漏掉一个快速代谢分子,意味着你后期可能要花大价钱优化。
- 特异度 (Specificity):实际是慢速代谢的分子里,模型认对了多少。这个指标帮我避免把好分子误判成药效差的“坏分子”。
- AUC-ROC:综合排名能力。AUC 超过 0.8 基本算可用。
我曾经在某次项目里,数据集中 90% 是慢代谢,10% 是快代谢。模型直接预测“全部慢代谢”,准确率 90%,但敏感度是 0。这个模型根本没用。
所以遇到不平衡数据,我建议用更合适的指标,比如 F1 分数 或 马修斯相关系数 (MCC)。
4.2 代谢位点预测
这个任务难度更大。它不仅要告诉你代谢不稳定,还要告诉你肝脏中的 CYP450 酶具体攻击了分子的哪个原子。这直接指导你如何做结构修饰。比如氟原子堵住代谢位点,或者引入一个甲基。
4.2.1 Top-K 准确率
正常分子有几十个原子,可能只有 1-2 个是主要代谢位点。所以 Top-K 指标很实用。
- Top-1 准确率:模型预测的 最可能 的代谢位点,是否在真实的代谢位点列表中。这个是硬指标。
- Top-2 / Top-3 准确率:给模型一次“开卷考试”的机会。只要真实的代谢位点出现在模型预测的前 2 个或前 3 个原子中,就算预测成功。
我一般会要求 Top-2 准确率超过 0.7,实战中才敢放心用模型来筛选。
计算逻辑如下:
def top_k_accuracy(ground_truth_atoms_list, predicted_scores, k=2):
correct = 0
for true_atoms, scores in zip(ground_truth_atoms_list, predicted_scores):
# 按预测分数降序排列原子索引
top_k_atoms = np.argsort(scores)[-k:][::-1]
if set(top_k_atoms) & set(true_atoms):
correct += 1
return correct / len(ground_truth_atoms_list)
4.2.2 ROC-AUC 的适用性
这里也能用 ROC-AUC。但你要注意,代谢位点预测本质上是多标签分类(每个原子都是一个潜在的预测目标)。在计算 ROC-AUC 时,通常把每个原子当成一个独立的二分类任务,然后计算宏平均或微平均。
这个指标的优点是阈值无关。但说实话,在实际项目里,我更依赖 Top-K。因为药化家希望看到的是:“嘿,把这个位点换上氟,它可能就代谢不掉了。” 而不是一个抽象的 AUC 值。
后来发现,模型对所有非特定位点都预测了很低的概率,对真实位点预测概率稍高,但并不是特别突出。这就导致了 AUC 高,但实际推荐能力差。所以一定要结合 Top-K 指标一起看。
4.3 代谢物预测
这个任务是预测代谢后变成了什么化学结构。比如预测出会发生羟基化、脱烷基化、还原反应等等。
4.3.1 结构与 F1 分数
预测产物结构,非常困难。因为一个代谢反应路径可能很复杂。我们通常用 F1 分数 来评估。
- 查准率 (Precision):模型预测出的所有代谢物中,有多少是真实存在的。
- 查全率 (Recall):真实的代谢物中,模型找到了多少。
- F1 分数:两者的调和平均。一个稳健的代谢物预测模型,F1 如果能在 0.5 以上,已经非常了不起了。
4.3.2 Top-K 与多样性
和位点预测类似,我们也用 Top-K 来评估前几个预测产物的准确率。不过这里要特别提一下 多样性 (Diversity)。
如果模型预测的前 5 个产物,全部是同一类型的反应(比如全部是简单氧化),那它的推荐价值是有限的。我们更希望模型能够预测出 S-O 氧化、O-脱烷基、还原裂解 等不同类型的代谢反应。
4.4 综合评估:一张表说清楚
下面这张表是我经常用到的代谢预测模型评估清单,建议保存:
| 子任务 | 核心指标 | 我重点关注什么 | 常见误区 |
|---|---|---|---|
| 代谢稳定性 (回归) | R², RMSE | RMSE 是否反映了极端值偏差 | 只盯着 R²,忽略预测精度 |
| 代谢稳定性 (分类) | 敏感度, 特异度, AUC | 敏感度(不能漏掉快代谢分子) | 样本不平衡时只看准确率 |
| 代谢位点预测 | Top-K 准确率, ROC-AUC | Top-1/Top-2 的实际命中率 | AUC 高但 Top-1 低,模型没用 |
| 代谢物预测 | F1 分数, Top-K, 多样性 | 能否预测出多样且稀有的反应 | 过于追求查准率,丢了查全率 |
4.5 代谢预测评估核心逻辑
为了让你对整个评估框架有更直观的印象,我把核心逻辑画成了一张流程图。它展示了从原始分子到最终评估指标的变化路径。
这张图把整个评估流程串起来了。你会发现,不管哪个子任务,最后都需要“多指标联合诊断”。单纯一个指标漂亮,很可能是个陷阱。
嗯,今天就先聊这么多。记住,代谢预测没有银弹,选对指标、做对解释,才能让模型真正帮到你手上的项目。