1. 作るもの — 乳がん診断支援モデル
このレッスンから3回かけて、最初のモデル「乳がん診断支援」を開発します。 使うのは scikit-learn に同梱されている乳がんデータセット(Breast Cancer Wisconsin)。 これは、乳房のしこりに細い針を刺して細胞を採取する検査 (穿刺吸引細胞診/FNA)の画像から計測した細胞核の特徴を数値化したデータで、 医療AIの教材として世界中で使われてきた定番です。
🩺 このモデルの位置づけ: 作るのは「細胞核の計測値から、良性か悪性かの判断を支援するモデル」です。 レッスン1の大原則のとおり、 最終的な診断は医師が行います。ここで学ぶのは、その支援材料をどう作り、どう正しく評価するかです。
まずはデータを読み込んで、全体像をつかみましょう。
569例・30特徴量。特徴量は mean radius(核の半径の平均)、
mean texture(きめ)、mean area(面積)など、
細胞核の形や大きさを数値にしたものです。クラスは malignant(悪性)と benign(良性)の2つです。
2. 最初に決めること —「何を陽性とするか」
モデルを作る前に、医療AIで必ず最初に決めるべきことがあります。それは「何を陽性(1)とするか」です。
見つけたい対象——ここでは悪性——を陽性に置くのが自然です。
ところが、このデータの target は逆になっています。
⚠ なぜ揃えるのか: このあと出てくる感度(見逃さない力)・PPVなどの指標は、すべて「陽性=1」を基準に計算されます。 陽性の向きが逆のままだと、「感度」と思って見ていた数字が実は「特異度」だった、という取り違えが起きます。 開発の一番はじめに陽性を定義して固定する——医療AIの作法です。本コースは以後 1=悪性 で統一します。
3. EDA — データを眺めて、良性と悪性の違いを見る
モデルにかける前に、データ自身に語らせるのがEDA(探索的データ分析)です。
pandasコースで学んだ DataFrame に載せ替えて、
良性と悪性で特徴量がどう違うかを見てみましょう。
悪性(1)のほうが mean radius(核の半径)も mean area(面積)も
mean concavity(くぼみの深さ)も大きいことが読み取れます。
「悪性の細胞核は大きく、いびつ」という医学的な傾向が、数字にも表れているわけです。
この差があるからこそ、機械学習で判別を支援できる見込みが立ちます。
💡 悪性が37%?: このデータの悪性割合は約0.37と、実際の検診集団よりかなり高めです。 これは研究用に集められたデータだからで、有病率(母集団に占める病気の割合)は本番環境で大きく変わります。 この「割合の違い」がなぜ重大かは、レッスン5で 「有病率の罠」として体験します。
4. データを分ける — 層化分割(stratify)
レッスン2で学んだとおり、訓練とテストを分けます。
このデータは1人1レコード(患者ごとに1行)なので患者リーケージの心配はなく、
train_test_split を使えます。ただしstratify=y を必ず付けます。
訓練とテストの悪性率がどちらも約0.37でそろっています。
stratify(層化)は「元の陽性/陰性の比率を、分割後もキープする」指定です。
これを付けないと、偶然テストに悪性が偏り、評価がブレる原因になります
(クラス不均衡なデータほど効いてきます)。
5. 標準化 — スケールをそろえる(リーケージに注意)
このデータの特徴量は、mean area が数百〜数千、mean smoothness が0.1前後と、
桁が大きく違います。ロジスティック回帰のように距離・大きさに敏感なモデルでは、
スケールを標準化(平均0・標準偏差1に変換)してそろえておくのが定石です
(機械学習入門コースの復習)。
⚠ 標準化のリーケージ:
標準化の基準(平均・標準偏差)は訓練データだけから計算します(fit は訓練のみ)。
テストデータを含めて基準を作ると、テストの情報が前処理に漏れる(リーケージ)ため、
scaler.fit(X_train) → transform の順を守ります。
標準化後、訓練データの平均はほぼ0になります。 一方テストデータの平均は0ちょうどにはなりません(0.001)。 これは正常です——テストは「訓練で作った基準」で変換しているだけなので、ぴったり0になる保証はないのです。 むしろぴったり0になったら、テストを含めて基準を作ってしまった(リーケージ)疑いがあります。
💡 木のモデルは標準化不要: 次のレッスンで使うランダムフォレストなどの決定木ベースのモデルは、スケールの影響を受けません (大小関係だけで分岐するため)。標準化が要るのは主にロジスティック回帰やSVM、距離を使うモデルです。 「どのモデルに何の前処理が要るか」を意識できると一歩前進です。
6. 練習問題
stratify のありがたみを見る
次のコードは stratify を付けずに分割しています。実行して悪性率を確認し、
その後stratify=y を追加して、訓練とテストの悪性率がよりそろうことを確かめてください。
ヒントを見る(答え+解説)
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)により近づきます。 このデータでは差は小さいですが、陽性がもっと少ない不均衡データほど、この差は大きく効きます。
標準化はどのデータで fit する?
StandardScaler の fit(基準づくり)を行うべきなのはどれですか。
- A. 全データ(X 全体)で fit してから訓練・テストに分ける
- B. 訓練データだけで fit し、その基準でテストも transform する
- C. 訓練とテストで別々に fit する
答えと解説を見る
正解:B
Aはテストの情報が基準に漏れる(リーケージ)のでNG。 Cはテストを別基準で変換することになり、訓練で学んだモデルとものさしがずれてしまいます。 正解はB——訓練で基準を作り、その同じ基準でテストを変換。本番で新しい患者が来たときも、この訓練基準で変換します。
別の特徴量でも差を見る
sample_3 を改造して、mean smoothness(なめらかさ)と mean symmetry(対称性)について、
良性と悪性で平均を比べてください。悪性のほうが大きいでしょうか。
ヒントを見る(答え+解説)
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(リーケージ防止) - 木のモデルは標準化不要。モデルによって必要な前処理が違う
データの準備が整いました。次のレッスンでは、いよいよモデルを学習させて、 混同行列で結果を読み解きます。
完了するとコース一覧に進捗が記録されます