mcpField
S
scikit-survival

scikit-survival

github.com/kalarislabsその他7344 回インストール4 日前に更新
リポジトリ

scikit-survival について

scikit-survivalは、scikit-learnを中心とするワークフロー向けの生存分析ライブラリです。主に右打ち切りデータを対象とし、複数のモデル群、評価指標、競合リスク累積発生率のツールとローカルCLIを備えます。

主な機能

  1. 01Cox、フォレスト、ブースティング、SVMモデル
  2. 02生存予測とリスクスコア
  3. 03打ち切りデータ向け評価指標
  4. 04競合リスク累積発生率の推定
  5. 05ローカルCLIによるデータ処理とモデリング

活用シーン

  1. 01右打ち切りデータのモデル構築
  2. 02交差検証による調整と評価
  3. 03競合リスク累積発生率の推定
  4. 04モデル評価レポートの生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill scikit-survival

インストール後、Claude Code で/scikit-survivalを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
competing-risks.md
cox-models.md
data-handling.md
ensemble-models.md
evaluation-metrics.md
svm-models.md
scripts/
_common.py
competing_risk_cif.py
evaluate_survival_metrics.py
model_report.py
train_survival_model.py
validate_survival_csv.py

詳細

scikit-survival

対象範囲

次のような scikit-survival 0.28.0 のワークフローでは、このスキルを使用してください。

  • 右打ち切りの構造化アウトカム
  • Cox PH、Coxnet、IPC ridge、生存木、ランダムフォレスト、ブースティング、SVM
  • 識別能、予測誤差、キャリブレーション指向のチェック、時間依存予測
  • 競合リスクを伴うノンパラメトリック累積発生率
  • scikit-learn のパイプライン、ネストしたモデル選択、再現可能なレポート

scikit-survival は主に右打ち切りアウトカムをモデル化します。組み込みの競合リスク対応はノンパラメトリック累積発生率に限られ、Fine-Gray 回帰は提供していません。モデルの出力を臨床上の助言、因果関係を示す証拠、または臨床的有用性の証明として提示しないでください。

現行リリースとインストール

2026-07-23 に確認済み:

  • 最新の安定版:scikit-survival 0.28.0。2026-07-05 リリース。
  • Python:3.11 以降。PyPI のホイールは、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 が削除されました。

分離された環境を作成し、テスト済みのスナップショットをインストールします。

uv venv --python 3.11
source .venv/bin/activate
uv pip install \
  "scikit-survival==0.28.0" \
  "scikit-learn==1.9.0" \
  "numpy==2.4.6" \
  "pandas==3.0.5" \
  "scipy==1.17.1" \
  "ecos==2.0.14" \
  "osqp==1.1.3" \
  "joblib==1.5.3" \
  "numexpr==2.14.2" \
  "narwhals==2.24.0"

バイナリホイールを推奨します。ソースからビルドするには C/C++ コンパイラーが必要です。また、OSQP には CMake も必要になる場合があります。このスキルは MIT ライセンスですが、上流の scikit-survival パッケージは GPL-3.0-or-later のため、再配布する前に上流のライセンスを確認してください。

必須ワークフロー

  1. 推定対象とイベントの符号化を定義します。 対象が全イベントの生存、原因別ハザード、原因別累積発生率のいずれかを決定します。
  2. アウトカムを検証します。 標準的な推定器には、2 フィールドの構造化配列が必要です。1 つ目はブール型のイベント、2 つ目は観測時間です。一方、競合リスクの CIF には、別個の整数イベントベクトルが必要です(0=打ち切り、1..K=原因)。
  3. 学習済みの前処理より先にデータを分割します。 分割前に、全行を使って補完器、エンコーダー、スケーラー、特徴選択器、アルファ値を決して適合させないでください。
  4. 前処理はパイプライン内で適合させます。 未知のカテゴリや欠損値は、学習フォールドの状態のみを使って処理する必要があります。
  5. 評価データを再利用せずにチューニングします。 チューニングした性能を交差検証で報告する場合はネスト交差検証を使うか、最終評価用に一切使用していないホールドアウトデータを確保します。
  6. 打ち切り分布は学習データで適合させます。 IPCW concordance、dynamic AUC、Brier 指標には、プールした train+test のアウトカムではなく、survival_train を渡します。
  7. 評価時点を制限します。 厳密に単調増加するグリッドを使い、テストデータの追跡期間内かつ学習データのサポート範囲の終了時点より前で、推定された打ち切り生存率が正の範囲に収めます。
  8. 予測を指標に適合させます。 Concordance/dynamic AUC には、値が高いほどリスクが高いスコアを渡します。Brier 指標には、リスクスコアや評価されていない階段関数ではなく、形状が (n_test, n_times) の生存確率を渡します。
  9. 競合原因を明示的に扱います。 標準的な生存確率と CIF は異なる問いに答えます。競合イベントを打ち切りとして扱う 1 - Kaplan-Meier で、イベント別確率を決して推定しないでください。
  10. 限界を報告します。 識別能、キャリブレーション、予測誤差、累積発生率を分けて示します。どれも単独では、意思決定上または臨床上の有用性を立証できません。

