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指标的第一个坑。
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概括了药物关系预测的四个核心环节:
嗯,这图你多看两眼。整个流程里,特征提取和交互学习是决定F1上限的核心模块,后面章节会反复用到。尤其是“类别不平衡”这个因素,在最后的评估环节会被F1放大——这也是为什么这门课专门讲F1。
2.5 关系类型的粒度
另一个让你头疼的地方是关系类型粒度。有的数据集只有2类(有交互/无交互),有的却有几十种精细类型,比如BioRelEx定义了18种DTI关系。我个人习惯把问题分成两类:
- 二元预测:只关心“有没有关系”,F1计算简单,但业务价值有限。
- 多类/多标签预测:要输出具体关系类型,F1需要按类别计算宏平均或微平均。