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

モデル① 乳がん診断支援(前編)— データを知る

このレッスンで学ぶこと

  • 乳がんデータセット(569例・細胞核の特徴量30個)の中身を理解する
  • 開発の最初に「何を陽性とするか」を決める大切さを知る(1=悪性に統一)
  • pandasでEDA(データの探索)を行い、良性/悪性の違いを見る
  • 層化分割(stratify)標準化(StandardScaler)を正しい手順で行う

1. 作るもの — 乳がん診断支援モデル

このレッスンから3回かけて、最初のモデル「乳がん診断支援」を開発します。 使うのは scikit-learn に同梱されている乳がんデータセット(Breast Cancer Wisconsin)。 これは、乳房のしこりに細い針を刺して細胞を採取する検査 (穿刺吸引細胞診/FNA)の画像から計測した細胞核の特徴を数値化したデータで、 医療AIの教材として世界中で使われてきた定番です。

🩺 このモデルの位置づけ: 作るのは「細胞核の計測値から、良性か悪性かの判断を支援するモデル」です。 レッスン1の大原則のとおり、 最終的な診断は医師が行います。ここで学ぶのは、その支援材料をどう作り、どう正しく評価するかです。

まずはデータを読み込んで、全体像をつかみましょう。

sample_1.py
Ctrl+Enter
出力

569例・30特徴量。特徴量は mean radius(核の半径の平均)、 mean texture(きめ)、mean area(面積)など、 細胞核の形や大きさを数値にしたものです。クラスは malignant(悪性)と benign(良性)の2つです。

2. 最初に決めること —「何を陽性とするか」

モデルを作る前に、医療AIで必ず最初に決めるべきことがあります。それは「何を陽性(1)とするか」です。 見つけたい対象——ここでは悪性——を陽性に置くのが自然です。 ところが、このデータの targetになっています。

sample_2.py
Ctrl+Enter
出力

⚠ なぜ揃えるのか: このあと出てくる感度(見逃さない力)・PPVなどの指標は、すべて「陽性=1」を基準に計算されます。 陽性の向きが逆のままだと、「感度」と思って見ていた数字が実は「特異度」だった、という取り違えが起きます。 開発の一番はじめに陽性を定義して固定する——医療AIの作法です。本コースは以後 1=悪性 で統一します。

3. EDA — データを眺めて、良性と悪性の違いを見る

モデルにかける前に、データ自身に語らせるのがEDA(探索的データ分析)です。 pandasコースで学んだ DataFrame に載せ替えて、 良性と悪性で特徴量がどう違うかを見てみましょう。

sample_3.py
Ctrl+Enter
出力

悪性(1)のほうが mean radius(核の半径)も mean area(面積)も mean concavity(くぼみの深さ)も大きいことが読み取れます。 「悪性の細胞核は大きく、いびつ」という医学的な傾向が、数字にも表れているわけです。 この差があるからこそ、機械学習で判別を支援できる見込みが立ちます。

💡 悪性が37%?: このデータの悪性割合は約0.37と、実際の検診集団よりかなり高めです。 これは研究用に集められたデータだからで、有病率(母集団に占める病気の割合)は本番環境で大きく変わります。 この「割合の違い」がなぜ重大かは、レッスン5で 「有病率の罠」として体験します。

4. データを分ける — 層化分割(stratify)

レッスン2で学んだとおり、訓練とテストを分けます。 このデータは1人1レコード(患者ごとに1行)なので患者リーケージの心配はなく、 train_test_split を使えます。ただしstratify=y を必ず付けます

sample_4.py
Ctrl+Enter
出力

訓練とテストの悪性率がどちらも約0.37でそろっていますstratify(層化)は「元の陽性/陰性の比率を、分割後もキープする」指定です。 これを付けないと、偶然テストに悪性が偏り、評価がブレる原因になります (クラス不均衡なデータほど効いてきます)。

5. 標準化 — スケールをそろえる(リーケージに注意)

