機械学習
決定木とランダムフォレスト入門
機械学習の基本的なアルゴリズムである決定木とランダムフォレストの仕組みと実装方法を解説します。
決定木とは
決定木は、データの特徴量に基づいて段階的に分岐を行い、予測を行うアルゴリズムです。直感的で解釈しやすいという特徴があります。
決定木の仕組み
決定木は、情報利得(Information Gain)やジニ不純度(Gini Impurity)を基準にデータを分割します。
ジニ不純度
Gini(t) = 1 - \sum_{i=1}^{c} p_i^2
ここで p_i はクラス i に属するサンプルの割合です。
scikit-learnでの実装
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# データの準備
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3, random_state=42
)
# モデルの学習
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)
# 精度の確認
print(f"訓練データ精度: {dt.score(X_train, y_train):.3f}")
print(f"テストデータ精度: {dt.score(X_test, y_test):.3f}")
ランダムフォレスト
ランダムフォレストは、複数の決定木を組み合わせたアンサンブル学習手法です。
主な利点:
- 過学習しにくい
- 特徴量の重要度を算出可能
- 高い予測精度
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
print(f"テストデータ精度: {rf.score(X_test, y_test):.3f}")
# 特徴量の重要度
for name, importance in zip(iris.feature_names, rf.feature_importances_):
print(f"{name}: {importance:.3f}")
決定木 vs ランダムフォレスト
| 特徴 | 決定木 | ランダムフォレスト |
|---|---|---|
| 解釈性 | 高い | 低い |
| 過学習 | しやすい | しにくい |
| 計算コスト | 低い | 高い |
| 予測精度 | 普通 | 高い |
まとめ
- 決定木は直感的で解釈しやすいアルゴリズム
- ランダムフォレストはアンサンブルにより精度と汎化性能を向上
- scikit-learnを使えば数行で実装可能