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

決定木とランダムフォレスト

このレッスンで学ぶこと

  • 決定木が「質問を繰り返して分類する」仕組みだと分かる
  • ランダムフォレスト(木の多数決)の強みが分かる
  • feature_importances_ で重要な特徴量を調べられる
  • 線形モデルとの違い(非線形・前処理不要)を説明できる

1. 決定木 — 質問を繰り返して分類する

これまでのロジスティック回帰は「直線(境界)」で区分を分けるモデルでした。 まったく違う発想のモデルが 決定木(decision tree) です。 これは「Yes / No の質問を繰り返して、答えにたどり着く」——いわばフローチャートです。

下は、乳がんデータで実際に作った決定木(深さ2)です。 「worst radius(最大半径)は16.795以下か?」という質問から始まり、枝分かれしながら「悪性/良性」を判定しています。

乳がんデータで作った決定木(深さ2)の図
実際の決定木(深さ2)。各マスの質問で枝分かれし、最後に class(malignant=悪性 / benign=良性)を判定
sample_1.py
Ctrl+Enter
出力

💡 決定木の特徴:

  • 解釈しやすい…「なぜそう判断したか」を質問の流れで追える(医療で重要)
  • 非線形な関係も扱える…直線では分けられない複雑な境界もOK
  • 前処理(標準化)が不要…大小を比べるだけなので、スケールの影響を受けない

ただし1本の決定木は、データに合わせ込みすぎて過学習しやすい弱点があります。そこで——

2. ランダムフォレスト — 木をたくさん集める

1本の木が頼りないなら、たくさんの木を作って“多数決”すればいい——これが ランダムフォレスト(random forest) です。 少しずつ異なる木を何百本も育て、その予測を多数決でまとめます。 このように「複数のモデルを組み合わせて賢くする」仕組みを アンサンブル(ensemble) と呼びます。

sample_2.py
Ctrl+Enter
出力

💡 多数決で精度が上がった: 正解率が 0.942 → 0.971 に向上しました。1本の木より、たくさんの木の多数決のほうが安定して当たります。 「一人の意見より、大勢の意見のほうが信頼できる」のと同じ発想です。 ランダムフォレストはそこそこ手軽で精度も高いため、実務で最初に試される定番モデルのひとつです。

3. 特徴量の重要度(どの手がかりが効いた?)

ランダムフォレストには、もう一つ便利な機能があります。 feature_importances_ を見ると、「予測にどの特徴量がよく効いたか」が分かります。 医療では「何が診断の決め手だったのか」を知る手がかりになります。

sample_3.py
Ctrl+Enter
出力

🩺 重要度が分かると何が嬉しい?: 「mean concave points(細胞核のへこみ具合)」などが診断に強く効いている、と分かります。 どの検査項目が判断の決め手かが見えると、医療者の納得感が高まり、不要な検査を減らすヒントにもなります。 「予測できる」だけでなく「理由が見える」のは、医療AIで特に価値のある性質です。

4. 練習問題

ここでは解説とは別のデータ「ワインの成分データ」(scikit-learn同梱・医療以外)を使います。 学んだ手順が初めてのデータにもそのまま通用することを、自分の手で確かめましょう。 ワインは 13成分から3品種(class_0/1/2)を当てる多クラス分類です。

問題 1

決定木で分類しよう

ワインの成分データload_wine)で DecisionTreeClassifier を学習させ、テストの正解率を表示してください。 (分割は test_size=0.3, random_state=42、モデルも random_state=42

exercise_1.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 決定木を学習し、正解率を表示してください
model = DecisionTreeClassifier(random_state=42).fit(X_train, y_train)
pred = model.predict(X_test)
print("正解率:", round(accuracy_score(y_test, pred), 3))   # 0.963

決定木の正解率は 0.963。これは3品種の多クラス分類ですが、コードは乳がん(2クラス)のときとまったく同じ。木モデルは標準化なしでOKです。

問題 2

ランダムフォレストと比べよう

同じワインデータで RandomForestClassifier を学習させ、正解率が決定木より上がることを確かめてください。

exercise_2.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# ランダムフォレストを学習し、正解率を表示してください
model = RandomForestClassifier(random_state=42).fit(X_train, y_train)
pred = model.predict(X_test)
print("正解率:", round(accuracy_score(y_test, pred), 3))   # 1.0

ランダムフォレストは 1.0。決定木(0.963)より高精度です。別データ(ワイン)でも、多数決(アンサンブル)で精度が上がることが確認できました。

問題 3

重要な特徴量トップ3を出そう

ランダムフォレストの feature_importances_ を使って、ワインの品種判定に効いた特徴量トップ3を表示してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

d = load_wine()
X_train, X_test, y_train, y_test = train_test_split(d.data, d.target, test_size=0.3, random_state=42)
model = RandomForestClassifier(random_state=42).fit(X_train, y_train)

# 重要度の高い特徴量トップ3を表示してください
pairs = list(zip(model.feature_importances_, d.feature_names))
pairs.sort(reverse=True)
for importance, name in pairs[:3]:
    print(name, round(importance, 3))
# color_intensity 0.18
# flavanoids 0.166
# alcohol 0.142

トップは color_intensity(色の濃さ)や flavanoids(ポリフェノールの一種)など。 重要度を見ると、どの成分が品種の決め手になったかが分かります。

5. まとめ

このレッスンのポイント

  • 決定木=Yes/Noの質問を繰り返して分類(フローチャート型)。解釈しやすく非線形もOK
  • 木モデルは標準化(前処理)が不要(大小を比べるだけ)
  • 1本の木は過学習しやすい → ランダムフォレスト(木の多数決=アンサンブル)で安定・高精度
  • 正解率が 0.942 → 0.971 に向上(多数決の効果)
  • feature_importances_ で「どの特徴量が効いたか」が分かる(理由が見える)

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

free_practice.py
出力

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