このデータの特徴量は、mean area が数百〜数千、mean smoothness が0.1前後と、 桁が大きく違います。ロジスティック回帰のように距離・大きさに敏感なモデルでは、 スケールを標準化(平均0・標準偏差1に変換)してそろえておくのが定石です (機械学習入門コースの復習)。

⚠ 標準化のリーケージ: 標準化の基準(平均・標準偏差)は訓練データだけから計算します(fit は訓練のみ)。 テストデータを含めて基準を作ると、テストの情報が前処理に漏れる(リーケージ)ため、 scaler.fit(X_train)transform の順を守ります。

sample_5.py
Ctrl+Enter
出力

標準化後、訓練データの平均はほぼ0になります。 一方テストデータの平均は0ちょうどにはなりません(0.001)。 これは正常です——テストは「訓練で作った基準」で変換しているだけなので、ぴったり0になる保証はないのです。 むしろぴったり0になったら、テストを含めて基準を作ってしまった(リーケージ)疑いがあります。

💡 木のモデルは標準化不要: 次のレッスンで使うランダムフォレストなどの決定木ベースのモデルは、スケールの影響を受けません (大小関係だけで分岐するため)。標準化が要るのは主にロジスティック回帰やSVM、距離を使うモデルです。 「どのモデルに何の前処理が要るか」を意識できると一歩前進です。

6. 練習問題

問題 1

stratify のありがたみを見る

次のコードは stratify を付けずに分割しています。実行して悪性率を確認し、 その後stratify=y を追加して、訓練とテストの悪性率がよりそろうことを確かめてください。

exercise_1.py
出力
ヒントを見る(答え+解説)
X_tr, X_te, y_tr, y_te = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y)

stratifyなしでは 訓練0.374 / テスト0.368、stratifyありでは 訓練0.372 / テスト0.374 と、 テスト側が母集団の割合(約0.373)により近づきます。 このデータでは差は小さいですが、陽性がもっと少ない不均衡データほど、この差は大きく効きます

問題 2

標準化はどのデータで fit する?

StandardScalerfit(基準づくり)を行うべきなのはどれですか。

  • A. 全データ(X 全体)で fit してから訓練・テストに分ける
  • B. 訓練データだけで fit し、その基準でテストも transform する
  • C. 訓練とテストで別々に fit する
答えと解説を見る

正解:B

Aはテストの情報が基準に漏れる(リーケージ)のでNG。 Cはテストを別基準で変換することになり、訓練で学んだモデルとものさしがずれてしまいます。 正解はB——訓練で基準を作り、その同じ基準でテストを変換。本番で新しい患者が来たときも、この訓練基準で変換します。

問題 3

別の特徴量でも差を見る

sample_3 を改造して、mean smoothness(なめらかさ)と mean symmetry(対称性)について、 良性と悪性で平均を比べてください。悪性のほうが大きいでしょうか。

exercise_3.py
出力
ヒントを見る(答え+解説)
print(df.groupby("malignant")[["mean smoothness", "mean symmetry"]].mean().round(3))

悪性(1)は smoothness ≒ 0.103・symmetry ≒ 0.193、良性(0)は smoothness ≒ 0.092・symmetry ≒ 0.174 で、 どちらも悪性のほうがやや大きいとわかります。 ただし差は mean radius ほど大きくなく、特徴量によって「効き方」が違うことが見えてきます (どれが効くかは レッスン4・9で扱います)。

7. まとめ

このレッスンのポイント

  • 乳がんデータは569例・30特徴量(細胞核の形・大きさの計測値)
  • 開発の最初に陽性を定義する。このデータは target が逆なので y = (target == 0)1=悪性に統一
  • EDA(groupby)で、悪性は核が大きく・いびつという傾向を数字で確認
  • 分割は stratify=y陽性率をそろえる。標準化は訓練だけで fit(リーケージ防止)
  • 木のモデルは標準化不要。モデルによって必要な前処理が違う

データの準備が整いました。次のレッスンでは、いよいよモデルを学習させて、 混同行列で結果を読み解きます。

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