リハビリAI や 医療AI という言葉を耳にしても、「自分の研究データで FIM 予後予測モデル を作るには何から始めればよいか」「機械学習 と統計解析はどう違うのか」「scikit-learn でどんなコードを書けばよいのか」と感じる臨床医・PT・OT・ST の方は多いのではないでしょうか。本ガイドは、リハビリテーション領域の研究者が FIM 予後予測 を例に、機械学習による予後予測モデル をゼロから構築・評価・論文化するまでの全工程を、当サイトの関連記事 40 本超への内部リンクとともに整理した長文ガイドです。
脳卒中回復期病棟での「入院時 FIM・年齢・発症日数から退院時 FIM を予測する」というよくある臨床課題を題材に、データ準備・特徴量設計・モデル選択・評価指標 (AUC・Calibration・DCA)・落とし穴回避 (リーケージ・過学習・公平性)・TRIPOD+AI に沿った論文化までを一気通貫で解説します。自宅退院予測 や 歩行自立予測 など類似タスクにもそのまま応用できます。
本ガイドは 10 ステップ 構成で、各ステップ末に「より深く学ぶための詳細記事」へのリンクを置いています。最初は流し読みで全体像を掴み、必要なステップで詳細記事に飛んで深掘りする使い方がおすすめです。完全初学者の方は先に リハビリ領域で使う機械学習入門 または 01·01 医療者のための機械学習入門 を一読してから戻ってください。
// TOC目次(10 ステップ)
// STEP 01研究目的と予測時点を固定する
FIM 予後予測モデル の設計で最初に決めるのは「誰の・いつの・どのアウトカムを予測するか」です。同じ「退院時 FIM 予測」でも、入院時に予測するモデルと入院 2 週後に予測するモデルでは、使える説明変数も実装場面もまったく異なります。
実務でよくある予測時点と用途は次の通りです。
- 入院時予測: 退院支援計画・在院日数推定・家屋調整の早期準備
- 入院 2 週目予測: 軌道修正・リハ単位の見直し・転院検討
- 退院前予測: 6 か月後・1 年後の長期 FIM 予測(生活期につなぐ)
「入院時に退院時 FIM を予測する」を選んだ場合、説明変数は 入院時に取得できる情報のみ に限定する必要があります。入院期間・退院直前評価・退院支援の進行状況などを混ぜると、09·02 データリーケージ になり、性能は高く見えても臨床実装では使えないモデルになります。
予測モデルの基本構造は 01·05 予測モデルとは何か を、医療AI研究のワークフロー全体は 01·04 医療AI研究の進め方 を参照してください。
// STEP 02アウトカムを臨床的に定義する
機械学習 モデルが扱うのはアウトカムの数値ですが、その数値が臨床的に何を意味するかは研究者が決めます。FIM の場合、選択肢は複数あります。
- 連続値の退院時 FIM 合計点 (18-126 点) → 回帰問題
- 退院時 FIM ≥ 91 点 (自立) の二値分類 → ロジスティック回帰系
- FIM 利得 (退院時 − 入院時) → 回帰問題、ただし入院時 FIM とのコリニアリティに注意
- FIM 効率 (利得 / 在院日数) → 在院日数を含む合成指標
- 歩行 FIM ≥ 6 点 (歩行自立) や 自宅退院 など個別 outcome
「退院時 FIM ≥ 91 点」のような二値分類は、回帰よりサンプル設計が立てやすく、混同行列で誤分類コストを臨床と擦り合わせやすいので、初学者に勧めやすい選択です。一方、利得や効率は 分母にゆらぎ があるため、解釈が難しくなります。
タスクの類型(回帰 / 分類 / クラスタリング)は 01·03 回帰・分類・クラスタリングの違い、目的変数と説明変数の整理は 02·01 説明変数と目的変数 を参照してください。
// STEP 03特徴量を選び、データを整える
FIM 予後予測 でよく使われる説明変数は次の 4 系統です。
- 人口統計学的因子: 年齢、性別、利き手、教育歴、職業、同居家族
- 疾患関連因子: 病型 (脳梗塞 / 脳出血 / くも膜下出血)、発症から入院までの日数、NIHSS、画像所見、麻痺の重症度 (Brunnstrom Stage)、利き手側麻痺の有無
- 機能評価: 入院時 FIM (運動・認知・各下位項目)、SIAS、MMSE、栄養指標 (Alb、GNRI)、10 m 歩行速度、握力
- 診療プロセス: 受傷からの転帰、急性期治療、リハビリ提供量(含めるかは目的次第)
特徴量を増やしすぎると EPV (Events Per Variable) が不足し、過学習しやすくなります。09·03 EPV・サンプルサイズ設計 で扱う Riley 2020 の現代的サンプルサイズ計算で、必要 N と候補変数数のバランスを確認しておきましょう。
欠測値処理は次のステップ 5 で Pipeline 内に閉じます。欠測の理由(測定不能 vs 単純な記録漏れ vs MNAR)も臨床的に検討します。詳細は 09·06 欠測バイアス で。
特徴量エンジニアリングは 02·04 特徴量エンジニアリング、特徴量選択は 02·05 特徴量選択、外れ値・カテゴリ・スケーリングは 02·03 外れ値・カテゴリ・スケーリング を参照してください。
// STEP 04機械学習アルゴリズムを選択する
リハビリAI の FIM 予測で最初に試すべきアルゴリズムは、サンプルサイズと目的によって変わります。
| サンプルサイズ | 第一選択 | 第二選択 | 備考 |
|---|---|---|---|
| 50-300 例 | ロジスティック回帰 / 線形回帰 | 正則化 (Lasso/Ridge) | 解釈性・係数の臨床的意味づけが容易 |
| 300-1,000 例 | 正則化線形モデル | ランダムフォレスト | 変数選択と過学習防止のバランス |
| 1,000 例以上 | 勾配ブースティング (XGBoost / LightGBM) | アンサンブル | 表形式データで最高性能を出しやすい |
| 画像・動画含む | ニューラルネット | 転移学習 | 大規模データと計算資源が必要 |
最初から複雑なモデルに飛びつかず、ロジスティック回帰のベースライン → 正則化 → 勾配ブースティング の順で段階的に比較するのが安全です。複数モデルを試した場合は、09·05 多重比較 の楽観バイアスに注意します。
第3部「医療AI・機械学習アルゴリズム図鑑」では、線形回帰から深層学習まで 15 アルゴリズムを一冊ずつ解説しています。
// STEP 05データ分割と前処理 Pipeline を設計する
FIM 予後予測モデル で最も致命的なミスは、前処理を全データで行ってから分割することです。scikit-learn の Pipeline を使うと、欠測補完・標準化・特徴量選択を 各訓練 fold 内で完結 できます。
# FIM 予後予測の基本 Pipeline (scikit-learn)
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GroupKFold, cross_validate
# 説明変数(入院時に取得可能なもののみ)
numeric_features = [
"age", "days_from_onset",
"fim_motor_admission", "fim_cognitive_admission",
"nihss_admission", "alb_admission", "grip_strength",
]
categorical_features = ["sex", "stroke_type", "side_of_paresis"]
# Pipeline: 補完 → 標準化(数値) / 補完 → One-Hot(カテゴリ)
preprocess = ColumnTransformer([
("num", Pipeline([
("imp", SimpleImputer(strategy="median")),
("scl", StandardScaler()),
]), numeric_features),
("cat", Pipeline([
("imp", SimpleImputer(strategy="most_frequent")),
("ohe", OneHotEncoder(handle_unknown="ignore")),
]), categorical_features),
])
# 二値分類: 退院時 FIM >= 91 (自立) を予測
model = Pipeline([
("prep", preprocess),
("clf", LogisticRegression(max_iter=2000, class_weight="balanced")),
])
# 多施設データ → 施設をまたいで汎化するか GroupKFold で評価
cv = GroupKFold(n_splits=5)
scores = cross_validate(
model, X, y, groups=df["facility_id"], cv=cv,
scoring=["roc_auc", "average_precision", "neg_brier_score"],
)
for k, v in scores.items():
if k.startswith("test_"):
print(f"{k:>22}: {v.mean():.3f} ± {v.std():.3f}")
ポイント:
- 同一患者の複数入院が train/test にまたがらないよう
GroupKFold(groups="patient_id") - 多施設データなら
groups="facility_id"で施設別検証も - 不均衡データなら
class_weight="balanced"または閾値調整(09·04 不均衡データ)
リーケージを防ぐ前処理は 02·06 データリーケージを防ぐ前処理、交差検証の体感は 14·02 交差検証デモ、リーケージの体感は 14·03 リーケージデモ で実際に動かせます。
// STEP 06学習し、ハイパーパラメータを調整する
ハイパーパラメータ調整は nested CV で行うのが最も誠実です。外側 CV で性能評価、内側 CV でパラメータ選択を分離します。
from sklearn.model_selection import GridSearchCV
inner_cv = GroupKFold(n_splits=5)
param_grid = {
"clf__C": [0.01, 0.1, 1, 10],
# for Lasso: "clf__C": [...], "clf__penalty": ["l1"], "clf__solver": ["liblinear"]
}
search = GridSearchCV(
model, param_grid, cv=inner_cv, scoring="roc_auc",
n_jobs=-1, refit=True,
)
# 外側 CV で性能を評価(モデル選択の楽観バイアスを抑える)
outer_cv = GroupKFold(n_splits=5)
nested_scores = cross_validate(
search, X, y, groups=df["facility_id"], cv=outer_cv,
scoring=["roc_auc", "average_precision"],
)
print(f"Nested AUC : {nested_scores['test_roc_auc'].mean():.3f}")
09·05 多重比較とモデル探索 で詳しく扱いますが、nested CV を回さずに最良パラメータを最終モデルとして報告すると、性能は楽観方向に偏ります。
// STEP 07AUC・Calibration・DCA で多面評価する
機械学習による予後予測モデル を評価するとき、AUC だけを見ると重要な情報を見落とします。
| 評価指標 | 見ているもの | FIM 予測で重要な理由 |
|---|---|---|
| ROC-AUC | 順位付け性能 | 低リスク患者と高リスク患者を区別する力 |
| PR-AUC | 不均衡時の陽性予測精度 | 非自立例が少数の場合に有用 |
| Calibration plot | 予測確率の絶対値 | 「自宅退院確率 70%」を患者・家族に伝える場面で必須 |
| Brier score | 較正 + 識別の総合 | 単一指標での比較に便利 |
| 感度 / 特異度 / PPV / NPV | 閾値後の臨床判断 | 退院支援・転院判定の意思決定に直結 |
| Decision Curve Analysis (DCA) | 臨床的有用性 (Net Benefit) | 「介入閾値ごとの実利」を可視化 |
特に Calibration は、AUC が同じでも臨床利用可能性を左右します。退院後の生活設計や転院判定に予測確率を使うなら、必ず Calibration plot と calibration slope を確認します。
Decision Curve Analysis の実装は 14·04 DCA デモ でしきい値確率を動かしながら体感できます。較正ドリフトの理解は 09·07 ドメインシフト に詳しいです。
// STEP 08落とし穴 (リーケージ・過学習・公平性) を点検する
リハビリAI 研究 で論文化前に必ず点検したい落とし穴は、第9部「医療AI研究の落とし穴と対策」全 11 記事にまとまっています。FIM 予後予測で特に重要な 5 点を抜粋します。
- 09·01 過学習: 訓練データで AUC 0.95 でも、別施設で 0.65 に落ちる典型例
- 09·02 データリーケージ: 入院期間・退院支援の進捗が説明変数に混入していないか
- 09·03 EPV・サンプルサイズ: イベント数と候補変数のバランス
- 09·07 ドメインシフト: 開発施設と運用施設の患者背景・診療プロセスの違い
- 09·10 公平性・バイアス: 高齢者・女性・重症例で性能が極端に低くないか
内部検証で AUC が 0.90 を超えるような 異常に高い性能 が出たときは、リーケージかショートカット学習 (09·08 ショートカット学習) を疑うのが原則です。
// STEP 09SHAP で説明し、因果と混同しない
FIM 予後予測モデル の挙動を説明する手段として SHAP・permutation importance・係数の符号などが使えます。ただし、SHAP で重要だった変数 = 介入すれば改善する因子、ではない 点は厳に注意します。
import shap
# SHAP で予測の説明変数寄与を可視化
explainer = shap.TreeExplainer(model.named_steps["clf"])
# Pipeline 前処理後のデータを渡す
X_processed = model.named_steps["prep"].transform(X)
shap_values = explainer.shap_values(X_processed)
# 重要度の高い順に変数を並べる
shap.summary_plot(shap_values, X_processed)
重要な変数が「入院時 FIM」だったとして、それは「入院時 FIM を上げれば退院時 FIM が上がる」を意味しません。入院時 FIM は重症度・全身状態・社会背景を含む総合指標であり、介入可能な単一の原因とは限らない からです。詳しくは 09·09 因果と予測の混同 を参照してください。
// STEP 10TRIPOD+AI に沿って論文化する
リハビリAI・医療AI による予後予測モデルを論文化するときの標準は TRIPOD+AI (Collins 2024) です。27 項目のうち、Methods に必須の主要 10 項目を抜粋します。
- 予測時点と対象集団
- アウトカム定義 (FIM ≥ 91 など)
- 説明変数のリスト (予測時点で取得可能なもののみ)
- データ分割 (random / GroupKFold / 時間順 / 外部検証)
- 前処理が Pipeline 内 fit である記述
- ハイパーパラメータ探索手順 (nested CV など)
- 性能評価 (AUC + Calibration + DCA + サブグループ)
- 説明可能性 (SHAP を使った場合の解釈の範囲)
- 限界 (外部検証の有無・公平性の検討範囲)
- 倫理承認・利益相反
投稿前の自己点検には 09·11 査読者に突っ込まれる点 の 4 層チェックリスト (16 項目) が役立ちます。査読対応では 09·11 の Major comment 10 選と対応表を参照してください。
論文 Methods の章立てと典型表現は 09·11 査読者突っ込み の WRITING セクションを、Methods 起草の具体的プロンプトは 13·04 論文の Methods を書くプロンプト で扱います。
研究プロセス全体に生成AIを組み込む手法は第13部参照: 13·01 ChatGPT で論文を読む・13·02 日本語要約・13·03 査読返信・13·04 Methods 起草
// FAQよくある質問
- リハビリAIで FIM 予後予測モデルを作るには、何から始めればよいですか?
- 研究目的を明確にすることが最初です。「入院時に退院時 FIM を予測する」のか「途中で軌道修正に使う」のかで設計が変わります。次に、予測時点で利用可能な変数を列挙し、アウトカム定義を固めます。そこから Python (scikit-learn) で線形回帰やロジスティック回帰の小規模モデルを試し、評価指標 (AUC・Calibration・DCA) で実用性を検証する流れが基本です。本ガイドのステップ 1-3 を順に進めてください。
- FIM の予測モデルにはどんな機械学習アルゴリズムが向いていますか?
- 症例数が中規模 (数百例) であればロジスティック回帰や 正則化線形回帰 (Lasso/Ridge/Elastic Net) が解釈性と性能のバランスが良いです。数千例以上で表形式データなら 勾配ブースティング (XGBoost/LightGBM/CatBoost) が選択肢になります。深層学習はサンプルサイズが大きく、画像・動画・時系列データを扱う場合に有効です。
- FIM 予後予測モデルを論文化する際に必須のチェック項目は?
- TRIPOD+AI (2024) に沿って、対象集団・予測時点・データ分割・前処理・モデル開発・性能評価 (AUC + Calibration + DCA)・サブグループ性能・外部検証の有無を明記します。Methods では Pipeline 内で前処理を完結させたこと (リーケージ防止) を、Discussion では SHAP 等の重要度を因果と混同しないことを書きます。詳しくは 09·11 査読者突っ込み の 4 層チェック (16 項目) を参照してください。
- Python ができないと医療 AI 研究は始められませんか?
- 最終的には Python や R があると実装しやすいですが、最初は臨床疑問・目的変数・説明変数・評価指標・検証方法を設計できることが重要です。実装は小さなサンプルから段階的に学べます。本ガイドの ステップ 5-6 のコード例は、scikit-learn の初学者でもコピペで動く形にしてあります。
- 自宅退院予測や歩行自立予測のモデルも、同じ手順で作れますか?
- はい、本ガイドの 10 ステップはアウトカム定義(ステップ 2)を変えるだけで、自宅退院予測・歩行自立予測・転倒予測・再入院予測などに応用できます。共通するのは「予測時点での利用可能変数」「リーケージ防止」「Calibration・DCA を含む多面評価」「外部検証の意識」の 4 点です。