2. 药物关系预测任务简介

先聊聊这个任务到底在干什么。药物关系预测(Drug Relation Prediction),说白了就是给定两个或多个生物医学实体(比如药物、蛋白质、基因、疾病),让模型判断它们之间是否存在某种特定的关系,以及这个关系是什么类型。举个例子,阿司匹林和布洛芬都是镇痛药,但它们一起吃会不会增加胃出血风险?这种药物-药物相互作用(DDI)就是最典型的预测场景。

我记得自己刚接触这个领域时,总觉得跟普通的关系抽取差不多。后来在项目中踩过坑才明白——药物关系预测的难点在于数据稀疏、关系类型极度不均衡,而且很多关系是建立在分子结构、通路等深层特征之上的,不能光靠文本共现解决。

一句话定义:给定候选药物对(或药物-靶点对),输出它们之间存在的关系类型(或概率分布)。

2.1 三类主流任务

实际项目中,我遇到的任务主要分三类。下面这个表帮你快速对齐概念:

任务类型 输入 输出示例 典型应用
药物-药物相互作用(DDI) 两个药物 “增强作用”、“拮抗作用”、“无相互作用” 联合用药安全分析
药物-靶点相互作用(DTI) 药物 + 蛋白质/基因 “结合”、“抑制”、“激活” 药物重定位、靶点发现
药物-疾病关联(DDA) 药物 + 疾病 “治疗”、“副作用”、“未关联” 药物副作用预测

你想想看,这三类任务其实共享同一个底层逻辑:把实体用某种方式编码,再学习它们之间的交互函数。我曾经在一个DTI项目里试过直接用文本预训练向量拼接,结果F1惨不忍睹。后来改用图神经网络(GNN)在药物-靶点异构图上做消息传递,效果才上去——这后面会细讲。

2.2 数据长什么样

先看一个实际的数据样例,方便你理解输入输出格式。下面是DDI任务中常见的JSON格式:

{
  "drug1": "DB01050",
  "drug2": "DB01259",
  "relation": "increase_risk",
  "evidence": "Both drugs are NSAIDs; concurrent use increases GI bleeding risk."
}

但别高兴太早,真实数据远没这么规整。我做过一个统计:公开的DDI数据集里,大约70%的标签是“无相互作用”,而“增加毒性”或“降低药效”这类高风险关系只占不到5%。这种严重的类别不平衡,是影响F1指标的第一个坑。

⚠ 避坑提醒:千万不要直接拿原始类别分布训练。我曾经直接用原始分布训了一个模型,准确率95%但召回率不到10%——说白了就是模型学成了“全部预测为无关系”。后面讲F1时你会发现,Accuracy在这里毫无意义。

2.3 常见数据集一览

目前业界用得比较多的数据集,我整理了一张表,你可以存一下:

数据集 任务 实体数 关系数 特点
DrugBank DDI ~13,000药物 ~200万对 关系类型丰富,但有噪声
DDInter DDI ~9,000药物 ~100万对 人工校验,质量高
BioRelEx DTI ~500药物+~2,000靶点 ~45万对 细粒度关系类型(18种)
CTD DDA ~15,000化学物+~7,000疾病 ~130万对 包含手动标注的“治疗”和“副作用”

我个人习惯优先用DDInter做DDI的baseline实验,因为它的标签噪声低,省去很多数据清洗时间。当然,如果你想挑战真实场景下的噪声鲁棒性,DrugBank更合适。

2.4 任务流程总览

别急着跳进模型细节,我们先在脑子里画一张整体流程图。下面这张SVG概括了药物关系预测的四个核心环节:

药物关系预测常规流程 输入:药物对/实体对 嵌入与特征提取(mol2vec / 图编码) 交互学习(GNN / 注意力 / 双线性) 分类头 → 关系概率 评估指标(F1、AUC等) 常见实体表示: · 药物:SMILES → 分子图 · 蛋白质:序列 → ESM · 疾病:MeSH词袋

嗯,这图你多看两眼。整个流程里,特征提取和交互学习是决定F1上限的核心模块,后面章节会反复用到。尤其是“类别不平衡”这个因素,在最后的评估环节会被F1放大——这也是为什么这门课专门讲F1。

2.5 关系类型的粒度

另一个让你头疼的地方是关系类型粒度。有的数据集只有2类(有交互/无交互),有的却有几十种精细类型,比如BioRelEx定义了18种DTI关系。我个人习惯把问题分成两类:

  • 二元预测:只关心“有没有关系”,F1计算简单,但业务价值有限。
  • 多类/多标签预测:要输出具体关系类型,F1需要按类别计算宏平均或微平均。
我的建议:业务上如果只想知道两个药能不能一起吃,用二元F1就够。但如果你在做药物重定位(DTI),必须精确到“结合”还是“激活”,此时多类F1才是硬指标。