关于 scikit-survival
scikit-survival 是使用 scikit-survival 进行 Python 生存分析的指导技能,该库基于 scikit-learn。它面向处理删失时间事件数据的分析人员,涵盖多类模型及考虑删失的评估方法。
主要功能
- 01准备并验证删失生存数据
- 02拟合 Cox、集成与 SVM 模型
- 03估计 Kaplan-Meier 和 Nelson-Aalen 曲线
- 04使用考虑删失的指标评估
- 05分析竞争风险
适用场景
- 01对含删失记录的事件时间建模
- 02比较不同生存模型系列
- 03在高删失情况下评估预测
- 04估计不同竞争事件的风险
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill scikit-survival安装后在 Claude Code 中输入/scikit-survival确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/competing-risks.mdcox-models.mddata-handling.mdensemble-models.mdevaluation-metrics.mdsvm-models.md详细介绍
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:针对速度优化的线性 SVMFastKernelSurvivalSVM:用于非线性关系的核 SVMHingeLossSurvivalSVM:采用合页损失的 SVMClinicalKernelTransform:适用于临床和分子数据的专用核函数
参见:references/svm-models.md,了解 SVM 的详细指南、核函数选择和超参数调优
模型选择决策树
Start
├─ High-dimensional data (p > n)?
│ ├─ Yes → CoxnetSurvivalAnalysis (elastic net)
│ └─ No → Continue
│
├─ Need interpretable coefficients?
│ ├─ Yes → CoxPHSurvivalAnalysis or ComponentwiseGradientBoostingSurvivalAnalysis
│ └─ No → Continue
│
├─ Complex non-linear relationships expected?
│ ├─ Yes
│ │ ├─ Large dataset (n > 1000) → GradientBoostingSurvivalAnalysis
│ │ ├─ Medium dataset → RandomSurvivalForest or FastKernelSurvivalSVM
│ │ └─ Small dataset → RandomSurvivalForest
│ └─ No → CoxPHSurvivalAnalysis or FastSurvivalSVM
│
└─ For maximum performance → Try multiple models and compare
2. 数据准备与预处理
建模之前,应妥善准备生存数据:
创建生存结局
from sksurv.util import Surv
# From separate arrays
y = Surv.from_arrays(event=event_array, time=time_array)
# From DataFrame
y = Surv.from_dataframe('event', 'time', df)
必要的预处理步骤
- 处理缺失值:对特征采用插补策略
- 编码分类变量:采用独热编码或标签编码
- 标准化特征:对 SVM 和正则化 Cox 模型至关重要
- 验证数据质量:检查是否存在负时间,以及每个特征对应的事件数是否充足
- 划分训练集与测试集:确保各划分中的删失率相近
参见:references/data-handling.md,了解完整的预处理工作流、数据验证和最佳实践
3. 模型评估
恰当的评估对生存模型至关重要。应使用能考虑删失情况的合适指标:
一致性指数(C-index)
用于排序和区分能力的主要指标:
- Harrell 的 C-index:适用于删失率较低(<40%)的情况
- Uno 的 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 (recommended)
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 years
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
# Estimate cumulative incidence for each event type
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. Load and prepare data
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. Preprocess
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 3. Fit model
estimator = CoxPHSurvivalAnalysis()
estimator.fit(X_train_scaled, y_train)
# 4. Predict
risk_scores = estimator.predict(X_test_scaled)
# 5. Evaluate
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. Use penalized Cox for feature selection
estimator = CoxnetSurvivalAnalysis(l1_ratio=0.9) # Lasso-like
# 2. Tune regularization with cross-validation
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. Identify selected features
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. Define parameter grid
param_grid = {
'learning_rate': [0.01, 0.05, 0.1],
'n_estimators': [100, 200, 300],
'max_depth': [3, 5, 7]
}
# 2. Grid search
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. Evaluate best model
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
# Define models
models = {
'Cox': CoxPHSurvivalAnalysis(),
'RSF': RandomSurvivalForest(n_estimators=100, random_state=42),
'GBS': GradientBoostingSurvivalAnalysis(random_state=42),
'SVM': FastSurvivalSVM(random_state=42)
}
# Evaluate each model
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}")
# Select best model
best_model_name = max(results, key=results.get)
print(f"\nBest model: {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
# Use pipelines
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', CoxPHSurvivalAnalysis())
])
# Use cross-validation
scores = cross_val_score(pipeline, X, y, cv=5,
scoring=as_concordance_index_ipcw_scorer())
# Use grid search
param_grid = {'model__alpha': [0.1, 1.0, 10.0]}
cv = GridSearchCV(pipeline, param_grid, cv=5)
cv.fit(X, y)
最佳实践
- 始终对特征进行标准化,用于 SVM 和正则化 Cox 模型
- 当删失比例 > 40% 时,使用 Uno's C-index,而不是 Harrell's C-index
- 报告多种评估指标(C-index、积分 Brier 分数、时间依赖 AUC)
- 检查 Cox 模型的比例风险假设
- 使用交叉验证进行超参数调优,并选择合适的评分器
- 建模前验证数据质量(检查是否存在负时间,以及每个特征是否有足够的事件数)
- 比较多种模型类型,以找到性能最佳的模型
- 对 Random Survival Forests 使用置换重要性(而非内置的重要性)
- 存在多种事件类型时考虑竞争风险
- 在分析中记录删失机制和删失率
应避免的常见陷阱
- 删失比例较高时使用 Harrell's C-index → 改用 Uno's C-index
- 未对 SVM 的特征进行标准化 → 始终进行标准化
- 忘记向 concordance_index_ipcw 传入 y_train → 计算 IPCW 时必须传入
- 将竞争事件视为删失事件 → 使用竞争风险方法
- 未检查每个特征是否有足够的事件数 → 经验法则:每个特征至少有 10 个事件
- 使用 RSF 的内置特征重要性 → 改用置换重要性
- 忽略比例风险假设 → 验证该假设,或使用其他模型
- 交叉验证时未使用合适的评分器 → 使用 as_concordance_index_ipcw_scorer()
参考文件
此技能包含针对特定主题的详细参考文件:
references/cox-models.md:Cox 比例风险模型、惩罚 Cox(CoxNet)、IPCRidge、正则化策略及结果解读的完整指南references/ensemble-models.md:Random Survival Forests、Gradient Boosting、超参数调优、特征重要性及模型选择references/evaluation-metrics.md:一致性指数(Harrell's 与 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
快速参考:关键导入
# Models
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
# Evaluation metrics
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
)
# Non-parametric estimation
from sksurv.nonparametric import (
kaplan_meier_estimator,
nelson_aalen_estimator,
cumulative_incidence_competing_risks
)
# Data handling
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
# Kernels
from sksurv.kernels import ClinicalKernelTransform