radiomics-ml について
radiomics-mlは、放射線画像特徴量や表形式データを使う臨床研究者向けの古典的機械学習スキルです。決定論的なチェックで検証設計、データ漏洩、特徴量の安定性、キャリブレーション、外部検証を監査し、実患者データでモデルを実行することはありません。
主な機能
- 01古典的機械学習パイプラインの生成
- 02交差検証と特徴量漏洩の監査
- 03特徴量安定性とキャリブレーションの確認
- 04外部検証要件の評価
- 05決定論的な監査結果の出力
活用シーン
- 01放射線画像特徴量による予測モデルの構築
- 02既存の機械学習パイプラインの監査
- 03特徴量選択が各学習フォールド内かの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aperivue/ medsci-skills --skill radiomics-mlインストール後、Claude Code で/radiomics-mlを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
skill.ymlreferences/radiomics_ml_guide.mdscripts/check_radiomics_ml.pyscripts/check_radiomics_ml_challenge/problem.mdverify.shscripts/check_radiomics_ml_challenge/expected/strong.txtweak.txtscripts/check_radiomics_ml_challenge/fixture/pipeline_strong.jsonpipeline_weak.jsontests/nested_cv_skeleton_check.pytest_radiomics_ml.sh詳細
ラジオミクス/古典的 ML スキル
目的
ラジオミクスとツリーアンサンブルを用いた研究(特徴量 → ランダムフォレスト/XGBoost → 臨床アウトカム)は、一人でも実施しやすい臨床 ML ワークフローとして最も一般的である一方、過度に楽観的な結果が報告されることも最も多いワークフローです。GPU もエンジニアも不要ですが、数十人の患者に対して数百から数千の特徴量を用いること、性能を報告するのと同じフォールドでハイパーパラメータを調整すること、データセット全体で特徴量を選択すること、不安定な特徴量を除外しないこと、キャリブレーションを示さずに識別能(AUC)を報告することが、よくある問題です。このスキルは、パイプラインを適切に構築し、既存のパイプラインを監査することで、臨床上の結果が査読に耐えられるようにします(Lambin 2017;CLEAR;TRIPOD+AI;PROBAST-AI)。
画像 DL の領域を補完するもので、/model-scaffold がディープネットワークを構築するのに対し、radiomics-ml は特徴量ベースの古典的 ML の経路を扱います。scikit-learn/xgboost/pyradiomics を統合して(生成されるコードで参照)、それらを再実装することはなく、実際の患者データでモデルを実行することもありません。
使用する場合
- ラジオミクスまたは臨床/表形式の特徴量テーブルがあり、統計レビューに通るランダムフォレスト/XGBoost の臨床予測モデルを構築したい場合。
- 以下の失敗モードについて、既存のラジオミクス/ML パイプラインを監査したい場合。
使用しない場合
- ディープラーニング画像モデル →
/model-selection→/model-scaffold→/model-assessment。 - 古典的な推測統計/推定対象としての回帰モデル →
/analyze-stats。 - 学習済みネットワークの解釈可能性 →
/model-assessment。 - scikit-learn/xgboost/pyradiomics の再実装 → 対象外です(このスキルはこれらを接続して監査します)。
失敗モード(ゲートが強制する要件)
- ネストされた CV がない。 同じフォールドで調整と性能報告を行うと、性能が過大評価されます。ネストされた CV またはホールドアウトテストセットを使用してください。
- 高次元・低イベント数。 候補特徴量数がイベント数以上だと過学習します。これはラジオミクスで典型的な落とし穴です。
dimensionality_reductionを宣言しても問題は解消されません。n_featuresは、アウトカムを使わない次元削減後に残った特徴量をすでに数えているためです。ゲートのp ≥ eventsルール(イベント数 = 少数派クラス)は、最悪のケースを検出するための下限であり、サンプルサイズの基準ではありません。/calc-sample-sizeの Test 12(Riley 基準、pmsampsize)を使って研究規模を決め、アウトカムに基づく選択または適合に進む候補特徴量をすべて数えてください。C = 0.75、 prevalence 35% の場合、候補パラメーターあたり約 48 人の患者が必要です。候補が 100 個なら N = 4,755(イベント数 1,665)が必要ですが、ゲートはイベント数 105 件で特徴量 100 個を許容します。まずアウトカムを使わずに候補を減らしてください(安定性、冗長性、臨床的事前知識を利用)。LASSO やその他のペナルティ化は、サンプルサイズの代わりにはなりません。小さい n では、推定される縮小自体が不安定だからです(Riley et al., J Clin Epidemiol 2021;Van Calster et al., Stat Methods Med Res 2020)。 - フォールド外での選択。 データセット全体で特徴量選択を適合すると、ホールドアウトフォールドの情報が漏洩します。各学習フォールド内で選択をネストしてください。
- 特徴量の安定性評価がない。 ラジオミクス特徴量は、撮像条件やセグメンテーションによって不安定です。再現性のある特徴量(ICC/テスト・再テスト)に絞ってください。
- キャリブレーションがない。 臨床予測モデルには、識別能だけでなくキャリブレーション(傾き/切片と柔軟な曲線)が必要です。
- 外部検証がない。 臨床的な主張をするには、単一コホートのモデルに対して外部検証/時間的検証が必要です。
マニフェストから確認できないため、ゲートでは扱わない項目があります。同一患者の行が分割の両側に入っていることです。行単位でフォールドを分ける病変レベルのテーブルでは、モデルが患者を識別できてしまいます。帰無の合成データでは、これによりネストされた CV の AUROC が 0.48 から 0.99 になりました。患者単位で分割し、フォールドテーブルを確認してください(フェーズ 2)。
ワークフロー
フェーズ 1 — 特徴量を抽出する(再実装ではなく、既存ツールを組み込みます)
ラジオミクスでは、再現可能でIBSIに準拠した設定(固定ビン幅、リサンプリング、正規化)を使用し、pyradiomicsで特徴量を抽出します。設定を記録してください。臨床データや表形式データでは、患者/対象者IDとアウトカムを含む特徴量テーブルを作成します。病変またはROIごとに1行でもかまいません。分割の基準となるのはIDです。references/radiomics_ml_guide.mdを参照してください。
フェーズ 2 — パイプラインを適切に構築する
- 特徴量の安定性 — テスト・再テストデータまたは複数評価者によるデータがある場合は、ICC ≥ 0.75の特徴量を残します。
- ネストされた交差検証 — 外側のフォールドで性能を推定し、内側のフォールドで調整します。特徴量選択とスケーリングは、各学習用フォールド内で行ってください(データセット全体を使ってはいけません)。CVの単位は患者です。両方のループで
StratifiedGroupKFold(groups=patient_id)を使って分割し、同一患者の病変が複数のフォールドにまたがらないようにします。フォールドテーブル(patient_id,split)を作成し、/model-assessmentのcheck_split_leakage.py --splits cv_folds.csv --seed <seed> --strictでこれを検証してください(ガイド§4のひな形を参照)。 - 次元数 — アウトカムを使わずに候補を絞り込み(ICCによる安定性、|r|による冗長性フィルター、臨床的な事前知識。PCAはフォールド内で適合)、残った候補数に合わせて
/calc-sample-sizeのTest 12(pmsampsize)で研究のサンプルサイズを決めます。LASSOはフォールド内で特徴量を選択しますが、少ないサンプル数を十分な規模にするものではありません。NがRileyの最小値を下回る場合は、不足を限界として報告してください。 - モデル — タスクに応じて、古典的なモデルを幅広く検討します。複雑な学習器を使う場合も、単純なベースライン(正則化ロジスティック回帰)は必須です。
- 正則化回帰 — LASSO/ridge/elastic-netロジスティック回帰(ベースラインとしても使用)
- マージン/カーネル — 線形またはRBF SVM
- インスタンスベース — k-NN
- 確率的/判別 — naive Bayes、LDA/QDA
- 決定木とバギング — 決定木、random forest、extra-trees
- ブースティング — XGBoost、LightGBM、CatBoost、HistGBM、AdaBoost
- 浅層ニューラルネットワーク — MLP
- メタモデル — stacking/votingアンサンブル
- 教師なし(上流工程) — 次元削減にはPCA/UMAP、表現型分類にはk-means/階層型クラスタリング/GMM
以下のゲートは学習器に依存しません。パイプライン(ネストされたCV、データ漏洩、次元数、キャリブレーション)を監査するため、どのモデルにも同じように適用できます。手法の全体像は
docs/method_coverage_map.mdを参照してください。
- 報告 — 識別能とキャリブレーション(傾き/切片と柔軟な曲線。
/analyze-statsのキャリブレーションガイドを参照)、および臨床的有用性(決定曲線)を報告します。解釈にはSHAPを使用します。
フェーズ 3 — パイプラインマニフェストを出力する
{
"task": "classification",
"n_features": 40, "n_samples": 300, "n_events": 110,
"cv_scheme": "nested",
"feature_selection_stage": "inside_cv",
"dimensionality_reduction": true,
"feature_stability": "icc",
"calibration_reported": true,
"external_validation": "temporal",
"model": "xgboost"
}
n_features— アウトカムを考慮しない削減の後、アウトカムに基づく選択またはフィッティングに進む候補特徴量(この例では、抽出した1,200個 → ICC ≥ 0.75 → |r| < 0.9 → 40個)。この例はゲートを通過しますが、pmsampsize(C = 0.75、 prevalence 110/300)は、40個の候補パラメーターに対してN = 1,868、イベント数685を求めます。ゲートは研究規模を決めるものではなく、Test 12が決定します。n_features、n_samples、n_eventsは0以上の整数でなければなりません(n_events≤n_samples)。それ以外は入力エラーです(終了コード2)。dimensionality_reductionは情報提供のみを目的とし、何もクリアしません。feature_selection_stage—inside_cv、outside_cv、またはnone(アウトカムに基づく選択なし)。欠落している値、または認識されない値は、CV内で行われたことが示されていないものとして扱われます(SELECTION_OUTSIDE_CV)。feature_stability—icc/test_retest、external_validation—external/temporal/geographic。それ以外の値(例:planned、internal、bootstrap、random_split)はフラグが付けられます。値の大文字・小文字は区別されません。-とスペースは_として解釈されます。cv_scheme—nested、またはハイパーパラメーターとモデル選択をトレーニング分割のみで調整し、テスト分割には一度だけ触れた場合のheld_out_test/single_split。調整、モデル選択、または閾値の決定にも使われた分割はflatです(帰無データのテスト分割で候補モデル12個から選択すると、AUROC 0.51ではなく0.63と報告されました)。ラジオミクスのサンプルサイズでは、ランダムな分割を1回行うとデータが無駄になり、結果も不安定になります。(反復)ネスト交差検証を推奨します(Steyerberg、J Clin Epidemiol 2018)。
フェーズ 4 — パイプラインを判定する(決定論的)
python3 scripts/check_radiomics_ml.py --manifest pipeline_manifest.json --strict
判定結果:NO_NESTED_CV、HIGH_DIM_LOW_EVENTS、SELECTION_OUTSIDE_CV(重大);n_features、n_samples、n_events のいずれかが欠落している場合は、NO_FEATURE_STABILITY、NO_CALIBRATION、NO_EXTERNAL_VALIDATION、HIGH_DIM_NOT_ASSESSED(軽微)。完成した原稿の文章を監査するself-reviewのcheck_cv_leakageを、パイプライン仕様のレベルで補完します。
統合
/analyze-stats— 報告のためのキャリブレーションと臨床的有用性(決定曲線、NNT)のガイド。/check-reporting— CLEAR(ラジオミクス)、TRIPOD+AI、PROBAST-AIの項目カバレッジ。/self-reviewのclinical_prediction_modelプローブは完成した原稿を監査します。このスキルは、そこで求められる厳格なパイプラインを生成します。
ハルシネーション防止
- 特徴量、性能指標、サンプル数/イベント数を決して捏造しないでください。 マニフェスト内のすべての値と報告するすべての指標は、研究者が実行したコードに基づくものであり、決して作り出したものではありません。このスキルはパイプラインを設計・監査しますが、実際の患者データでモデルを実行することはありません。
- flat-CVの性能を、ネスト交差検証またはホールドアウトの性能であるかのように報告しないでください。 報告対象のフォールドでの調整こそ、このスキルが防ごうとする楽観バイアスです(
NO_NESTED_CV)。 check_radiomics_ml.pyを実行せずに、ラジオミクス/ML監査の「合格」を報告しないでください。 厳格性の判定は決定論的に再現されるものであり、文章から断定するものではありません。- 再実装せず、統合してください。 scikit-learn / xgboost / pyradiomicsを参照し、新しい特徴量抽出器や学習器を書いたり、その結果を主張したりしないでください。
再現可能なチャレンジ
scripts/check_radiomics_ml_challenge/には、ネットワーク接続不要のverify.shを備えた、合成データを用いる弱い/強いパイプラインのペアが含まれています。これはスキルの検証コマンドに組み込まれています。