想象一场没有终点的城市马拉松直播:几千名跑者从同一起点出发,我们作为“AI教练团队”盯着屏幕,想知道谁会在什么时候“撞线”——对病人而言,这条终点线就是复发、死亡或病情恶化。麻烦的是,直播镜头随时可能被切走:有的跑者我们眼睁睁看着他还在跑,却再也看不到他完赛的那一刻。这种“追丢”在医学里叫删失,它让普通的预测算法束手无策。 好在生存分析早就为这种“边跑边丢”的数据准备好了工具箱。老派的Cox比例风险模型像一位经验丰富的老教练,用一条线性公式估算每个跑者的风险倍数;DeepSurv则请来了神经网络这支“深度学习天团”,捕捉年龄与基因之间弯弯绕绕的非线性关系;而Survival SVM另辟蹊径——它干脆不管完赛时间,只求把跑者按“谁先到终点”的顺序排对。三条路线,目标一致:在镜头残缺的直播里,做最准的预判。

岗位关联

掌握深度生存模型,是 AI 医疗从业者做预后预测、风险分层与个体化治疗推荐的核心技能,也是从“会调包”走向“懂建模”的关键一跃。

目录
  1. 可视化演示
  2. 生存分析基础
  3. Cox比例风险模型
  4. DeepSurv原理
  5. Survival SVM
  6. 特征处理技巧
  7. 泛化评估策略
  8. 精准医疗应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示DeepSurv神经网络生存预测、模型对比与风险分层,交互切换查看生存曲线、模型架构差异和预后评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+modeData.curve.caption+'

生存分析基础

镜头前的教练最关心两件事:这位跑者现在还“活着”的概率有多大?他下一秒会不会“倒下”?生存分析把这两问翻译成两个量——生存函数 S(t) 和风险函数 λ(t)。在医学随访里,“活着”指没有复发、没有死亡,而“倒下”就是终点事件。

把每个病人的病历想像成一条“个人赛道”:横轴是时间(天或月),终点是复发或死亡。可问题来了——直播镜头常常被切走:有的病人研究结束时还健在,有的中途失联。我们只知道“镜头丢失前他还活着”,却永远不知道他真正的终点。这种“只看到一半就断了”的数据,医学上叫右删失。生存分析的全部智慧,就是如何在镜头残缺的情况下仍然做出靠谱的预测。

从数据上看,一份生存数据就是三列:病人的特征 X(年龄、基因表达、治疗方式)、观测时间 t(撞线或被追丢的时刻)、事件标记 δ(1 表示撞线,0 表示被追丢)。普通回归看到 δ=0 会一头雾水——它不知道真实时间是无从得知的,于是只能瞎猜。

有了生存函数这个“官方仪表盘”,教练才能区分“跑得快”和“只是出发早”——同样是还没到终点,一个已跑了 40 公里,一个才跑 5 公里,风险天差地别。生存函数正是记录“跑到哪了”的仪表盘。

S(t)=P(T>t)=∫t∞f(u) duS(t)=P(T>t)=\int_t^{\infty} f(u)\,du
生存函数 S(t) 回答“到 t 时刻还没撞线的概率有多大”,是生存分析一切模型的目标函数。
  1. 事件时刻记号T 表示终点事件发生的时刻,对患者就是复发或死亡的时点,它是一个不确定的随机变量。
    T∼f(t)T \sim f(t)
  2. 存活概率S(t) 表示“T 大于 t”的概率,也就是到 t 时刻还没出事。
    S(t)=P(T>t)S(t)=P(T>t)
  3. 密度积分把 t 之后所有可能的密度 f(u) 累加,等价于“还没出事”的总概率。
    S(t)=∫t∞f(u) duS(t)=\int_t^{\infty} f(u)\,du

Cox比例风险模型

老教练带队的传统做法是一张“风险倍率表”:年龄每大 10 岁,风险乘以 1.2;某个基因突变,风险乘以 1.8;手术方式不同,风险乘以 0.6。在统计学里,这张表被写成 Cox 比例风险模型——它假设每个人的风险函数都是一条公共基准曲线乘以各自的常数倍。

