scikit-survival
scikit-survivalを使用したPythonでの生存分析・イベント発生時間モデリングに対応する包括的なツールキット。打ち切りデータの処理、Coxモデル・ランダムサバイバルフォレスト・勾配ブースティング・Survival SVMの学習、一致指数やBrierスコアによる予測評価、競合リスクの処理など、生存分析に関するワークフロー全般で活用できます。
description の原文を見る
Comprehensive toolkit for survival analysis and time-to-event modeling in Python using scikit-survival. Use this skill when working with censored survival data, performing time-to-event analysis, fitting Cox models, Random Survival Forests, Gradient Boosting models, or Survival SVMs, evaluating survival predictions with concordance index or Brier score, handling competing risks, or implementing any survival analysis workflow with the scikit-survival library.
SKILL.md 本文
scikit-survival: Python での生存分析
概要
scikit-survival は scikit-learn の上に構築された Python の生存分析ライブラリです。時間イベント分析用の特殊なツール、および観測期間中にイベントを経験していない観測値が部分的にのみ知られている打ち切りデータの独特な課題に対応します。
生存分析は、打ち切りレコード(特に参加者が観測期間中にイベントを経験しなかった研究からの右打ち切りデータ)を考慮して、共変量とイベント時間の関係を確立することを目的とします。
このスキルを使用する場合
以下の場合にこのスキルを使用します:
- 生存分析または時間イベントモデリングを実施する
- 打ち切りデータを操作する(右打ち切り、左打ち切り、または区間打ち切り)
- Cox 比例ハザードモデルを適合させる(標準または正則化)
- アンサンブル生存モデルを構築する(Random Survival Forest、Gradient Boosting)
- Survival Support Vector Machine を訓練する
- 生存モデルのパフォーマンスを評価する(一致性指数、Brier スコア、時間依存 AUC)
- Kaplan-Meier または Nelson-Aalen 曲線を推定する
- 競合リスクを分析する
- 生存データの前処理または生存データセットの欠損値を処理する
- scikit-survival ライブラリを使用した任意の分析を実施する
コア機能
1. モデルタイプと選択
scikit-survival は複数のモデルファミリーを提供し、それぞれ異なるシナリオに適しています:
Cox 比例ハザードモデル
使用対象:解釈可能な係数を持つ標準的な生存分析
CoxPHSurvivalAnalysis:基本的な Cox モデルCoxnetSurvivalAnalysis:高次元データ用の elastic net による正則化 CoxIPCRidge:加速故障時間モデル用の Ridge 回帰
参照:references/cox-models.md で Cox モデル、正則化、および解釈に関する詳細なガイダンス
アンサンブル手法
使用対象:複雑な非線形関係を持つ高い予測性能
RandomSurvivalForest:堅牢なノンパラメトリック アンサンブル手法GradientBoostingSurvivalAnalysis:最大のパフォーマンスのためのツリーベースのブースティングComponentwiseGradientBoostingSurvivalAnalysis:特徴選択を伴う線形ブースティングExtraSurvivalTrees:追加の正則化のための極端にランダム化されたツリー
参照:references/ensemble-models.md でアンサンブル手法、ハイパーパラメータ チューニング、および各モデルを使用する時期に関する包括的なガイダンス
Survival Support Vector Machine
使用対象:マージンベースの学習を使用した中規模データセット
FastSurvivalSVM:速度に最適化された線形 SVMFastKernelSurvivalSVM:非線形関係用のカーネル SVMHingeLossSurvivalSVM:ヒンジロスを使用した SVMClinicalKernelTransform:臨床データと分子データ用の特殊なカーネル
参照:references/svm-models.md で SVM のガイダンス、カーネル選択、およびハイパーパラメータ チューニング
モデル選択決定木
開始
├─ 高次元データ (p > n)?
│ ├─ はい → CoxnetSurvivalAnalysis (elastic net)
│ └─ いいえ → 続行
│
├─ 解釈可能な係数が必要?
│ ├─ はい → 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)
必須の前処理ステップ
- 欠損値を処理:特徴の補完戦略
- カテゴリ変数をエンコード:One-hot エンコーディングまたはラベルエンコーディング
- 特徴を標準化: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 の C-index
c_harrell = concordance_index_censored(y_test['event'], y_test['time'], risk_scores)[0]
# Uno の 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)
競合リスクを使用する場合:
- 複数の相互に排他的なイベントタイプが存在する(例:異なる原因による死亡)
- 1 つのイベントの発生が他を防止する
- 特定のイベントタイプの確率推定が必要
参照: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 のような
# 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"\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
# パイプラインを使用
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 の C-index を使用 Harrell の代わりに、打ち切り > 40% の場合
- 複数の評価メトリクスを報告 (C-index、統合 Brier スコア、時間依存 AUC)
- Cox モデルの比例ハザード仮定を確認
- ハイパーパラメータ チューニングに適切なスコアラーを伴うクロスバリデーションを使用
- モデリング前にデータ品質を検証 (負の時間をチェック、特徴ごとに十分なイベント)
- 複数のモデルタイプを比較 して最良のパフォーマンスを見つける
- Random Survival Forest に対して permutation importance を使用 (組み込みの importance ではない)
- 複数のイベントタイプが存在する場合は競合リスクを検討
- 分析で打ち切りメカニズムとレートを文書化
回避するべき一般的な落とし穴
- 高い打ち切りで Harrell の C-index を使用 → Uno の C-index を使用
- SVM の特徴を標準化しない → 常に標準化
- concordance_index_ipcw に y_train を渡すのを忘れる → IPCW 計算に必須
- 競合イベントを打ち切りとして扱う → 競合リスク方法を使用
- 特徴ごとに十分なイベントをチェックしない → 目安:特徴ごとに 10+ イベント
- RSF に組み込みの特徴重要度を使用 → permutation importance を使用
- 比例ハザード仮定を無視 → 検証するか代替モデルを使用
- クロスバリデーション内に適切なスコアラーを使用しない → as_concordance_index_ipcw_scorer() を使用
リファレンス ファイル
このスキルには特定のトピック用の詳細なリファレンス ファイルが含まれています:
references/cox-models.md:Cox 比例ハザードモデル、正則化 Cox(CoxNet)、IPCRidge、正則化戦略、および解釈の完全なガイドreferences/ensemble-models.md:Random Survival Forest、Gradient Boosting、ハイパーパラメータ チューニング、特徴重要度、およびモデル選択references/evaluation-metrics.md:一致性指数(Harrell の vs Uno の)、時間依存 AUC、Brier スコア、包括的な評価パイプラインreferences/data-handling.md:データ読み込み、前処理ワークフロー、欠損データの処理、特徴エンコーディング、検証チェックreferences/svm-models.md:Survival Support Vector Machine、カーネル選択、臨床カーネル変換、ハイパーパラメータ チューニングreferences/competing-risks.md:競合リスク分析、累積発生関数、原因別ハザードモデル
特定のタスク用の詳細情報が必要な場合、これらのリファレンス ファイルを読み込みます。
追加リソース
- 公式ドキュメント:https://scikit-survival.readthedocs.io/
- GitHub リポジトリ:https://github.com/sebp/scikit-survival
- 組み込みデータセット:
sksurv.datasetsを使用して練習用データセットを使用(GBSG2、WHAS500、veterans 肺がんなど) - 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
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- davila7
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/davila7/claude-code-templates / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。