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} 分钟")
我的经验:记得有个早期项目,我们模型的 R² 高达 0.85,但 RMSE 却有 45 分钟。一查发现,模型对于半衰期在 200 分钟以上的慢代谢分子,预测偏差特别大。所以只看 R² 容易自我陶醉,还得问问 RMSE。

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 值。

避坑指南:我曾经遇到过一个模型,它的宏平均 ROC-AUC 高达 0.92,但 Top-1 准确率只有 0.35。
后来发现,模型对所有非特定位点都预测了很低的概率,对真实位点预测概率稍高,但并不是特别突出。这就导致了 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-脱烷基、还原裂解 等不同类型的代谢反应。

我的建议:在评估代谢物预测时,我习惯把 Top-3 准确率和代谢反应类型多样性放在一起看。一个能预测出罕见但正确的代谢产物模型,比一个只会预测常见反应的模型,价值高得多。

4.4 综合评估:一张表说清楚

下面这张表是我经常用到的代谢预测模型评估清单,建议保存:

子任务 核心指标 我重点关注什么 常见误区
代谢稳定性 (回归) R², RMSE RMSE 是否反映了极端值偏差 只盯着 R²,忽略预测精度
代谢稳定性 (分类) 敏感度, 特异度, AUC 敏感度(不能漏掉快代谢分子) 样本不平衡时只看准确率
代谢位点预测 Top-K 准确率, ROC-AUC Top-1/Top-2 的实际命中率 AUC 高但 Top-1 低,模型没用
代谢物预测 F1 分数, Top-K, 多样性 能否预测出多样且稀有的反应 过于追求查准率,丢了查全率

4.5 代谢预测评估核心逻辑

为了让你对整个评估框架有更直观的印象,我把核心逻辑画成了一张流程图。它展示了从原始分子到最终评估指标的变化路径。

代谢预测模型评估核心逻辑 输入:分子结构 (SMILES/Graph) 代谢预测模型 预测代谢稳定性 预测代谢位点 预测代谢物结构 回归/分类指标 • R² & RMSE (回归) • 敏感度 & 特异度 (分类) • AUC-ROC • F1 分数 (非平衡场景) 位点预测指标 • Top-1 / Top-2 / Top-K • ROC-AUC (辅助评估,非首选) 代谢物指标 • F1 分数 (查准+查全) • Top-K 准确率 • 多样性得分 最终评估:多指标联合诊断 避免单一指标陷阱,结合结构与数值分析

这张图把整个评估流程串起来了。你会发现,不管哪个子任务,最后都需要“多指标联合诊断”。单纯一个指标漂亮,很可能是个陷阱。

嗯,今天就先聊这么多。记住,代谢预测没有银弹,选对指标、做对解释,才能让模型真正帮到你手上的项目。