这条公共曲线叫基线风险 λ₀(t),是所有“平均人”在 t 时刻的背景风险。而个别人的风险倍数,由特征的线性组合 exp(βᵀx) 给出。因为倍数恒定,所以叫“比例风险”。Cox 模型还有一个精妙设计:它用偏似然函数估计 β,根本不需要知道 λ₀(t) 的具体形状。估计时只比较同一时刻“谁还在跑”,谁先撞线就要求谁的风险更高。

这就像教练不看每个跑者的绝对配速,只在每个补给点比较“这一批人里谁先到”——具体时间数值不再重要,重要的是排序信息。这也让 Cox 模型对删失数据天然友好:被追丢的跑者,他之前参加的每一轮“比较”都贡献了信息。

但老教练的公式有个致命伤:它只会“做加法”。年龄和基因的交互、非线性效应,线性组合统统表达不了。当数据升到高维组学——几万个基因表达同时输入时,手工指定交互项基本不可能。这时,就该年轻的 DeepSurv 教练上场了。

λ(t∣x)=λ0(t) exp⁡(β1x1+β2x2+⋯+βpxp)=λ0(t) eβ⊤x\lambda(t\mid x)=\lambda_0(t)\,\exp(\beta_1 x_1+\beta_2 x_2+\cdots+\beta_p x_p)=\lambda_0(t)\,e^{\beta^{\top}x}
每个个体的风险 = 公共基线风险 × 特征线性组合的指数,特征每增一单位,风险变为原来的 e^β 倍。
  1. 基线风险 λ₀(t)全体“平均人”在 t 时刻的背景风险,只随时间变化,不随个体变化。
    λ0(t)\lambda_0(t)
  2. 特征线性组合每个特征 x_k 乘以自己的系数 β_k 再求和,先把“体检指标”汇成一个分数。
    β1x1+β2x2+⋯+βpxp\beta_1x_1+\beta_2x_2+\cdots+\beta_px_p
  3. 指数换挡exp 把可正可负的分数映射为正的风险倍数,大于 1 表示加速撞线,小于 1 表示减速。
    eβ⊤xe^{\beta^{\top}x}
  4. 模型解读其他条件不变时,特征 x_k 增加 1 单位,风险变为原来的 e^{β_k} 倍。
    eβke^{\beta_k}

DeepSurv原理

DeepSurv 教练不背“风险倍率表”,他带了一支神经网络团队。输入层是患者的各项特征,中间几个隐藏层用 ReLU 激活函数让各特征充分“对话”,最后输出一个单一的风险分数。整个过程不需要人类手动设计交互项——隐藏层自动在数据里找规律。

DeepSurv 的核心创意是:它把 Cox 模型里的线性分数 βᵀx 整个替换成神经网络的输出 ĥθ(x),损失函数沿用“负对数偏似然”。训练时,网络会不断调整权重,让“先撞线的人风险分数更高”。因为网络是万能逼近器,它能把年龄、基因、病理分期之间那种弯弯绕绕的关系全部学出来。

当然,深度学习天团也有自己的毛病:参数极多,容易把训练集背得滚瓜烂熟,见到新病人就失灵。所以 DeepSurv 的损失函数末尾加了一项 L2 正则,相当于给每位“团员”设了纪律红线:权重不许太大,防止个别特征喧宾夺主。比赛中还常用 Adam 优化器配合早停,看到验证集指标不升就果断收工。

所以 DeepSurv 并不是发明了新的生存分析,而是给 Cox 模型装上了“深度学习发动机”。只要数据量足够、特征足够复杂,这台发动机就能把预后预测的精度推上一个台阶——这正是它能在精准医疗里大放异彩的原因。

