157

AI DTI 预测模型:序列、图、结构和知识图谱各解决不同问题

DTI 预测有序列、图、结构、知识图谱四条路线,各自解决不同问题。这篇讲清它们的适用场景与选择依据。

药物-靶点相互作用(DTI)预测有多条技术路线。它们不是「新旧替代」的关系,而是解决不同问题、适用不同场景——理解这一点比追踪最新模型更重要。

四条路线的对比

路线 输入 回答的问题 速度
序列基 SMILES + 氨基酸序列 大规模粗筛 最快
图基 分子图 + 序列/图 结构-活性关系
结构基 三维复合物 结合模式与机理
知识图谱 已知的药物-靶点-疾病关系网络 药物重定位

各路线的适用场景

# ---- 序列基(DeepDTA、GraphDTA 类,见 139、140)----
#
# 适合:
#   - 【需要处理海量组合】
#     如:1 万个化合物 × 500 个靶点 = 500 万对
#   - 靶点没有结构
#   - 快速的初步排除
#
# 不适合:
#   - 需要理解结合机理
#   - 精细的活性排序
#   - 新颖靶点(训练分布外)
#
# 改进方向:
#   用 ESM-2 表示替代序列 CNN(见 143)
#   → 显著提升蛋白侧的信息量

# ---- 结构基 ----
#
# 包括:
#   传统对接(见 095、097)
#   深度学习对接(见 101)
#   AF3 类复合物预测(见 113、121)
#
# 适合:
#   - 【理解为什么结合】
#   - 指导结构改造
#   - 选择性分析(比较靶点与脱靶的口袋)
#   - 有结构的靶点
#
# 不适合:
#   - 超大规模筛选(速度)
#   - 无结构的靶点
#
# 【关键优势】:
#   它给出的是【可验证的机理假设】
#   而非只是一个分数
#   → 化学家可以据此设计实验

# ---- 知识图谱 ----
#
# 构建:
#   节点:药物、靶点、疾病、副作用、通路、基因
#   边:已知的相互作用、适应症、不良反应
#
# 方法:
#   知识图谱嵌入(TransE、RotatE 等)
#   图神经网络
#   路径推理
#
# 适合:
#   - 【药物重定位】:已上市药物的新适应症
#   - 发现间接关联
#   - 整合异质证据
#
# 不适合:
#   - 【全新化合物】——不在图中,无法推理
#   - 需要定量活性
#
# 【根本局限】:
#   知识图谱只包含【已知】的关系
#   → 预测本质上是「补全」而非「发现」
#   → 【严重偏向研究充分的药物与靶点】

DTI 评测的核心问题

# 【这是整个领域最需要注意的地方】
#
# 问题:数据是「矩阵」而非独立样本
#
#   药物 × 靶点的矩阵中,
#   随机划分会让同一药物/靶点的其它数据留在训练集
#   → 模型可以学「边际分布」而非「相互作用」
#
# 【必做的对照实验】:
#
#   基线 A:只用药物 ID 的平均活性
#   基线 B:只用靶点 ID 的平均活性
#   基线 C:矩阵分解(协同过滤)
#
#   如果深度模型没有显著超过这些基线,
#   说明它没学到真正的相互作用
#
# 【必用的划分方式】(见 133):
#
#   cold drug     新化合物 → 【虚拟筛选场景】
#   cold protein  新靶点  → 【靶点外推场景】
#   cold both     两者都新 → 最严格
#
#   实际部署时面对的通常是 cold drug:
#   我们有一批新合成的化合物,想知道它们打不打某个靶点
#
# 【现实】:
#   在 cold protein 设置下,
#   现有方法的性能普遍大幅下降
#   → 「预测新靶点的配体」仍是未解决的问题

def evaluate_with_baselines(train_df, test_df, model_preds):
    """DTI 评测必须包含的对照"""
    import numpy as np
    from scipy.stats import spearmanr

    gm = train_df["y"].mean()
    dmean = train_df.groupby("drug")["y"].mean()
    pmean = train_df.groupby("protein")["y"].mean()

    base_d = test_df["drug"].map(dmean).fillna(gm).values
    base_p = test_df["protein"].map(pmean).fillna(gm).values
    base_dp = (base_d + base_p) / 2
    y = test_df["y"].values

    for name, pred in [("药物均值", base_d), ("靶点均值", base_p),
                       ("两者平均", base_dp), ("模型", model_preds)]:
        r = spearmanr(y, pred).correlation
        rmse = np.sqrt(((y - pred) ** 2).mean())
        print(f"{name:10s} Spearman={r:.3f}  RMSE={rmse:.3f}")
    # 【模型必须显著优于前三个,结果才有意义】

组合使用的分级策略

# 实际项目中,应该组合使用而非二选一
#
# 场景:从 100 万化合物库中找某靶点的苗头
#
# 第 1 级:【规则过滤】(秒级)
#   性质范围、结构警示 → 剩 30 万
#
# 第 2 级:【配体相似性】(分钟级)
#   如果有已知配体,做相似性搜索 → 富集
#
# 第 3 级:【序列基 DTI 模型】(小时级)
#   快速打分排序 → 剩 3 万
#
# 第 4 级:【对接】(数小时~天)
#   → 剩 3000
#
# 第 5 级:【结构基精化】
#   GNINA 重打分、相互作用核对 → 剩 300
#
# 第 6 级:【MM/GBSA 或 Boltz-2】(见 126、121)
#   → 剩 100
#
# 第 7 级:【人工审查】
#   药化专家看结构 → 剩 30
#
# 第 8 级:【实验验证】
#
# 【关键设计原则】:
#   每一级用【不同原理】的方法
#   → 避免同一种偏倚被层层放大
#   → 如果所有级别都用类似的模型,
#     它们会犯相同的错误
#
# 知识图谱在这个流程中的位置:
#   不在筛选链条上,而是【平行的信息源】
#   用于:发现该靶点的其它已知调节剂、
#         相关通路的药物、可重定位的候选

什么时候用知识图谱方法

  • 药物重定位:已上市药物找新适应症——这是知识图谱最有价值的应用,因为药物已知、安全性已知,只需找新的靶点/适应症关联;
  • 整合异质证据:把表达、遗传、临床、文献信息放进同一个框架;
  • 发现间接关联:药物 A → 靶点 B → 通路 C → 疾病 D 这样的多跳路径;
  • 不适合:全新化合物(不在图中)、需要定量活性、新靶点(关系少);
  • 必须注意的偏倚图中的关系密度反映的是研究热度,而非生物学重要性——热门药物和靶点的连接多,容易被预测出更多新关联。

关键要点

  • 四条路线解决不同问题:序列基做粗筛,结构基给机理,知识图谱做重定位;
  • DTI 数据是矩阵不是独立样本——必须做「药物均值/靶点均值」的平凡基线对照;
  • 实际部署面对的是 cold drug 场景,cold protein 下现有方法普遍大幅下降
  • 分级筛选时每级应用不同原理的方法,避免同一偏倚被层层放大。

延伸资源