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

ロジスティック回帰

このレッスンで学ぶこと

  • 「分類」と「回帰」の違いを説明できる
  • ロジスティック回帰で良性/悪性を予測できる
  • シグモイドで「確率」として答える仕組みが分かる
  • predict_proba で予測の確率を確認できる

1. 「分類」=区分を当てる

ここまでは数値を予測する 回帰 を学んできました。Unit 3からは 分類(classification) に進みます。 分類とは、「どの区分(カテゴリ)に当てはまるか」を当てる問題です。

特に、答えが2択のものを 二値分類(binary classification) と呼びます。 「悪性/良性」「陽性/陰性」「再発する/しない」など、医療の現場には二値分類がたくさんあります。 今回は乳がんデータで「悪性(0)か良性(1)か」を予測してみましょう。

2. ロジスティック回帰 — 確率で答える

二値分類のいちばん基本的なモデルが ロジスティック回帰(logistic regression) です。

⚠ 名前に注意: 「回帰」という名前が付いていますが、ロジスティック回帰は“分類”のモデルです。 紛らわしいですが、「数値を予測する線形回帰」とは別物。区分(クラス)を予測するためのモデル、と覚えてください。

ロジスティック回帰のポイントは、いきなり「悪性/良性」と決めつけるのではなく、まず「確率」で答えることです。 「この患者が良性である確率は88%」のように出してから、0.5(50%)を境に区分を決めます。 この「数値を0〜1の確率に変換する」役割をするのが シグモイド関数 です。

シグモイド関数:スコアを0〜1の確率に変換するS字カーブ
シグモイド関数:モデルのスコアを0〜1の確率に変換。確率が0.5より大きければクラス1、小さければクラス0

では実際に作りましょう。前回学んだ標準化を前処理に入れます (ロジスティック回帰はスケールを揃えると安定して学習できます)。

sample_1.py
Ctrl+Enter
出力

💡 正解率(accuracy)とは: 「テストデータのうち、正しく当てられた割合」です。0.982 なら171人中ほぼ全員を正しく分類できた、ということ。 ただし、正解率にはちょっとした落とし穴もあります。それは次の レッスン8 でくわしく扱います。

3. predict_proba — 確率を見る

predict は「0か1か」の区分を返しますが、predict_proba を使うと その判断の“自信”=確率を見られます。医療では「どれくらい確からしいか」がとても重要です。

sample_2.py
Ctrl+Enter
出力

🩺 確率で見ることの意味: 患者0は「良性88%」と自信を持って良性と判断しています。一方、もし「良性52% / 悪性48%」のような患者がいたら、 判断はギリギリ。こういう「確信が低いケース」を見つけて、人間が追加で確認する—— 確率を出せることは、医療AIで特に大切な性質です。

4. 練習問題

問題 1

分類モデルの正解率を出そう

乳がんデータで、標準化 → ロジスティック回帰の流れでモデルを学習し、テストデータの正解率を表示してください。 (分割は test_size=0.3, random_state=42

exercise_1.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler().fit(X_train)

# モデルを学習し、テストの正解率を表示してください
model = LogisticRegression(max_iter=5000, random_state=42)
model.fit(scaler.transform(X_train), y_train)
pred = model.predict(scaler.transform(X_test))
print("正解率:", round(accuracy_score(y_test, pred), 3))   # 0.982

正解率は 0.982。標準化してからロジスティック回帰にかけることで、安定して高精度に分類できます。

問題 2

1人目の確率を確認しよう

上のモデルで、テスト1人目(index 0)悪性確率・良性確率predict_proba で表示してください。

exercise_2.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler().fit(X_train)
model = LogisticRegression(max_iter=5000, random_state=42).fit(scaler.transform(X_train), y_train)
proba = model.predict_proba(scaler.transform(X_test))

# 1人目(index 0)の 悪性確率(列0)・良性確率(列1) を表示してください
print("悪性確率:", round(proba[0][0], 3))   # 0.118
print("良性確率:", round(proba[0][1], 3))   # 0.882

悪性0.118・良性0.882。良性の確率が0.5を大きく超えているので、自信を持って「良性(1)」と判断されます。

問題 3

確率としきい値の関係を確かめよう

1人目について、良性確率が0.5より大きいかと、predictの予測(0か1か)を両方表示し、 「確率0.5超え → クラス1」になっていることを確かめてください。

exercise_3.py
出力
ヒントを見る(解説)

出力は 良性確率が0.5超え?: Truepredictの予測: 1 になります。 良性の確率が0.5を超えたので、予測は「良性(1)」。 このように predict は内部で「確率0.5を境に区分を決めている」だけなのです。 しきい値(0.5)を動かせば、判断の厳しさを調整することもできます。

5. まとめ

このレッスンのポイント

  • 分類=区分を当てる問題(回帰は数値)。2択は二値分類
  • ロジスティック回帰は名前に「回帰」が付くが分類のモデル
  • まず確率で答え、0.5を境に区分を決める(シグモイドで0〜1に変換)
  • predict=区分(0/1)/predict_proba=確率(自信の度合い)
  • 正解率(accuracy)=正しく当てた割合(ただし落とし穴あり→次回)

自由に試してみましょう:

free_practice.py
出力

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