ℓ(θ)=−∑i:δi=1[h^θ(xi)−log⁡∑j∈R(ti)exp⁡(h^θ(xj))]+λ∥θ∥22\ell(\theta)=-\sum_{i:\delta_i=1}\left[\hat h_\theta(x_i)-\log\sum_{j\in R(t_i)}\exp(\hat h_\theta(x_j))\right]+\lambda\|\theta\|_2^2
损失函数惩罚“先撞线者风险不够高”,同时用 L2 正则约束网络别太自信。
  1. 事件样本集合外面的大求和只覆盖 δ_i=1 的样本,即真正撞线的人。
    δi=1\delta_i=1
  2. 网络风险输出ĥθ(x_i) 是神经网络给患者 i 的风险分数,替代了 Cox 的 βᵀx。
    h^θ(xi)\hat h_\theta(x_i)
  3. 风险集合 R(t_i)在 i 撞线那一刻仍被镜头拍到的所有人。
    R(ti)={j:tj≥ti}R(t_i)=\{j : t_j \ge t_i\}
  4. log-sum-exp对风险集合所有分数做指数求和再取对数,相当于“当期总风险”。
    log⁡∑j∈R(ti)exp⁡(h^θ(xj))\log\sum_{j\in R(t_i)}\exp(\hat h_\theta(x_j))
  5. L2 正则项对全部权重 θ 求平方和再乘以系数 λ,权重越大惩罚越重。
    λ∥θ∥22\lambda\|\theta\|_2^2

Survival SVM

第三位教练的思路完全不同。他站在终点线的侧门,不关心具体时间,只做一件事:把镜头里出现过的人两两配对比拼——“这位先撞线的,风险就该比那位还跑着的高”。他训练的目标不是预测时间,而是把排序弄对。

这个思路被形式化为 Survival SVM:把每一对“事件早于晚事件”的样本写成一个约束,要求早事件样本的风险分数至少比晚事件样本高出一个间隔。如果模型排错了,就按合页损失记一笔账,并用松弛变量允许少量“看走眼”——毕竟现实总有意外。

Survival SVM 的本质是支持向量机的排序版本,它的优势在于:不需要估计基线风险,对数据分布没有强假设,小样本下往往比深度学习更稳。如果配上核技巧(比如 RBF 核),它也能处理非线性排序——相当于给第三位教练配了一副“高维望远镜”,把原始特征映射到更高维空间再找排序边界。

如果说 DeepSurv 像一位“数据狂魔”,要吸饱数据才肯开口;那 Survival SVM 就像一位“极简主义者”,几百个样本就能给出稳健的排序。两位教练没有谁绝对更好——数据量大、特征复杂时 DeepSurv 占优;样本少、要求稳定可解释时 Survival SVM 更香。

min⁡w,ξ 12∥w∥2+C∑i:δi=1 ∑j:tj>tiξijs.t.w⊤(xi−xj)≥1−ξij, ξij≥0\min_{w,\xi}\ \frac12\|w\|^2 + C\sum_{i:\delta_i=1}\ \sum_{j:t_j>t_i}\xi_{ij}\quad\text{s.t.}\quad w^{\top}(x_i-x_j)\ge 1-\xi_{ij},\ \xi_{ij}\ge 0
目标是最小化“模型复杂度 + 排序错误罚款”,约束是:先撞线者的风险至少比后撞线者高 1。
  1. 成对约束i 先撞线、j 还在跑,模型应判 i 的风险分数比 j 高。
    w⊤xi>w⊤xjw^{\top}x_i > w^{\top}x_j
  2. 排序间隔要求差距至少为 1,给排序留出“缓冲带”,防止模糊排序。
    w⊤(xi−xj)≥1w^{\top}(x_i-x_j)\ge 1
  3. 松弛变量 ξ个别样本实在比不顺时,允许破例,但每破一例计入损失。
    ξij≥0\xi_{ij}\ge 0
  4. C 参数权衡C 大则严惩排序错误,C 小则容忍错误换取更大间隔。
    min⁡ 12∥w∥2+C∑ξij\min\ \frac12\|w\|^2 + C\sum\xi_{ij}

