名称: scikit-survival 描述: scikit-survival 是一个用于生存分析和时间到事件建模的 Python 工具包。使用此技能时,可处理截尾生存数据、执行时间到事件分析、拟合 Cox 模型、随机生存森林、梯度提升模型或生存 SVM,使用一致性指数或 Brier 分数评估生存预测,处理竞争风险,或使用 scikit-survival 库实现任何生存分析工作流。
scikit-survival:Python 中的生存分析
概述
scikit-survival 是一个基于 scikit-learn 的 Python 库,用于生存分析。它提供了专门工具来处理时间到事件分析,应对截尾数据的独特挑战,其中一些观察仅部分已知。
生存分析旨在建立协变量与事件时间之间的联系,考虑截尾记录(特别是来自研究中参与者在观察期间未经历事件的右截尾数据)。
何时使用此技能
使用此技能时:
- 执行生存分析或时间到事件建模
- 处理截尾数据(右截尾、左截尾或区间截尾)
- 拟合 Cox 比例风险模型(标准或惩罚)
- 构建集成生存模型(随机生存森林、梯度提升)
- 训练生存支持向量机
- 评估生存模型性能(一致性指数、Brier 分数、时间依赖 AUC)
- 估计 Kaplan-Meier 或 Nelson-Aalen 曲线
- 分析竞争风险
- 预处理生存数据或处理生存数据集中的缺失值
- 使用 scikit-survival 库进行任何分析
核心能力
1. 模型类型与选择
scikit-survival 提供多种模型系列,每种适用于不同场景:
Cox 比例风险模型
用于:标准生存分析,具有可解释系数
CoxPHSurvivalAnalysis:基本 Cox 模型CoxnetSurvivalAnalysis:惩罚 Cox,适用于高维数据IPCRidge:加速失效时间模型的岭回归
参见:references/cox-models.md 获取 Cox 模型、正则化和解释的详细指导
集成方法
用于:高预测性能,处理复杂非线性关系
RandomSurvivalForest:稳健、非参数集成方法GradientBoostingSurvivalAnalysis:基于树的提升,最大化性能ComponentwiseGradientBoostingSurvivalAnalysis:线性提升,带特征选择ExtraSurvivalTrees:极度随机树,用于额外正则化
参见:references/ensemble-models.md 获取集成方法、超参数调优和模型选择的全面指导
生存支持向量机
用于:中型数据集,基于边缘学习
FastSurvivalSVM:线性 SVM,优化速度FastKernelSurvivalSVM:核 SVM,处理非线性关系HingeLossSurvivalSVM:使用铰链损失的 SVMClinicalKernelTransform:专用于临床和分子数据的核变换
参见:references/svm-models.md 获取 SVM 指导、核选择和超参数调优
模型选择决策树
开始
├─ 高维数据 (p > n)?
│ ├─ 是 → CoxnetSurvivalAnalysis(弹性网)
│ └─ 否 → 继续
│
├─ 需要可解释系数?
│ ├─ 是 → CoxPHSurvivalAnalysis 或 ComponentwiseGradientBoostingSurvivalAnalysis
│ └─ 否 → 继续
│
├─ 预期复杂非线性关系?
│ ├─ 是
│ │ ├─ 大数据集 (n > 1000) → GradientBoostingSurvivalAnalysis
│ │ ├─ 中型数据集 → RandomSurvivalForest 或 FastKernelSurvivalSVM
│ │ └─ 小数据集 → RandomSurvivalForest
│ └─ 否 → CoxPHSurvivalAnalysis 或 FastSurvivalSVM
│
└─ 为最大化性能 → 尝试多个模型并比较
2. 数据准备与预处理
在建模前,正确准备生存数据:
创建生存结果
from sksurv.util import Surv
# 从单独数组
y = Surv.from_arrays(event=event_array, time=time_array)
# 从 DataFrame
y = Surv.from_dataframe('event', 'time', df)
基本预处理步骤
- 处理缺失值:特征的插补策略
- 编码分类变量:独热编码或标签编码
- 标准化特征:对 SVM 和正则化 Cox 模型关键
- 验证数据质量:检查负时间、每个特征的足够事件
- 训练-测试分割:保持分割间相似的截尾率
参见:references/data-handling.md 获取完整预处理工作流、数据验证和最佳实践
3. 模型评估
正确评估对生存模型至关重要。使用考虑截尾的适当指标:
一致性指数(C-index)
主要用于排序/区分度:
- Harrell’s C-index:用于低截尾(<40%)
- Uno’s C-index:用于中高截尾(>40%),更稳健
from sksurv.metrics import concordance_index_censored, concordance_index_ipcw
# Harrell's C-index
c_harrell = concordance_index_censored(y_test['event'], y_test['time'], risk_scores)[0]
# Uno's C-index(推荐)
c_uno = concordance_index_ipcw(y_train, y_test, risk_scores)[0]
时间依赖 AUC
评估特定时间点的区分度:
from sksurv.metrics import cumulative_dynamic_auc
times = [365, 730, 1095] # 1, 2, 3 年
auc, mean_auc = cumulative_dynamic_auc(y_train, y_test, risk_scores, times)
Brier 分数
评估区分度和校准:
from sksurv.metrics import integrated_brier_score
ibs = integrated_brier_score(y_train, y_test, survival_functions, times)
参见:references/evaluation-metrics.md 获取全面评估指导、指标选择和交叉验证中使用评分器
4. 竞争风险分析
处理具有多种互斥事件类型的情况:
from sksurv.nonparametric import cumulative_incidence_competing_risks
# 估计每个事件类型的累积发生率
time_points, cif_event1, cif_event2 = cumulative_incidence_competing_risks(y)
使用竞争风险时:
- 存在多种互斥事件类型(例如,不同原因死亡)
- 一个事件的发生阻止其他事件
- 需要特定事件类型的概率估计
参见:references/competing-risks.md 获取详细竞争风险方法、原因特定风险模型和解释
5. 非参数估计
无参数假设估计生存函数:
Kaplan-Meier 估计器
from sksurv.nonparametric import kaplan_meier_estimator
time, survival_prob = kaplan_meier_estimator(y['event'], y['time'])
Nelson-Aalen 估计器
from sksurv.nonparametric import nelson_aalen_estimator
time, cumulative_hazard = nelson_aalen_estimator(y['event'], y['time'])
典型工作流
工作流 1:标准生存分析
from sksurv.datasets import load_breast_cancer
from sksurv.linear_model import CoxPHSurvivalAnalysis
from sksurv.metrics import concordance_index_ipcw
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 1. 加载和准备数据
X, y = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 2. 预处理
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 3. 拟合模型
estimator = CoxPHSurvivalAnalysis()
estimator.fit(X_train_scaled, y_train)
# 4. 预测
risk_scores = estimator.predict(X_test_scaled)
# 5. 评估
c_index = concordance_index_ipcw(y_train, y_test, risk_scores)[0]
print(f"C-index: {c_index:.3f}")
工作流 2:高维数据与特征选择
from sksurv.linear_model import CoxnetSurvivalAnalysis
from sklearn.model_selection import GridSearchCV
from sksurv.metrics import as_concordance_index_ipcw_scorer
# 1. 使用惩罚 Cox 进行特征选择
estimator = CoxnetSurvivalAnalysis(l1_ratio=0.9) # Lasso-like
# 2. 交叉验证调优正则化
param_grid = {'alpha_min_ratio': [0.01, 0.001]}
cv = GridSearchCV(estimator, param_grid,
scoring=as_concordance_index_ipcw_scorer(), cv=5)
cv.fit(X, y)
# 3. 识别选中特征
best_model = cv.best_estimator_
selected_features = np.where(best_model.coef_ != 0)[0]
工作流 3:集成方法最大化性能
from sksurv.ensemble import GradientBoostingSurvivalAnalysis
from sklearn.model_selection import GridSearchCV
# 1. 定义参数网格
param_grid = {
'learning_rate': [0.01, 0.05, 0.1],
'n_estimators': [100, 200, 300],
'max_depth': [3, 5, 7]
}
# 2. 网格搜索
gbs = GradientBoostingSurvivalAnalysis()
cv = GridSearchCV(gbs, param_grid, cv=5,
scoring=as_concordance_index_ipcw_scorer(), n_jobs=-1)
cv.fit(X_train, y_train)
# 3. 评估最佳模型
best_model = cv.best_estimator_
risk_scores = best_model.predict(X_test)
c_index = concordance_index_ipcw(y_train, y_test, risk_scores)[0]
工作流 4:全面模型比较
from sksurv.linear_model import CoxPHSurvivalAnalysis
from sksurv.ensemble import RandomSurvivalForest, GradientBoostingSurvivalAnalysis
from sksurv.svm import FastSurvivalSVM
from sksurv.metrics import concordance_index_ipcw, integrated_brier_score
# 定义模型
models = {
'Cox': CoxPHSurvivalAnalysis(),
'RSF': RandomSurvivalForest(n_estimators=100, random_state=42),
'GBS': GradientBoostingSurvivalAnalysis(random_state=42),
'SVM': FastSurvivalSVM(random_state=42)
}
# 评估每个模型
results = {}
for name, model in models.items():
model.fit(X_train_scaled, y_train)
risk_scores = model.predict(X_test_scaled)
c_index = concordance_index_ipcw(y_train, y_test, risk_scores)[0]
results[name] = c_index
print(f"{name}: C-index = {c_index:.3f}")
# 选择最佳模型
best_model_name = max(results, key=results.get)
print(f"
最佳模型: {best_model_name}")
与 scikit-learn 集成
scikit-survival 完全集成 scikit-learn 生态系统:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score, GridSearchCV
# 使用管道
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', CoxPHSurvivalAnalysis())
])
# 使用交叉验证
scores = cross_val_score(pipeline, X, y, cv=5,
scoring=as_concordance_index_ipcw_scorer())
# 使用网格搜索
param_grid = {'model__alpha': [0.1, 1.0, 10.0]}
cv = GridSearchCV(pipeline, param_grid, cv=5)
cv.fit(X, y)
最佳实践
- 始终标准化特征:对 SVM 和正则化 Cox 模型
- 使用 Uno’s C-index:截尾 > 40% 时,而非 Harrell’s
- 报告多个评估指标:C-index、集成 Brier 分数、时间依赖 AUC
- 检查比例风险假设:对 Cox 模型
- 使用交叉验证:超参数调优与适当评分器
- 验证数据质量:建模前检查负时间、每个特征的足够事件
- 比较多种模型类型:找到最佳性能
- 使用排列重要性:随机生存森林(非内置重要性)
- 考虑竞争风险:当存在多个事件类型时
- 记录截尾机制和率:分析中
常见陷阱避免
- 高截尾时使用 Harrell’s C-index → 使用 Uno’s C-index
- SVM 未标准化特征 → 始终标准化
- 忘记传递 y_train 到 concordance_index_ipcw → IPCW 计算所需
- 将竞争事件视为截尾 → 使用竞争风险方法
- 未检查每个特征的足够事件 → 经验法则:每个特征 10+ 事件
- 使用 RSF 内置特征重要性 → 使用排列重要性
- 忽略比例风险假设 → 验证或使用替代模型
- 交叉验证中未使用适当评分器 → 使用 as_concordance_index_ipcw_scorer()
参考文件
此技能包含特定主题的详细参考文件:
references/cox-models.md:Cox 比例风险模型、惩罚 Cox(CoxNet)、IPCRidge、正则化策略和解释的完整指南references/ensemble-models.md:随机生存森林、梯度提升、超参数调优、特征重要性和模型选择references/evaluation-metrics.md:一致性指数(Harrell’s vs Uno’s)、时间依赖 AUC、Brier 分数、全面评估流程references/data-handling.md:数据加载、预处理工作流、处理缺失数据、特征编码、验证检查references/svm-models.md:生存支持向量机、核选择、临床核变换、超参数调优references/competing-risks.md:竞争风险分析、累积发生率函数、原因特定风险模型
需要详细任务信息时加载这些参考文件。
额外资源
- 官方文档:https://scikit-survival.readthedocs.io/
- GitHub 仓库:https://github.com/sebp/scikit-survival
- 内置数据集:使用
sksurv.datasets获取练习数据集(GBSG2、WHAS500、老兵肺癌等) - API 参考:完整类和函数列表 https://scikit-survival.readthedocs.io/en/stable/api/index.html
快速参考:关键导入
# 模型
from sksurv.linear_model import CoxPHSurvivalAnalysis, CoxnetSurvivalAnalysis, IPCRidge
from sksurv.ensemble import RandomSurvivalForest, GradientBoostingSurvivalAnalysis
from sksurv.svm import FastSurvivalSVM, FastKernelSurvivalSVM
from sksurv.tree import SurvivalTree
# 评估指标
from sksurv.metrics import (
concordance_index_censored,
concordance_index_ipcw,
cumulative_dynamic_auc,
brier_score,
integrated_brier_score,
as_concordance_index_ipcw_scorer,
as_integrated_brier_score_scorer
)
# 非参数估计
from sksurv.nonparametric import (
kaplan_meier_estimator,
nelson_aalen_estimator,
cumulative_incidence_competing_risks
)
# 数据处理
from sksurv.util import Surv
from sksurv.preprocessing import OneHotEncoder, encode_categorical
from sksurv.datasets import load_gbsg2, load_breast_cancer, load_veterans_lung_cancer
# 核
from sksurv.kernels import ClinicalKernelTransform