近期一些 WSI 分类论文常常出现生存预测的实验,之前一直搞不懂是什么,这次让 AI 写了篇 tutorial,感觉写得还不错,我调整了部分内容,望诸君快速入门。
本 tutorial 主要解决以下问题:生存预测到底预测什么、TCGA数据集上的标签从哪里来、模型输入输出是什么、loss 怎么定义,以及最近一些论文是如何做这个任务的。
1. 什么是生存预测?
在普通 WSI 分类任务里,标签通常是一个类别。例如:
而 生存预测 survival prediction 不一样。它不是简单判断病人最后是”死了”还是”活着”,而是预测:
这个病人在未来多长时间内发生某个临床事件的风险有多高。
这里的”事件”可以是死亡、癌症相关死亡、复发、进展等。最常见的是:
生存预测的核心标签不是一个 class,而是一对:
其中:
例如:
patient | time | event | 含义 |
A | 420 | 1 | 第 420 天发生事件,例如死亡 |
B | 1200 | 0 | 随访到第 1200 天仍未发生事件,之后未知 |
C | 90 | 1 | 第 90 天发生事件 |
这里最容易误解的是
event = 0。它不是说这个人”永远不会死亡”,而是说:到最后一次随访时,事件还没有被观察到。
这叫 censoring,删失。在医学数据中非常常见。比如某个病人随访到 1000 天时仍然活着,之后失访了。我们只能知道他至少活到了 1000 天,但不知道之后是否还活着。
所以,生存预测不能简单做成
dead vs alive classification,因为 alive 样本很多其实只是 censored,并不是确定的长期存活。2. 在 TCGA-CDR 中如何获取生存标签?
TCGA 的 WSI 文件本身不包含生存标签。生存标签来自 patient-level clinical data。最常用的整理版本是 TCGA Clinical Data Resource(TCGA-CDR)提供的补充表:
TCGA-CDR-SupplementalTableS1.xlsx可从 GDC PanCanAtlas 页面获取:https://gdc.cancer.gov/about-data/publications/pancanatlas
其中最重要的字段:
字段 | 含义 |
bcr_patient_barcode | 病人 ID,例如 TCGA-XX-XXXX,用于与 WSI 文件匹配 |
type | 癌症类型,例如 BRCA、LUAD、BLCA |
OS / OS.time | Overall Survival;任意原因死亡都算事件 |
DSS / DSS.time | Disease-Specific Survival;癌症相关死亡算事件 |
DFI / DFI.time | Disease-Free Interval;常用于复发或新肿瘤事件 |
PFI / PFI.time | Progression-Free Interval;进展、复发、死亡等都可能算事件 |
对 WSI survival prediction 来说,最常用的是 OS 和 DSS。最近论文更喜欢用 DSS,因为它更关注癌症相关死亡,而 OS 会把非癌症原因死亡也算进去。
3. 如何把 TCGA-CDR 标签和 WSI 对齐?
TCGA WSI 文件名前 12 位就是 patient barcode:
匹配方式:
很多代码里还会定义:
即
c=1 表示 censored,c=0 表示事件发生。CLAM / MambaMIL 等代码常用这个 convention,读代码时要注意。4. 生存预测的模型输入和输出
假设你已经完成 WSI patch feature extraction,每张 WSI 已经变成一个 bag:
这和 WSI 分类任务中的 MIL 输入一样。区别在于输出层和 loss。
生存预测通常有两种输出方式:Cox risk prediction 和 discrete-time survival NLL。
5. 方式一:Cox risk prediction
模型输出一个 scalar risk score:
risk 越大,表示事件风险越高,预期生存越差。Cox partial likelihood 的直觉是:如果病人 比病人 更早发生事件,模型应该给病人 更高的 risk。
其中 是在病人 发生事件时仍处于风险集中的病人集合。
Cox formulation 总结:
项目 | 内容 |
输入标签 | (连续时间,不需要离散化) |
模型输出 | scalar risk |
Loss | Cox partial likelihood |
评价 | C-index |
6. 方式二:4-bin discrete-time survival NLL
很多 WSI survival baseline(ABMIL、CLAM、TransMIL、MambaMIL)使用这种方式。
核心思想:把连续生存时间按训练集 quartiles 分成 4 个时间区间:
注意:censored 样本也有 time bin。比如 20 个月 censored 落在 bin 2,不代表它在 bin 2 死亡,而是说它至少活到了 bin 2 的某个时间点,之后未知。
7. 4-bin NLL 中模型输出什么?
模型输出 4 个 hazard:
每个 的含义:已经活到第 个区间开始时,在第 个区间内发生事件的概率。
survival probability 是累乘得到的:
8. NLL loss 的推导
事件发生(event=1, 在 bin 死亡):
直觉:模型应该预测前面时间段风险低,但第 个时间段风险高。
Censored(event=0, 在 bin 被删失):
这会惩罚模型在 censor 之前预测太高风险,但不约束 censor 之后的预测。
统一写法:
其中 表示 censored, 表示 event observed。
9. ABMIL 用于生存预测
ABMIL 本身只是 MIL 聚合器。用于生存预测时,只需把分类 head 换成 survival head:
patch features → ABMIL attention pooling → slide embedding → survival head → hazards → NLL loss
最小模型:
risk = -sum(S) 是常见的 risk score: survival probability 越低, 越大,风险越高。10. 评价指标:C-index
生存预测不用 accuracy,而用 C-index。它衡量模型的风险排序是否正确:如果病人 比 更早死亡,模型应该给 更高的 risk。
常见评价方式:5-fold cross validation,报告 mean C-index ± std。
11. 最近论文的实验范式
虽然方法名字不同,但实验格式高度相似:
论文 | 会议 | 模态 | 常用 endpoint | 常用 loss |
SurvPath | CVPR 2024 | WSI + transcriptomics | DSS | NLL |
PIBD | ICLR 2024 | pathology + genomics | DSS | NLL |
MMP | ICML 2024 | multimodal prototyping | DSS | Cox / NLL |
ProtoSurv | NeurIPS 2024 | WSI-only | OS | Cox |
这些论文中的 ABMIL baseline 都可以理解为:
WSI patches → ABMIL pooling → slide embedding → survival head → risk/hazards
区别只在于 endpoint 选择(OS vs DSS)和 loss 形式(Cox vs NLL)。
12. 常见坑
坑 | 错误做法 | 正确做法 |
把 alive 当 negative class | dead/alive 二分类 | 使用 time + event,尊重 censoring |
用全数据计算 time bins | train+val+test 一起算 quartile | 只用训练集计算 bin cuts |
混淆 event 和 censorship | 搞反 c=1 的含义 | event=1 是事件发生,censorship=1 是删失 |
混用 OS 和 DSS | 不确认论文用哪个 | 先确认:SurvPath/PIBD/MMP 常用 DSS,ProtoSurv 常用 OS |
多 slide 对应一个 patient | 不处理 | 常见方式:每张 slide 继承 patient label / patient-level 聚合 / 测试时对多 slide risk 取平均 |
13. 总结
TCGA WSI 生存预测的关键是正确理解标签:每个样本的监督信号是
(time, event) 而不是普通分类标签。最推荐的新手 baseline:
理解这一套之后,再看 SurvPath、PIBD、MMP、ProtoSurv 等论文,就会发现它们虽然模型结构更复杂,但数据标签和训练目标的核心逻辑基本一致:用 WSI 或多模态特征预测 patient-level 的事件风险,并用删失友好的 survival loss 训练。
