近期一些 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
其中最重要的字段:
字段
含义
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 训练。