決定木 (Decision Tree)
decisiontree
一言で言うと
「Yes/No 質問」を木構造で連ねて予測する機械学習モデル。クラス分類なら分類木、数値予測なら回帰木と呼ぶ。scikit-learn で 5 行から試せる。
もう少し詳しく
一言で言うと
「Yes/No 質問」を木構造で連ねて予測する機械学習モデル。クラス分類なら分類木、数値予測なら回帰木と呼ぶ。scikit-learn で 5 行から試せる。
詳細
決定木は「もし年齢が 30 歳以上なら → 次は年収を見る → 500 万以上なら買う、未満なら買わない」のように、人間が日常で行う条件分岐の集まりです。各ノードで最も情報利得が大きい質問を選んで分割していき、葉ノードで予測値を返します。
数学的にはエントロピーまたは Gini 不純度を最小化する分割を貪欲に選びます。深さ制限なしで作ると訓練データを完全に覚えてしまう (過学習) ので、max_depth や min_samples_leaf で必ず制限します。
単独で使うより、Random Forest や Gradient Boosting (XGBoost / LightGBM) のように複数の木を組み合わせるアンサンブル手法のほうが本番では強力です。
具体例
# scikit-learn で Iris データを分類
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.model_selection import train_test_splitX, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
clf = DecisionTreeClassifier(
criterion="entropy", # gini / entropy / log_loss
max_depth=3, # 過学習を抑える深さ制限
random_state=42,
)
clf.fit(X_train, y_train)
print(f"accuracy: {clf.score(X_test, y_test):.3f}")
# 学習した分岐ルールをテキストで確認
print(export_text(clf, feature_names=load_iris().feature_names))
出力例 (抜粋) — if petal length <= 2.45 → setosa、if petal width <= 1.75 → versicolor というように、なぜその予測になったかが人間に読める形で出てきます。
使い分け / トレードオフ
決定木の最大の強みは説明可能性です。金融の与信、医療診断、規制業界のスコアリングなど、「なぜその判断をしたか」を顧客や規制当局に説明する必要があるドメインで重宝されます。
一方、純粋な予測精度では XGBoost / LightGBM などのブースティングや深層学習に劣ります。精度優先なら Random Forest 以降のアンサンブル、解釈優先なら単独の決定木という棲み分けが現場の定石です。
特徴量のスケーリング (標準化) が不要という点は大きな利点です。なお、欠損値や混合型 (数値+カテゴリ) の直接サポートは実装依存で、scikit-learn では欠損値の除去とカテゴリ変数の数値エンコードが必要ですが、LightGBM などの実装では欠損値や混合型をそのまま扱えます。