実務エンジニアのための

決定木・ランダムフォレスト超入門教科書

本書は 「決定木が何かわからないレベル」 から、 実務でコードを書いて使えるレベル まで到達することを目的とします。


1. 決定木とは何か(超直感)

1.1 一言で言うと

決定木(Decision Tree)とは、

質問を順番にしていき、条件分岐で結論を出すモデル

です。

人間が無意識にやっている「判断」を、そのまま機械にさせます。


2. 日常例で理解する決定木

2.1 人間の判断はすでに決定木

たとえば「外出するか」を決める場合:

この 質問 → 分岐 → 結論 の構造が決定木です。


3. データになるとどう見えるか

3.1 シンプルな表(元データ)

まずは、決定木で扱う 最小限のデータ を考えます。

気温雨外出
高いいいえ行く
低いはい行かない
高いはい行かない

ここでは、

「気温」と「雨」から 外出するかどうか を予測する

という問題設定になります。


3.2 決定木はこの表をどう見るか(考え方)

決定木は次のように自問します。

候補となる質問は 2 つです。

  1. 気温は高い?低い?
  2. 雨は降っている?いない?

3.3 質問 ①「気温」で分けてみる

→ 答えが混ざっている

→ こちらはきれいだが、全体としては微妙


3.4 質問 ②「雨」で分けてみる

→ 完全に一致

→ 完全に一致

👉 この時点で、

「雨かどうか」で分けるのが最善

と判断されます。


3.5 これが「不純度が小さい」という意味

決定木は 数式を使って これを計算し、 一番小さくなる質問を自動で選びます。


3.6 実際のコードに落とす(超重要)

この表を Python コード にするとこうなります。

import pandas as pd
from sklearn.tree import DecisionTreeClassifier

# データ作成
X = pd.DataFrame({
    "気温": [1, 0, 1],      # 高い=1, 低い=0
    "雨": [0, 1, 1]        # いいえ=0, はい=1
})

y = [1, 0, 0]  # 行く=1, 行かない=0

# モデル作成
model = DecisionTreeClassifier(max_depth=2)
model.fit(X, y)

ポイント:


3.7 予測してみる(演習)

問題:

このとき外出するか?

new_data = pd.DataFrame({
    "気温": [1],
    "雨": [0]
})

prediction = model.predict(new_data)
print(prediction)

考え方:

出力イメージ:

[1]

3.8 決定木の中身を言葉で再現すると

このモデルは、内部的にほぼ次のルールを持っています。

👉 人間が書いた if 文と同じです。


3.9 if 文で書くとこうなる

if 雨 == 1:
    外出 = 0
else:
    外出 = 1

決定木は、この if 文を データから自動生成 してくれる仕組みです。

高いいいえ行く
低いはい行かない
高いはい行かない

決定木は次を自動で考えます。

この例では 「雨かどうか」 が最初の質問として優秀です。


4. 良い分け方・悪い分け方

4.1 ポイントは「混ざり具合」

この「混ざり具合」を数値にしたものが 不純度 です。


5. Gini 不純度(感覚だけで OK)

決定木は:

分岐後の不純度が一番小さくなる質問

を選び続けます。

※ 数式は実務では不要です。


6. 木が成長するとはどういうことか

決定木は以下を繰り返します。

  1. 一番良い質問を選ぶ
  2. データを分ける
  3. それぞれでまた質問する

質問の回数が増えるほど 木が深くなる と言います。


7. なぜ過学習しやすいのか

質問を増やしすぎると:

が起こります。

これが 過学習 です。


8. 深さ制限(最重要)

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(max_depth=3)

意味:

効果:


9. 最小コードで動かす決定木

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(max_depth=3)
model.fit(X_train, y_train)
pred = model.predict(X_test)

これだけで「自動判断マシン」が完成します。


10. 決定木の長所と短所

長所

短所


11. ランダムフォレストとは何か

11.1 一言で

少しずつ違う決定木を大量に作って、多数決を取るモデル


12. なぜ強くなるのか

12.1 2 つのランダム

  1. データをランダム抽出(ブートストラップ)
  2. 使う特徴量をランダム制限

→ 同じ木ができにくい

12.2 効果


13. 最小コードで動かすランダムフォレスト

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    random_state=42
)

model.fit(X_train, y_train)
pred = model.predict(X_test)

14. 超重要パラメータ


15. 決定木 vs ランダムフォレスト

項目決定木ランダムフォレスト
解釈性高いやや低い
精度低め高い
安定性低い高い
実務使用補助主力

16. 演習 ①:深さを変える

DecisionTreeClassifier(max_depth=10)

起きやすいこと:


17. 演習 ②:どちらが良い?

A

RandomForestClassifier(n_estimators=10, max_depth=20)

B

RandomForestClassifier(n_estimators=100, max_depth=5)

→ B(浅い木 × 多数決)


18. 演習 ③:特徴量重要度

importances = model.feature_importances_

わかること:


19. なぜ標準化が不要なのか

→ スケールの影響を受けない


20. 実務での使い分け指針