1. モデルを学習させる — ロジスティック回帰
前編で準備した標準化済みデータを使って、いよいよモデルを学習させます。 最初はロジスティック回帰。分類の基本でありながら、 「悪性である確率」を出せるため、医療AIでは今も現役の手法です (機械学習入門コースの復習)。
正解率0.971。3行のモデルで97%——と喜ぶ前に、 この数字が何を隠しているかを、医療AIでは必ず確かめます。それがこのレッスンの本題です。
2. 「確率」で出す — predict_proba
医療AIでは「悪性です」と断定するより、「悪性の確率は◯%」と出すほうが役立ちます。
医師はその確率を、ほかの所見と合わせて判断できるからです。
predict_proba で確率を見てみましょう。
predict_proba は各クラスの確率を返し、2列目が「悪性(1)の確率」です。
通常の predict は、この確率が0.5以上なら悪性と判定しています。
この「0.5」という境目(閾値)を動かせることが、
レッスン5で見逃しを減らす鍵になります。
3. 混同行列を「医療の言葉」で読む
正解率は「全体で何%当たったか」しか教えてくれません。 医療で本当に知りたいのは「どう間違えたか」—— 見逃したのか、過剰に拾ったのか——です。それを示すのが混同行列です。
結果を医療の言葉に翻訳すると、こうなります。
| 予測:良性 | 予測:悪性 | |
|---|---|---|
| 実際:良性 | TN = 106(正しく良性) | FP = 1(過剰検出) |
| 実際:悪性 | FN = 4(見逃し) | TP = 60(正しく悪性) |
⚠ 注目すべきは FN(見逃し)=4:
正解率97%の裏で、悪性の患者を4人、良性と判定して見逃しています。
がんの文脈では、見逃し(偽陰性)は過剰検出(偽陽性)よりずっと重い間違いです。
ravel() は 2×2 の行列を tn, fp, fn, tp の順に平らにする関数で、
この4つの数字こそが、次のレッスンの感度・特異度の材料になります。
4. 別のモデルと比べる — ランダムフォレスト
モデルは1つに決め打ちせず、複数を比べるのが定石です。 決定木をたくさん束ねたランダムフォレストを試しましょう。 木ベースのモデルなので、前編で触れたとおり 標準化は不要(元のスケールのまま渡します)。
ランダムフォレストは正解率0.965で、ロジスティック回帰(0.971)とほぼ互角。 しかし中身を見ると違いがあります。
| モデル | 正解率 | 見逃し(FN) | 過剰検出(FP) |
|---|---|---|---|
| ロジスティック回帰 | 0.971 | 4 | 1 |
| ランダムフォレスト | 0.965 | 6 | 0 |
💡 正解率が近くても中身は違う: ランダムフォレストは過剰検出が0で「無駄に拾わない」一方、見逃しは6と多め。 ロジスティック回帰は見逃し4と、こちらのほうが見逃しに強い——。 がんの見逃しを重く見るなら、「過剰検出がゼロで無駄がない」という理由だけでランダムフォレストを選ぶのは早計です。 どちらが「良いモデル」かは、正解率ではなく用途で決まる——これを数値で語る道具が、次のレッスンです。
5. 練習問題
見逃しは何人?
混同行列を ravel() で展開したとき、「悪性なのに良性と予測した人数(見逃し)」は
tn, fp, fn, tp のどれですか。
- A. fp(偽陽性)
- B. fn(偽陰性)
- C. tn(真陰性)
答えと解説を見る
正解:B. fn(偽陰性)
陽性(悪性)を陰性(良性)と誤って陰性にしたのが偽陰性=見逃しです。 「陰性と言ったが間違い」なので False Negative。医療で最も重く扱われる間違いで、 このモデルでは4人(ロジスティック回帰の場合)でした。
木の本数を減らすと?
ランダムフォレストの木の本数を n_estimators=10(デフォルトは100)に減らすと、
見逃し(FN)はどうなるでしょうか。予想してから実行してみましょう。
ヒントを見る(答え+解説)
rf = RandomForestClassifier(n_estimators=10, random_state=42).fit(X_tr, y_tr)
木を10本に減らすと、正解率は 0.947 に下がり、見逃し(FN)は9に増えます。 木の本数が少ないと予測が安定せず、少数派(悪性)の取りこぼしが増えがちです。 ハイパーパラメータが医療的に重要なFNを左右する——調整の指針はレッスン5で。
過学習していないか確かめる
ロジスティック回帰について、訓練データの正解率とテストデータの正解率を 両方表示して、差が大きすぎないか(過学習していないか)を確認してください。
ヒントを見る(答え+解説)
print("訓練正解率:", round(model.score(X_tr_s, y_tr), 3))
print("テスト正解率:", round(model.score(X_te_s, y_te), 3))
訓練0.987 / テスト0.971。差は約0.016と小さく、ひどい過学習はしていないと判断できます。 もし訓練だけ極端に高い(例:訓練1.0・テスト0.85)なら過学習を疑い、 正則化や特徴量の見直しを検討します(機械学習入門コース参照)。
6. まとめ
このレッスンのポイント
- ロジスティック回帰で診断支援モデルを学習(正解率0.971)。
predict_probaで悪性の確率を出せる - 混同行列をTN・FP(過剰検出)・FN(見逃し)・TPに分けて読む。
ravel()で4数に展開 - 正解率97%の裏で悪性を4人見逃していた——正解率は「どう間違えたか」を隠す
- ランダムフォレスト(0.965)と正解率は互角でも、見逃し4 vs 6と中身が違う
- 「良いモデル」は正解率でなく用途(見逃しを許容できるか)で決まる → レッスン5へ
混同行列の4つの数字がそろいました。次のレッスンでは、この4つから 感度・特異度・PPVを計算し、医療AIの評価を本格的に身につけます。 「有病率の罠」という、現場で最も誤解されるポイントも登場します。
完了するとコース一覧に進捗が記録されます