关于 scikit-survival
scikit-survival 是一项使用 scikit-survival 和 scikit-learn 构建、评估生存分析工作流的技能,涵盖删失结局、竞争风险累积发生率、防泄漏管道与模型选择,并强调谨慎解读而非临床结论。
主要功能
- 01删失生存结局分析指引
- 02Cox、树、提升与 SVM 模型
- 03竞争风险累积发生率
- 04评估指标与时变预测
- 05防数据泄漏管道与嵌套模型选择
- 06用于验证、训练和报告的本地 CLI
适用场景
- 01基于右删失数据构建生存模型
- 02评估区分度和预测误差
- 03估算竞争风险下的非参数发生率
- 04使用本地数据生成可复现模型报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ k-dense-ai/ scientific-agent-skills --skill scikit-survival安装后在 Claude Code 中输入/scikit-survival确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/competing-risks.mdcox-models.mddata-handling.mdensemble-models.mdevaluation-metrics.mdsvm-models.mdscripts/_common.pycompeting_risk_cif.pyevaluate_survival_metrics.pymodel_report.pytrain_survival_model.pyvalidate_survival_csv.py详细介绍
scikit-survival
适用范围
本技能适用于 scikit-survival 0.28.0 的相关工作流,涉及:
- 右删失结构化结局;
- Cox PH、Coxnet、IPC ridge、生存树、森林、提升方法和 SVM;
- 区分度、预测误差、面向校准的检查以及时间依赖预测;
- 竞争风险下的非参数累积发生率;
- scikit-learn 管道、嵌套模型选择以及可复现报告。
scikit-survival 主要对右删失结局建模。其内置的竞争风险支持是非参数累积发生率;不提供 Fine-Gray 回归。 不要将模型输出表述为临床建议、因果证据或临床效用证明。
使用研究自定义变量(如 X_train、y_train、frame 或 times)的 Python 代码片段是示例性集成模板。原生回归测试和本地命令行冒烟运行使用小型合成夹具;它们不验证未提供的研究、临床数据集或每个可选 dataframe 后端。
当前版本与安装
已验证 2026-10-01:
- 最新稳定版:scikit-survival 0.28.0,发布于 2026-07-05。
- Python:3.11 或更高版本;PyPI wheels 覆盖 Linux x86-64、macOS x86-64/ARM64 和 Windows x86-64 上的 CPython 3.11-3.14。
- 运行时约束:NumPy >=2.0.0、pandas >=2.2.0、SciPy >=1.13.0、scikit-learn >=1.9.0,<1.10、OSQP >=1.0.2、narwhals >=2.0.1。
- 0.28 通过 narwhals 增加了 pandas/Polars 估计器支持,并从
GradientBoostingSurvivalAnalysis中移除了criterion。
原生刷新测试使用 Python 3.13 和以下快照(NumPy 2.5.1 已缓存;这是经过测试的快照,并不声称每个固定版本都是最新)。 创建隔离环境:
uv venv .venv-survival --python 3.13
source .venv-survival/bin/activate
uv pip install \
"scikit-survival==0.28.0" \
"scikit-learn==1.9.1" \
"numpy==2.5.1" \
"pandas==3.0.6" \
"scipy==1.18.1" \
"ecos==2.0.14" \
"osqp==1.1.3" \
"joblib==1.6.0" \
"numexpr==2.14.2" \
"narwhals==2.26.0"
优先使用二进制 wheels。源码构建需要 C/C++ 编译器;OSQP 可能还需要 CMake。本技能采用 MIT 许可证;上游 scikit-survival 包采用 GPL-3.0-or-later,因此再分发前请审查上游许可。
不可协商的工作流
- 定义估计目标和事件编码。 确定目标是全事件生存、原因别风险还是原因别累积发生率。
- 验证结局。 标准估计器需要两字段结构化数组:布尔事件在前,观测时间在后。竞争风险 CIF 则需要单独的整数事件向量:0=删失,1..K=原因。
- 在学习型预处理之前划分数据。 绝不要在划分之前对所有行拟合插补器、编码器、缩放器、特征选择器或 alpha 选择。
- 在管道内拟合预处理。 未知类别和缺失值必须仅使用训练折状态来处理。
- 调优时不得复用评估数据。 报告交叉验证调优性能时使用嵌套 CV,或保留一个真正未触碰的最终留出集。
- 在训练数据上拟合删失分布。 IPCW 一致性、动态 AUC 和 Brier 指标接收
survival_train,绝不要使用合并的训练+测试结局。 - 限制评估时间。 使用严格递增的网格,位于测试随访期内且低于训练支撑结束处,此时估计的删失生存仍为正。
- 使预测与指标匹配。 一致性/动态 AUC 使用越高风险越高的分数。Brier 指标使用形状为
(n_test, n_times)的生存概率,而不是风险分数或未评估的阶梯函数。 - 显式处理竞争原因。 标准生存概率和 CIF 回答不同的问题。在对竞争事件进行删失时,绝不要用
1 - Kaplan-Meier估计事件特定概率。 - 报告局限性。 分别报告区分度、校准、预测误差和累积发生率。任何一项单独都不能确立决策或临床效用。
结果构建
from sksurv.util import Surv
y = Surv.from_arrays(event=event_bool, time=observed_time)
# Equivalent for pandas or Polars:
y = Surv.from_dataframe("event", "time", frame)
第一个字段为布尔值(True=事件,False=右删失);第二个字段为浮点时间。字段名可以不同,但字段顺序和含义不可更改。在加载自定义数据或竞争风险数据之前,请先阅读 references/data-handling.md。
防泄漏的流水线
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sksurv.linear_model import CoxPHSurvivalAnalysis
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, stratify=y["event"], random_state=20260723
)
preprocess = ColumnTransformer(
[
("num", make_pipeline(SimpleImputer(strategy="median"), StandardScaler()), numeric),
(
"cat",
make_pipeline(
SimpleImputer(strategy="most_frequent"),
OneHotEncoder(handle_unknown="ignore", drop="first", sparse_output=False),
),
categorical,
),
],
sparse_threshold=0.0,
)
model = make_pipeline(preprocess, CoxPHSurvivalAnalysis(alpha=0.1, ties="efron"))
model.fit(X_train, y_train)
risk = model.predict(X_test)
划分先于所有学习到的变换。对于重复或分组记录,请使用感知分组的划分;对于时间性部署,请使用尊重时间顺序的划分。
模型选择
CoxPHSurvivalAnalysis:在比例风险假设下可解释的对数风险系数;alpha是岭收缩,ties为"breslow"或"efron"。CoxnetSurvivalAnalysis:面向高维数据的 LASSO/弹性网路径。l1_ratio取值范围为(0, 1];在请求生存函数或累积风险函数之前,请设置fit_baseline_model=True。IPCRidge:IPC 加权的岭 AFT 模型;predict()返回原始时间值(拟合目标使用对数时间),而非 Cox 风险分数。RandomSurvivalForest/ExtraSurvivalTrees:非线性生存和累积风险预测;请使用置换重要性,而非不纯度重要性。GradientBoostingSurvivalAnalysis:使用"coxph"、"squared"或"ipcwls"损失的树提升。criterion已在 0.28 中移除。ipcwls实现存在对数时间验证和缺失梯度权重缺陷;在依赖它之前请阅读集成模型参考。ComponentwiseGradientBoostingSurvivalAnalysis:稀疏线性逐分量提升。FastSurvivalSVM/FastKernelSurvivalSVM:排序或回归目标。只有rank_ratio=1直接返回越高越有风险的分数;SVM 不会产生用于 Brier 指标的生存概率。
在解释系数或预测之前,请阅读特定模型的参考文档:references/cox-models.md、references/ensemble-models.md 或 references/svm-models.md。
预测与指标约定
import numpy as np
from sksurv.metrics import (
brier_score,
concordance_index_ipcw,
cumulative_dynamic_auc,
integrated_brier_score,
)
risk = model.predict(X_test) # (n_test,), higher means higher event risk
uno_c = concordance_index_ipcw(y_train, y_test, risk, tau=times[-1])[0]
auc_t, mean_auc = cumulative_dynamic_auc(y_train, y_test, risk, times)
surv_fns = model.predict_survival_function(X_test)
surv_prob = np.vstack([fn(times) for fn in surv_fns]) # (n_test, n_times)
_, brier_t = brier_score(y_train, y_test, surv_prob, times)
ibs = integrated_brier_score(y_train, y_test, surv_prob, times)
- Harrell C 和 Uno C 衡量排序区分度,而非校准。
- 累积/动态 AUC 衡量选定时间点上的区分度,接受一维或随时间变化的二维风险分数。不要依赖运行时拒绝来捕获生存概率:它们也是数值数组,但其排序方向相反。在解释 AUC 之前,请确认较高的输入值意味着更大的事件风险。
- Brier 分数是经删失加权的概率误差,同时反映区分度和校准。它本身不是一条校准曲线。
- 校准需要在独立数据上进行特定时间点的预测值与观测值对比检查。scikit-survival 0.28 没有专门的校准曲线 API。
评估器对组合指标应用保守的共同支持集规则;AUC 还需在每个时间点上有观测到的事件和对照。预测导出会检查此约定,并在不支持的留出集上明确失败。
关于假设、主要文献、安全时间网格构建和评分器封装,请参见 references/evaluation-metrics.md。
流水线、元数据路由与调参
普通的 Pipeline.fit(X, y) 无需元数据路由设置。诸如 as_concordance_index_ipcw_scorer 之类的指标封装是估计器封装,而非 scoring= 可调用对象:
from sklearn.model_selection import GridSearchCV
from sksurv.metrics import as_concordance_index_ipcw_scorer
wrapped = as_concordance_index_ipcw_scorer(model, tau=tau)
search = GridSearchCV(
wrapped,
{"estimator__coxphsurvivalanalysis__alpha": [0.01, 0.1, 1.0]},
cv=inner_splits,
)
封装会从每个拟合折中学习删失分布。被封装的参数需加上前缀 estimator__。仅当通过元估计器传递额外元数据时,才启用 scikit-learn 元数据路由。例如,Coxnet 的 set_predict_request(alpha=True) 仅在配合 sklearn.set_config(enable_metadata_routing=True) 路由 alpha 预测参数时才重要。
在内层调参之后,使用外层 CV 循环以获得无偏的 CV 性能估计。不要从同一批折中选择参数并报告性能,仿佛它们是外部数据一样。
竞争风险
from sksurv.nonparametric import cumulative_incidence_competing_risks
# status: integer array, 0=censored, 1..K=mutually exclusive causes
time, cif = cumulative_incidence_competing_risks(status, observed_time)
total_cif = cif[0]
cause_1_cif = cif[1]
cif 的形状为 (K + 1, n_times);第 0 行是总风险,第 1..K 行是
特定原因累积发生率。在 0.28.0 中,原始的总风险置信区间被反转且忽略
conf_level;随附的辅助工具使用 Kaplan–Meier 对其进行修复。由于上游
形状缺陷,会移除时间点的条件 time_min 受到保护。在请求区间之前,
请参阅竞争风险参考文档。特定原因 Cox 模型将其他原因视为删失,
以估计特定原因风险,但其中一个此类模型的 1 - survival 并非
特定原因 CIF。请参阅 references/competing-risks.md。
随附的本地 CLI
当未提供输入时,所有辅助工具都使用确定性合成数据;仅报告的示例包含 说明性指标值,而非模型拟合的结果。它们不进行网络调用,拒绝 URL 和 符号链接,限制文件/行/特征数量,避免不安全的 pickle 加载,并延迟导入 科学计算包。
python skills/scikit-survival/scripts/validate_survival_csv.py --help
python skills/scikit-survival/scripts/train_survival_model.py --help
python skills/scikit-survival/scripts/evaluate_survival_metrics.py --help
python skills/scikit-survival/scripts/competing_risk_cif.py --help
python skills/scikit-survival/scripts/model_report.py --help
典型的本地流程:
python skills/scikit-survival/scripts/validate_survival_csv.py \
--input data.csv --event-column event --time-column time \
--feature-columns age,group,measurement --structured-output outcome.npy
python skills/scikit-survival/scripts/train_survival_model.py \
--input data.csv --event-column event --time-column time \
--numeric-columns age,measurement --categorical-columns group \
--model coxph --tune --prediction-output predictions.npz \
--output training-summary.json
python skills/scikit-survival/scripts/evaluate_survival_metrics.py \
--input predictions.npz --output metrics-summary.json
python skills/scikit-survival/scripts/model_report.py \
--training-summary training-summary.json \
--metrics-summary metrics-summary.json --output model-report.md
报告辅助工具会汇总所提供的两个 JSON 文件;它无法确定它们描述的是 同一个已拟合模型和留出队列。在合并汇总之前,请核验其来源。 它输出 Markdown 文本,而非图表或 CIF 结果。
仅使用去标识化、经授权的本地数据。随附的测试仅包含合成记录, 不含患者数据或 PHI。
安全分诊
SECURITY.md 此前声称此技能随附了名为 sklearn.py 和 sksurv.py 的
包遮蔽文件。先前的 2026-07-23 清单确认这些文件不存在;该声称是
分析器产生的幻觉发现。本次更新仅添加了描述性命名的辅助工具,
没有遮蔽模块、环境读取或网络调用。
切勿以导入的包名命名项目脚本(包括 sklearn.py、
sksurv.py、numpy.py 或 pandas.py),因为 Python 可能会导入本地文件
而非已安装的库。在执行从不受信任来源复制的示例之前,请检查
工作目录。
参考文件
references/data-handling.md— 结构化数组、数据集、模式验证、 pandas/Polars 预处理以及防泄漏划分。references/cox-models.md— Cox PH、Coxnet、IPCRidge、假设和调优。references/ensemble-models.md— 森林、树、提升、预测和 排列重要性。references/svm-models.md— SVM 目标、预测方向、缩放、 核函数和局限性。references/evaluation-metrics.md— 指标输入、删失假设、 时间网格、校准、嵌套 CV 和主要文献。references/competing-risks.md— 整数事件编码、CIF API、内置 数据集、特定原因风险和不受支持的 Fine-Gray 回归。
带日期的来源
官方 API 和兼容性来源,检查于 2026-10-01。已发布的 v0.28.0 源代码和原生执行优先于过时的缓存 API 页面:
- PyPI 0.28.0 — 发布于 2026-07-05。
- GitHub v0.28.0 release — 发布于 2026-07-05。
- 0.28 release notes。
- Installation guide。
- Stable user guide。
- Released implementation。
- Stable API reference。
引用 Scientific Agent Skills
本技能是 K-Dense 出品的 Scientific Agent Skills 的一部分。如果它对一篇论文、报告、演示文稿或代码发布有实质性贡献,请将该论文加入参考文献或软件部分,并告知用户你已这样做:
Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065
请始终引用当前版本。该 DOI 和 https://arxiv.org/abs/2609.00065 都指向最新的 arXiv 版本,因此切勿附加 v1 之类的版本后缀。当有网络访问时,请在撰写参考文献前获取 https://arxiv.org/abs/2609.00065(或
http://export.arxiv.org/api/query?id_list=2609.00065),并从该记录中获取作者列表、年份和版本。如果该记录列出了期刊参考文献或出版商 DOI,请改为引用已发表版本。