Python環境を起動中... 初回のみ数秒かかります
Lesson 4 / 12

モデル① 乳がん診断支援(後編)— 学習と評価

このレッスンで学ぶこと

  • ロジスティック回帰で診断支援モデルを学習させる
  • predict_proba で「悪性の確率」を出せる意義を理解する
  • 混同行列を「見逃し(偽陰性)」「過剰検出(偽陽性)」の言葉で読む
  • ランダムフォレストと比べ、正解率だけでは足りないと実感する

1. モデルを学習させる — ロジスティック回帰

前編で準備した標準化済みデータを使って、いよいよモデルを学習させます。 最初はロジスティック回帰。分類の基本でありながら、 「悪性である確率」を出せるため、医療AIでは今も現役の手法です (機械学習入門コースの復習)。

sample_1.py
Ctrl+Enter
出力

正解率0.971。3行のモデルで97%——と喜ぶ前に、 この数字が何を隠しているかを、医療AIでは必ず確かめます。それがこのレッスンの本題です。

2. 「確率」で出す — predict_proba

医療AIでは「悪性です」と断定するより、「悪性の確率は◯%」と出すほうが役立ちます。 医師はその確率を、ほかの所見と合わせて判断できるからです。 predict_proba で確率を見てみましょう。

sample_2.py
Ctrl+Enter
出力

predict_proba は各クラスの確率を返し、2列目が「悪性(1)の確率」です。 通常の predict は、この確率が0.5以上なら悪性と判定しています。 この「0.5」という境目(閾値)を動かせることが、 レッスン5で見逃しを減らす鍵になります。

3. 混同行列を「医療の言葉」で読む

正解率は「全体で何%当たったか」しか教えてくれません。 医療で本当に知りたいのは「どう間違えたか」—— 見逃したのか、過剰に拾ったのか——です。それを示すのが混同行列です。

sample_3.py
Ctrl+Enter
出力

結果を医療の言葉に翻訳すると、こうなります。

予測:良性予測:悪性
実際:良性TN = 106(正しく良性)FP = 1(過剰検出)
実際:悪性FN = 4(見逃し)TP = 60(正しく悪性)

⚠ 注目すべきは FN(見逃し)=4: 正解率97%の裏で、悪性の患者を4人、良性と判定して見逃しています。 がんの文脈では、見逃し(偽陰性)は過剰検出(偽陽性)よりずっと重い間違いです。 ravel() は 2×2 の行列を tn, fp, fn, tp の順に平らにする関数で、 この4つの数字こそが、次のレッスンの感度・特異度の材料になります。

4. 別のモデルと比べる — ランダムフォレスト

モデルは1つに決め打ちせず、複数を比べるのが定石です。 決定木をたくさん束ねたランダムフォレストを試しましょう。 木ベースのモデルなので、前編で触れたとおり 標準化は不要(元のスケールのまま渡します)。

sample_4.py
Ctrl+Enter
出力

ランダムフォレストは正解率0.965で、ロジスティック回帰(0.971)とほぼ互角。 しかし中身を見ると違いがあります。

モデル正解率見逃し(FN)過剰検出(FP)
ロジスティック回帰0.97141
ランダムフォレスト0.96560

💡 正解率が近くても中身は違う: ランダムフォレストは過剰検出が0で「無駄に拾わない」一方、見逃しは6と多め。 ロジスティック回帰は見逃し4と、こちらのほうが見逃しに強い——。 がんの見逃しを重く見るなら、「過剰検出がゼロで無駄がない」という理由だけでランダムフォレストを選ぶのは早計です。 どちらが「良いモデル」かは、正解率ではなく用途で決まる——これを数値で語る道具が、次のレッスンです。

5. 練習問題

問題 1

見逃しは何人?

混同行列を ravel() で展開したとき、「悪性なのに良性と予測した人数(見逃し)」tn, fp, fn, tp のどれですか。

  • A. fp(偽陽性)
  • B. fn(偽陰性)
  • C. tn(真陰性)
答えと解説を見る

正解:B. fn(偽陰性)

陽性(悪性)を陰性(良性)と誤って陰性にしたのが偽陰性=見逃しです。 「陰性と言ったが間違い」なので False Negative。医療で最も重く扱われる間違いで、 このモデルでは4人(ロジスティック回帰の場合)でした。

問題 2

木の本数を減らすと?

ランダムフォレストの木の本数を n_estimators=10(デフォルトは100)に減らすと、 見逃し(FN)はどうなるでしょうか。予想してから実行してみましょう。

exercise_2.py
出力
ヒントを見る(答え+解説)
rf = RandomForestClassifier(n_estimators=10, random_state=42).fit(X_tr, y_tr)

木を10本に減らすと、正解率は 0.947 に下がり、見逃し(FN)は9に増えます。 木の本数が少ないと予測が安定せず、少数派(悪性)の取りこぼしが増えがちです。 ハイパーパラメータが医療的に重要なFNを左右する——調整の指針はレッスン5で。

問題 3

過学習していないか確かめる

ロジスティック回帰について、訓練データの正解率テストデータの正解率を 両方表示して、差が大きすぎないか(過学習していないか)を確認してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
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の評価を本格的に身につけます。 「有病率の罠」という、現場で最も誤解されるポイントも登場します。

完了するとコース一覧に進捗が記録されます