特征处理技巧

无论哪位教练带队,赛前都要统一“体检报告”的单位。年龄用岁、基因表达用荧光强度、肿瘤分期用罗马数字——量纲乱七八糟直接喂给模型,就像拿公斤和米混在一起比较体重,模型会被数值大的特征带偏。

第一招是标准化:把每个特征减去均值、除以标准差,让所有特征都落在差不多的量纲上。这对神经网络格外重要,因为梯度下降在量纲悬殊时容易“原地踏步”。第二招是缺失值插补:随访记录总有漏填,常用中位数填充;更讲究的做法是按分组均值插补。第三招是类别编码:治疗方式、分期这类离散变量要先转成 one-hot 哑变量,不能直接塞进模型当连续数用。

另一个容易被忽视的细节是数据划分:生存数据通常按时间排序,划分训练/验证集时要保证两组的事件比例相近,不能把“全出事的人”分到一边。否则模型会误以为“训练集里风险都高”,验证时彻底翻车。

这就像教练把所有跑者的体检单统一成“百分位成绩单”:每一项都是相对全体水平的偏高或偏低,而不是孤立的原始数字。模型读起来轻松,收敛也快得多。

z=x−μσz=\frac{x-\mu}{\sigma}
标准化把每个特征变成“均值 0、标准差 1”的标准分数,让不同量纲的特征公平竞争。
  1. 计算均值 μ该特征在所有样本上的平均值,代表“中心位置”。
    μ=1n∑k=1nxk\mu=\frac1n\sum_{k=1}^{n}x_k
  2. 计算标准差 σ衡量样本围绕均值的离散程度。
    σ=1n∑k=1n(xk−μ)2\sigma=\sqrt{\frac1n\sum_{k=1}^{n}(x_k-\mu)^2}
  3. 中心化x−μ 让特征的 0 点移到均值处,正负号代表相对高低。
    x−μx-\mu
  4. 缩放除以 σ 把离散程度归一,使所有特征数值范围可比。
    z=x−μσz=\frac{x-\mu}{\sigma}

泛化评估策略

模型训练完,教练要回答一个灵魂问题:你真的能预测新病人吗?生存分析里最常用的考试叫 C-index(一致性指数)。它把所有可比较的病人对两两拎出来:i 先撞线、j 还在跑,模型若能判 i 风险更高,就记一分;最后用总分除以总对数。

C-index 的直觉非常朴素:它考的不是“猜对具体时间”,而是“猜对谁先谁后”。0.5 等于瞎猜,1.0 是完美,0.7-0.8 在医学预后模型里已属优秀。因为它是排序指标,对删失数据天然友好——被追丢的人虽然不知道终点,但“至少比没追丢的人活得久”这条信息依然有效。

评估时还要讲究“考试纪律”:通常用五折交叉验证,把数据切成 5 份轮流当验证集,避免一次切分带来的运气成分。超参数(网络层数、学习率、C 值)用网格搜索在验证集上调,最后在独立的测试集上报告 C-index。DeepSurv 与 Survival SVM 谁更强,也要放在同一套考试规则下比——数据同样预处理、同样折数、同样度量,才算公平。

回到马拉松直播,C-index 就是“随机叫两位跑者,猜谁先撞线”的胜率。它不是万能的——不考绝对时间、不考校准——但作为排序能力的体检报告,它至今仍是生存模型最通用的度量衡。

C=1M∑i:δi=1 ∑j: tj>tiI(h^(xi)>h^(xj))C=\frac{1}{M}\sum_{i:\delta_i=1}\ \sum_{j:\,t_j>t_i} I\big(\hat h(x_i)>\hat h(x_j)\big)
C-index = 随机抽一对可比较病人,模型预测风险排序正确的概率。
  1. 可比较对i 已撞线且 j 的观测时间更长(j 可能还活着也可能被追丢),构成一对可比较样本。
    δi=1, tj>ti\delta_i=1,\ t_j>t_i
  2. 指示函数 I括号内成立记 1,不成立记 0——判对了加分。
    I(h^(xi)>h^(xj))I(\hat h(x_i)>\hat h(x_j))
  3. 双求和遍历所有 i、j 构成的可比较对,累加正确判断次数。
    ∑i:δi=1∑j:tj>ti\sum_{i:\delta_i=1}\sum_{j:t_j>t_i}
  4. 归一化除以总对数 M,得到 0 到 1 之间的正确率。
    C=正确次数MC=\frac{\text{正确次数}}{M}

