技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
scikit-survival【数据与研究】A comprehensive toolkit for survival analysis and time-to-event modeling in Python using scikit-survival; use it when you need to model censored time-to-event outcomes, fit Cox/RSF/GB models or Survival SVMs, evaluate with C-index/Brier score, or handle competing risks.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Use this skill when you need to:
sksurv.util.Surv (arrays or DataFrame).CoxPHSurvivalAnalysis, CoxnetSurvivalAnalysisRandomSurvivalForest, GradientBoostingSurvivalAnalysis, ExtraSurvivalTreesFastSurvivalSVM, FastKernelSurvivalSVMGridSearchCV with survival scorers.Additional topic guides may exist under:
references/cox-models.mdreferences/ensemble-models.mdreferences/svm-models.mdreferences/data-handling.mdreferences/evaluation-metrics.mdreferences/competing-risks.md
scikit-survival (recommended: >=0.22)scikit-learn (recommended: >=1.2)numpy (recommended: >=1.23)pandas (recommended: >=1.5)A complete, runnable example using a scikit-survival built-in dataset, a scikit-learn pipeline, and Uno’s C-index (IPCW):
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sksurv.datasets import load_breast_cancer
from sksurv.linear_model import CoxPHSurvivalAnalysis
from sksurv.metrics import concordance_index_ipcw, as_concordance_index_ipcw_scorer
# 1) Load data (X: features, y: structured array with fields like ('event', 'time'))
X, y = load_breast_cancer()
# 2) Split (keep y_train for IPCW-based metrics)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3) Build a pipeline (scaling is important for many survival models)
pipe = Pipeline([
("scaler", StandardScaler()),
("model", CoxPHSurvivalAnalysis()),
])
# 4) Optional: hyperparameter tuning (CoxPH has few knobs; shown for workflow completeness)
# If your version exposes regularization parameters, tune them here.
param_grid = {
# Example placeholder; remove if unsupported in your installed version:
# "model__alpha": [0.0, 1e-4, 1e-3]
}
if param_grid:
search = GridSearchCV(
pipe,
param_grid=param_grid,
scoring=as_concordance_index_ipcw_scorer(),
cv=5,
n_jobs=-1,
)
search.fit(X_train, y_train)
best = search.best_estimator_
else:
best = pipe.fit(X_train, y_train)
# 5) Predict risk scores (higher typically means higher risk / shorter survival)
risk_scores = best.predict(X_test)
# 6) Evaluate with Uno's C-index (IPCW)
c_uno = concordance_index_ipcw(y_train, y_test, risk_scores)[0]
print(f"Uno's C-index (IPCW): {c_uno:.3f}")
Surv)scikit-survival expects outcomes as a structured array with at least:
Common construction patterns:
from sksurv.util import Surv
y = Surv.from_arrays(event=event_array, time=time_array)
# or
y = Surv.from_dataframe("event", "time", df)
CoxnetSurvivalAnalysis (Elastic Net) for stability and feature selection.CoxPHSurvivalAnalysis (coefficients as log hazard ratios).RandomSurvivalForest or GradientBoostingSurvivalAnalysis.FastKernelSurvivalSVM (ensure scaling).concordance_index_censored): common, but can be less robust with heavy censoring.concordance_index_ipcw): uses inverse probability of censoring weights and requires y_train to estimate censoring distribution.from sksurv.metrics import concordance_index_censored, concordance_index_ipcw
c_harrell = concordance_index_censored(y_test["event"], y_test["time"], risk_scores)[0]
c_uno = concordance_index_ipcw(y_train, y_test, risk_scores)[0]
from sksurv.metrics import cumulative_dynamic_auc
times = np.array([365, 730, 1095]) # example horizons
auc, mean_auc = cumulative_dynamic_auc(y_train, y_test, risk_scores, times)
Use competing risks methods when multiple mutually exclusive event types exist and one event prevents the others.
from sksurv.nonparametric import cumulative_incidence_competing_risks
# y must encode event types appropriately for competing risks workflows
time_points, cif1, cif2 = cumulative_incidence_competing_risks(y)