アウトカムの構築

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)

1 つ目のフィールドはブール型(True=イベント、False=右打ち切り)で、2 つ目は浮動小数点型の時間です。フィールド名は変更できますが、フィールドの順序と意味は変更できません。独自データや競合リスクデータを読み込む前に、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 モデルです。予測は時間/対数時間の尺度であり、Cox リスクスコアではありません。
  • RandomSurvivalForest/ExtraSurvivalTrees:非線形の生存予測と累積ハザード予測を提供します。不純度重要度ではなく、置換重要度を使用してください。
  • GradientBoostingSurvivalAnalysis:"coxph"、"squared"、または "ipcwls" の損失を用いる木のブースティングです。criterion は 0.28 で削除されました。
  • 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 は、選択した時点での識別性能を測定し、1 次元または時間依存の 2 次元リスクスコアを受け付けます。生存確率は受け付けません。
  • Brier スコアは打ち切りで重み付けされた確率誤差であり、識別性能と較正の両方を反映します。単独で使用できる較正曲線ではありません。
  • 較正には、独立したデータで、特定の時点における予測値と観測値を比較する検証が必要です。scikit-survival 0.28 には、専用の較正曲線 API はありません。

前提条件、主要文献、安全な時間グリッドの構築、スコアラーのラッパーについては、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 のメタデータルーティングを有効にしてください。たとえば、sklearn.set_config(enable_metadata_routing=True) で alpha の予測引数をルーティングする場合に限り、Coxnet の set_predict_request(alpha=True) が必要です。

内側のチューニング後に偏りのない 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 は原因別の累積発生率を表します。原因別 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

匿名化済みで、使用が許可されたローカルデータのみを使用してください。同梱のテストには合成レコードのみが含まれ、患者データや 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 回帰。

日付付きの情報源

2026-07-23 に確認した公式 API および互換性に関する情報源:

エージェントの運用手順

  1. 環境を確認します。 Python 環境とライブラリのバージョン(python -c "import pkg; print(pkg.__version__)")を確認し、データの形状、型、欠損値を調べます。
  2. 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問してください。
  3. まず小規模に実行します。 まずサンプルまたは単一のフォールドで実行し、実行時間とメモリを確認します。
  4. 上記の指示と参考資料に従って、タスク全体を実行します。
  5. 結果を検証します。 ホールドアウトデータ、固定した乱数シード、適切なメトリクスを使用し、データリークを確認して、不確実性(CI、シード間の標準偏差)を報告します。
  6. 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未解決の不確実性を明記します。
こうなった場合対応
メモリ不足、または実行が非常に遅いサブサンプリング、チャンク化または遅延計算の使用、モデルサイズの縮小を行い、何を変更したかユーザーに伝えます。
これらの指示に記載された関数、フラグ、エンドポイントがインストール済みバージョンに存在しないインストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して調整し、ユーザーに伝えます。API をでっち上げてはいけません。
必須の入力、識別子、パラメーターが曖昧ユーザーに質問するか、実行前に仮定を明示します。

誠実性に関するルール

  • 結果、パラメーター、識別子、引用、統計を捏造してはいけません。実行または検証できないことは、率直に伝えます。
  • このセッションで計算していないメトリクスを報告してはいけません。すべての数値について、その算出に使ったコードの経路を示します。
  • ここに記載されたバージョン固有の詳細は古くなっている可能性があります。インストール済みバージョンの公式ドキュメントで確認してください。
  • 金銭がかかる操作、共有 GPU やクラウドクォータを消費する操作、個人データや患者データに触れる操作、取り消せない操作の前には、ユーザーに確認してください。

コメント