2.3.1
決定木分類
まとめ
- 決定木分類器は「もし◯◯なら左へ、そうでなければ右へ」と条件分岐を繰り返し、葉ノードの多数派クラスで予測する
- ジニ不純度やエントロピーなどの指標で分割の良し悪しを評価し、純度が最も高まる特徴量としきい値を選ぶ
- 木構造をそのまま図示できるため、予測根拠を関係者に説明しやすい
- 深さや葉ノードサイズを制御して過学習を抑え、必要に応じてアンサンブル手法へ発展できる
直感 #
サンプルを特徴量に基づいて左右に振り分け、最終的に到達した葉ノードで多数派クラスを返します。分岐を重ねるほど木は深くなりデータを細かく表現できますが、そのぶん過学習しやすくなります。根ノードの「質問」と枝の「はい/いいえ」の流れを辿るだけで予測のロジックを追跡できる点が大きな利点です。
flowchart TD
A["根ノード\n全サンプル"] --> B{"特徴量としきい値を選択\nGini / Entropy 最大化"}
B -->|"x_j ≤ s"| C["左子ノード"]
B -->|"x_j > s"| D["右子ノード"]
C --> E{"純度が十分?"}
D --> F{"純度が十分?"}
E -->|No| G["さらに分割"]
E -->|Yes| H["葉ノード\n多数派クラス"]
F -->|No| I["さらに分割"]
F -->|Yes| J["葉ノード\n多数派クラス"]
style A fill:#2563eb,color:#fff
style H fill:#10b981,color:#fff
style J fill:#10b981,color:#fff
具体的な数式 #
ノード \(t\) におけるジニ不純度は
$$ \mathrm{Gini}(t) = 1 - \sum_k p_k^2 $$で定義されます(\(p_k\) はノード \(t\) に含まれるクラス \(k\) の割合)。エントロピーは
$$ H(t) = - \sum_k p_k \log p_k $$です。親ノード \(t\) を特徴量 \(x_j\) としきい値 \(s\) で左右に分割したとき、不純度減少量
$$ \Delta I = I(t) - \frac{n_L}{n_t} I(t_L) - \frac{n_R}{n_t} I(t_R) $$が最大になる組み合わせを選び、葉ノードに達するまで繰り返します。ここで \(I(\cdot)\) は選んだ不純度指標、\(n_t\) はノード \(t\) のサンプル数です。
深い木は訓練データに過学習しやすくなります。max_depth や min_samples_leaf を制限せずに学習すると、テストデータで大きく性能が落ちることがあります。交差検証で適切な深さを選んでください。
Pythonを用いた実験や説明 #
人工データで決定境界と木構造を可視化するコードです。最初の可視化では 2 次元の特徴量空間における決定境界を等高線として描画し、続く可視化では plot_tree 関数で学習した木の構造を確認します。
| |
| |
max_depth=3〜5 に制限すると過学習を抑えつつ木の構造を人間が読める範囲に保てます。export_text や plot_tree で分岐ルールを文書化すると、ステークホルダーへの説明が容易になります。
最大深さと決定境界 #
決定木の最大深さを変えると境界がどう複雑になるか、過学習の様子を確認できます。
まとめ #
- 決定木は特徴量としきい値による条件分岐を繰り返してクラスを予測する、解釈性の高いモデルです。
- ジニ不純度やエントロピーを用いた不純度減少量の最大化が分割基準となります。
- 木の深さや葉ノードサイズを制限することで過学習を防ぎ、汎化性能を維持できます。
- ランダムフォレストやXGBoostなど、決定木を基底学習器とするアンサンブル手法への発展が容易です。
参考文献 #
- Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (1984). Classification and Regression Trees. Wadsworth.
- scikit-learn developers. (2024). Decision Trees. https://scikit-learn.org/stable/modules/tree.html