精准医疗应用

直播的最终目的从来不只是“看”,而是“指挥”。教练看完所有数据,要告诉每一位跑者:你是该加速冲刺,还是该保命慢跑?在医疗里,这就对应精准医疗的落地:预测患者风险、选择治疗方案、整合多组学数据。

最直接的应用是风险分层:用训练好的 DeepSurv 给患者输出风险分数,按分数划分高、中、低危组。高危组加强随访、积极干预,低危组避免过度治疗。更进一步,DeepSurv 原始论文提出了一个治疗方案推荐逻辑:对同一个患者分别预测“用药”和“不用药”两种状态下的风险,谁低推荐谁。这个“双臂对比”的思路,正是个体化治疗的算法雏形。

多组学整合则把赛制推向了更高维度:基因表达、拷贝数变异、蛋白组学、病理图像特征一起作为神经网络输入。传统 Cox 面对上万维特征早已力不从心,而 DeepSurv 可以在端到端的框架里自动筛选有用信号,让“组学数据”真正服务于床旁决策。

至此,三位教练的分工变得清晰:老 Cox 提供稳健基线,DeepSurv 负责挖掘复杂信号,Survival SVM 兜底小样本场景。而它们的共同目标,是让每一场“生命马拉松”的直播不再只是旁观——AI 团队真正下场,为每一个患者喊出那句:你该加速了,还是该减速了。

