Shikata Ga Nai

Private? There is no such things.

29. 決定木・ランダムフォレストの仕組み

Hello there, ('ω')ノ

📌 1. 決定木(Decision Tree)とは?

決定木(Decision Tree)は、データを分岐しながら分類・予測するモデル です。
木のようにデータを分けていくことで、最終的な予測を行います。

📌 決定木の仕組み
1. 特徴量(例: 年齢, 収入)を使ってデータを分割
2. 分割を繰り返して、できるだけ純粋なグループを作る
3. 最終的に「クラス分類」や「数値予測」を行う

📌 決定木のイメージ(例: 顧客が商品を買うかどうか)

                ┌─────────── 年齢 < 30 ? ────────────┐
                │                                   │
            Yes(若者)                             No(大人)
                │                                   │
         収入 < 500万?                        過去の購入履歴あり?
              │                                  │
        Yes(買わない)                        Yes(買う) 

「年齢」「収入」「購入履歴」などの特徴を使って、条件分岐しながら予測する!


✅ 分割の基準

決定木は、データを分割する際に 「どの条件で分けるのが最適か?」 を考えます。

📌 主な分割の基準

分割基準 説明
ジニ不純度(Gini Impurity) クラスの混ざり具合を測る(0が最も純粋)
エントロピー(Entropy) 情報量を使ってデータの分け方を評価
MSE(平均二乗誤差) 回帰モデル(数値予測)に使用

クラス分類では「ジニ不純度」や「エントロピー」、回帰では「MSE」を使う!


📌 2. ランダムフォレスト(Random Forest)とは?

ランダムフォレスト(Random Forest) は、複数の決定木を組み合わせて精度を向上させる手法 です。
「1本の決定木」よりも、「たくさんの決定木」を組み合わせることで、より強力な予測モデルになります。

📌 ランダムフォレストの仕組み
1. データの一部をランダムに選び、決定木を作る(ブートストラップサンプリング)
2. 各決定木が予測し、最も多い結果(分類)or 平均値(回帰)を最終予測にする
3. 複数の木を使うことで、過学習を防ぎ、汎化性能を向上させる!

「決定木 × たくさん」= ランダムフォレスト!


📌 3. Pythonで決定木&ランダムフォレストを実装

✅ ① 決定木を実装

まずは、決定木を使って Irisデータセット(花の種類の分類) を行います。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの読み込み
iris = load_iris()
X, y = iris.data, iris.target

# データを学習用・テスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 決定木モデルの作成
tree_model = DecisionTreeClassifier(max_depth=3, random_state=42)
tree_model.fit(X_train, y_train)

# 予測
y_pred = tree_model.predict(X_test)

# 精度の評価
print(f"Accuracy: {accuracy_score(y_test, y_pred):.2f}")

決定木を使ってIrisデータセットを分類!
max_depth=3 で木の深さを制限し、過学習を防ぐ!


✅ ② ランダムフォレストを実装

次に、ランダムフォレストを使って、同じ分類タスクを試してみましょう!

from sklearn.ensemble import RandomForestClassifier

# ランダムフォレストモデルの作成
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)

# 予測
y_pred_rf = rf_model.predict(X_test)

# 精度の評価
print(f"Random Forest Accuracy: {accuracy_score(y_test, y_pred_rf):.2f}")

ランダムフォレストで分類精度を向上!
n_estimators=100 で100本の決定木を作成!

ランダムフォレストの方が一般的に精度が高く、過学習しにくい!


📌 4. 特徴量の重要度を可視化

ランダムフォレストでは、「どの特徴が予測に重要か?」 を分析できます。

import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib  # ← 追加(matplotlibで日本語対応)

# 特徴量の重要度を取得
feature_importances = rf_model.feature_importances_

# 棒グラフで可視化
plt.figure(figsize=(6,4))
plt.barh(iris.feature_names, feature_importances, color="skyblue")
plt.xlabel("Feature Importance")
plt.title("特徴量の重要度")
plt.show()

「どの特徴が最も影響を与えているか?」を可視化!
不要な特徴を削除することで、よりシンプルなモデルを作れる!


📌 5. 決定木 vs ランダムフォレストの違い

決定木(Decision Tree) ランダムフォレスト(Random Forest)
モデルの特徴 1本の木 複数の木を組み合わせる
メリット シンプルで解釈しやすい 高精度&過学習しにくい
デメリット 過学習しやすい 計算コストが高い
用途 ルールを可視化したい場合 精度を重視したい場合

解釈のしやすさなら「決定木」!
精度を求めるなら「ランダムフォレスト」!


🎯 まとめ

決定木は「条件分岐」でデータを分類・予測する!
ランダムフォレストは「多数の決定木」を組み合わせた強力なモデル!
Pythonで実装し、分類タスクを試してみよう!
特徴量の重要度を可視化し、モデルの解釈を深めよう!

Best regards, (^^ゞ