rec(x)={1h^θ(x,a=1)<h^θ(x,a=0)0otherwise\text{rec}(x)=\begin{cases}1 & \hat h_\theta(x,a=1)<\hat h_\theta(x,a=0)\\0 & \text{otherwise}\end{cases}
治疗方案推荐:对同一患者分别预测两种方案下的风险,选择风险更低的方案。
  1. 治疗臂风险a=1 表示接受治疗,a=0 表示不治疗,分别输入网络得到两个风险分数。
    h^θ(x,a=1),h^θ(x,a=0)\hat h_\theta(x,a=1),\quad \hat h_\theta(x,a=0)
  2. 大小比较治疗风险更低说明该患者从治疗中获益。
    h^θ(x,a=1)<h^θ(x,a=0)\hat h_\theta(x,a=1)<\hat h_\theta(x,a=0)
  3. 决策输出条件成立推荐治疗(输出 1),否则不推荐(输出 0)。
    rec(x)∈{0,1}\text{rec}(x)\in\{0,1\}

AI 应用场景

肿瘤预后预测平台

阶段:模型训练与评估

解决的问题:传统 TNM 分期只能给出粗糙的分组,无法利用基因表达等高维信息。DeepSurv 能端到端学习多组学特征与预后的非线性关系,输出个体化的连续风险分数。

具体案例:某肿瘤中心累计 5000 例结直肠癌随访数据,输入 50 个基因表达加临床特征,DeepSurv 的 C-index 达到 0.76,明显优于传统 Cox 的 0.68。平台据此把患者自动划分为高、中、低危三档,高危档优先安排复查。

临床试验受试者分层

阶段:特征工程与数据划分

解决的问题:新药入组时,若两组患者基线风险不均衡,试验结论会失真。用 Survival SVM 对候选者排序后做风险分层,可保证试验组和对照组风险分布接近。

具体案例:某 III 期肺癌试验入组 400 人,先用 Survival SVM 输出风险排序,再按排序交替分入两组,两组中位生存期差异从 2.1 个月缩到 0.3 个月,极大提升了试验可比性。

个体化治疗方案推荐

阶段:模型推理与决策支持

解决的问题:同一种化疗药,有人获益巨大,有人毫无反应。DeepSurv 的双臂风险对比,把“用药 vs 不用药”的预测差异变成推荐依据。

具体案例:对乳腺癌患者分别输入“靶向药组”与“对照组”两个虚拟特征,网络输出两套风险分数,比较后自动生成推荐标签,医生的处方决策时间平均缩短 40%。

Python 演示

python100 行
import numpy as np  def generate_data(n=200, seed=42):    """生成带右删失的生存数据: 年龄 + 基因表达两个特征"""    rng = np.random.RandomState(seed)    age = rng.uniform(30, 80, n)    gene = rng.normal(0, 1, n)    x = np.column_stack([age, gene])    true_risk = 0.04 * age + 0.9 * (gene * (age - 50) / 30) ** 2    event_time = rng.exponential(1.0 / (true_risk + 0.03))    censor_time = rng.uniform(0, 50, n)    time = np.minimum(event_time, censor_time)    event = (event_time <= censor_time).astype(int)    order = np.argsort(time)    return x[order], time[order], event[order]  def feature_expand(x):    """二次特征映射, 模拟神经网络捕捉非线性的能力"""    a = (x[:, 0] - 55) / 25.0    g = x[:, 1]    return np.column_stack([a, g, a * g, a ** 2, g ** 2])  def c_index(risk, time, event):    """一致性指数 C: 可比较病人对中风险排序正确的比例"""    hit = comp = 0    for i in range(len(time)):        if event[i] == 0:            continue        for j in range(len(time)):            if i != j and time[j] > time[i]:                comp += 1                hit += risk[i] > risk[j]    return hit / comp if comp else 0.0  class CoxNLL:    """DeepSurv 的最小可运行版: 负对数偏似然损失 + 梯度下降"""     def __init__(self, lr=0.05, l2=0.001, epochs=200):        self.lr = lr        self.l2 = l2        self.epochs = epochs        self.w = None     def fit(self, x, time, event):        n, d = x.shape        self.w = np.zeros(d)        for _ in range(self.epochs):            grad = np.zeros(d)            for i in range(n):                if event[i] == 0:                    continue                risk = x @ self.w                mask = time >= time[i]                p = np.exp(risk - np.log(np.exp(risk[mask]).sum()))                grad += -x[i] + (x * p[:, None])[mask].sum(axis=0)            self.w -= self.lr * (grad / n + self.l2 * self.w)        return self     def predict(self, x):        return x @ self.w  class RankHinge:    """Survival SVM 的最小可运行版: 合页排序损失 + 次梯度下降"""     def __init__(self, lr=0.01, c_param=1.0, epochs=100):        self.lr = lr        self.c_param = c_param        self.epochs = epochs        self.w = None     def fit(self, x, time, event):        n, d = x.shape        self.w = np.zeros(d)        for _ in range(self.epochs):            risk = x @ self.w            for i in range(n):                if event[i] == 0:                    continue                for j in range(n):                    if time[j] > time[i] and 1 - (risk[i] - risk[j]) > 0:                        self.w -= self.lr * self.c_param * (x[j] - x[i])        return self     def predict(self, x):        return x @ self.w  x, t, e = generate_data(200, seed=42)xf = feature_expand(x) deep = CoxNLL(lr=0.05, l2=0.001, epochs=200).fit(xf, t, e)svm = RankHinge(lr=0.01, c_param=1.0, epochs=100).fit(xf, t, e) print("DeepSurv 风格模型 C-index:", round(c_index(deep.predict(xf), t, e), 4))print("Survival SVM 风格模型 C-index:", round(c_index(svm.predict(xf), t, e), 4))
目的:用纯 NumPy 实现 DeepSurv 风格的负对数偏似然损失和 Survival SVM 风格的合页排序损失,在带删失的模拟生存数据上对比两者的 C-index。
  1. time = np.minimum(event_time, censor_time)观测时间取事件与删失的较小者,这是生存数据的标准构造。
  2. event = (event_time <= censor_time).astype(int)事件标记,1 表示撞线,0 表示被追丢。
  3. order = np.argsort(time)按时间排序,排序后风险集合可以快速用掩码找到。
  4. mask = time >= time[i]找出“i 撞线那一刻还在跑”的风险集合 R(t_i)。
  5. p = np.exp(risk - np.log(np.exp(risk[mask]).sum()))log-sum-exp 技巧,数值稳定地计算归一化权重。
  6. grad += -x[i] + (x * p[:, None])[mask].sum(axis=0)偏似然梯度的核心:先撞线者的特征减去风险集合的加权平均。
  7. if time[j] > time[i] and 1 - (risk[i] - risk[j]) > 0:合页约束被违反的判断条件:两者风险差不足 1。
  8. hit += risk[i] > risk[j]C-index 的投票累计,预测排序正确就加一票。

常见误区

误区那些没看到终点的病人,数据不完整,训练前直接删掉不就行了吗?反正他们没出事。

正解删失样本提供了“至少活到 t 时刻”的信息。直接删除会让模型系统性低估生存时间、高估风险——就像直播里追丢的跑者被当成“不存在”,统计出的完赛率自然失真。偏似然损失正是通过“风险集合”让删失样本参与分母比较,把“他当时还在跑”的价值利用起来。

为何常见:“没结果就没数据”符合直觉,但忽略了删失本身就是一种观测结果。

误区DeepSurv 是深度学习的,肯定吊打传统 Cox,无脑上深度网络就对了。

正解DeepSurv 的优势只在特征非线性强、数据量足够时才显现。样本少、特征线性时,Cox 更稳、更可解释。而且深度网络需要正则化与调参,训练不当 C-index 可能反而不如 Cox。

为何常见:对“深度学习万能”的盲目信任,忽视了统计模型在小样本下的稳健性。

误区Survival SVM 也是生存模型,预测出来的值应该就是病人还能活多久。

正解Survival SVM 输出的是风险排序分数,不是时间。分数高只代表“更可能先出事”。要获得生存时间或生存概率,还需要额外步骤(如对分数做校准或映射)。

为何常见:把生存模型笼统理解为“预测寿命”,忽略了排序与回归的本质差别。

误区C-index 0.9 一定比 0.75 的模型更适合临床,直接冲 C-index 调参就行了。

正解C-index 只度量排序正确性,不度量风险校准。一个把所有患者风险都放大 10 倍的模型,C-index 不变但临床完全不可用;还要看校准曲线、Brier 分数和时间依赖 AUC。

为何常见:单一指标导向,忽略临床决策真正需要的是“绝对风险”。

误区删失不就是缺失标签吗?把观测时间当 y,用均方误差回归不就行了?

正解对删失样本,真实事件时间是未知的,直接拿观测时间(等于删失时间)当目标会引入系统性偏差——因为删失时间通常短于真实事件时间。生存模型的偏似然/排序损失专门绕开了这个陷阱。

为何常见:回归思维的惯性,没理解右删失“信息不完整”的本质。

面试题

Q1. 生存分析中“右删失”指的是?

单选题 · easy

  • A.失访前未出事此后未知← 正确答案
  • B.随访期间确认已经出事
  • C.患者从未被纳入研究
  • D.患者同一时间出现两事件

答案:A。右删失是指我们只知道患者在某个时间点之前没有发生事件(失访前还活着),之后状态未知,对应 A。B 是事件已发生,C 是未入组,D 是竞争事件,均不符合右删失定义。

Q2. Cox 比例风险模型的核心假设是?

单选题 · easy

  • A.风险函数随时间线性增长
  • B.个体间风险恒定成比例← 正确答案
  • C.删失与风险变化无关
  • D.特征服从正态分布

答案:B。Cox 假设 λ(t|x)=λ₀(t)exp(βᵀx),即不同个体的风险函数是基线风险 λ₀(t) 的常数倍,风险比恒定,故选 B。A 误把“比例”理解成“线性时间”,C 与模型假设无关,D 是参数检验的常见误解。

Q3. DeepSurv 的损失函数本质上是?

单选题 · mid

  • A.均方误差损失函数
  • B.交叉熵损失函数
  • C.负对数偏似然损失← 正确答案
  • D.合页排序损失函数

答案:C。DeepSurv 用负对数偏似然损失来训练网络,让先事件样本的风险分数高于风险集合,故选 C。A 是回归损失,B 是分类损失,D 是 Survival SVM 的损失。

Q4. Survival SVM 主要优化什么目标?

单选题 · mid

  • A.预测病人的精确生存时间
  • B.风险分数排序的正确性← 正确答案
  • C.对病人特征进行聚类
  • D.拟合非参数生存曲线

答案:B。Survival SVM 把生存问题转化为成对排序:先“撞线”者风险应更高。它输出的是排序分数而非绝对时间,故选 B。

Q5. 关于删失数据,下列说法正确的是?

多选题 · mid

  • A.删失样本毫无价值理应剔除
  • B.删失样本提供了生存下界← 正确答案
  • C.偏似然损失能利用删失信息← 正确答案
  • D.删失仅影响统计检验

答案:BC。删失样本告诉我们“至少活到 T 时刻”,这是生存时间的下界(B)。偏似然/排序损失通过风险集合让删失样本参与分母比较(C)。A 和 D 都低估了删失信息的价值。

Q6. C-index = 0.8 意味着?

单选题 · hard

  • A.预测对八成的精确生存时间
  • B.可比较对中八成排序正确← 正确答案
  • C.八成患者属于高风险分组
  • D.模型总准确率达到八成

答案:B。C-index 定义是随机一对可比较病人中,模型风险排序正确的比例,0.8 表示八成可比较对排序正确,故选 B。它不度量精确时间(A)、不涉及分组比例(C)、也不是人群准确率(D)。

Q7. DeepSurv 相比传统 Cox 模型能带来的提升有?

多选题 · hard

  • A.自动捕捉特征非线性交互← 正确答案
  • B.完全不需要任何正则化
  • C.可输入高维组学特征数据← 正确答案
  • D.完全不需要删失样本参与

答案:AC。DeepSurv 用神经网络替代线性分数,自动学非线性交互(A),且可端到端处理基因表达等高维输入(C)。但网络参数多仍需正则化(B 错),删失样本依旧通过风险集合参与损失(D 错)。

Q8. 对特征做 z-score 标准化的主要目的是?

单选题 · easy

  • A.消除特征之间的量纲差异← 正确答案
  • B.增加样本数量提升表现
  • C.删除离群的异常数据点
  • D.把特征自动转换为类别

答案:A。z-score 把每个特征变成均值 0、标准差 1 的标准分数,让不同量纲特征公平参与训练,故选 A。它不能增加样本(B)、不能删除异常值(C)、不改变特征类型(D)。

Q9. 生存模型常用的评估手段包括?

多选题 · mid

  • A.一致性指数 C-index← 正确答案
  • B.五折交叉验证← 正确答案
  • C.时间依赖 AUC 曲线← 正确答案
  • D.整体分类准确率

答案:ABC。C-index 是排序一致性度量(A),交叉验证用于稳定评估(B),时间依赖 AUC 补充动态判别能力(C)。“整体分类准确率”是分类任务的指标,不适合删失生存数据(D)。

Q10. DeepSurv 推荐治疗方案的做法是?

单选题 · hard

  • A.比较用药与否的风险预测← 正确答案
  • B.直接预测患者剩余寿命
  • C.对患者做无监督聚类
  • D.统计历史用药出现频次

答案:A。DeepSurv 对同一患者分别预测“用药臂”和“不用药臂”的风险,风险更低的方案胜出,故选 A。它不直接给出寿命年数(B)、不做聚类(C)、也不统计历史频次(D)。