ランダムフォレスト
バギングの代表ランダムフォレストの仕組みと、扱いやすく頑健なベースラインとしての使い方を学びます。
ランダムフォレストとは#
ランダムフォレストは、多数の決定木を**バギング**で束ねたモデルです。 2 つのランダム性で木に多様性を持たせ、平均することで安定させます。
- データのランダム性:各木をブートストラップ標本(復元抽出)で学習
- 特徴のランダム性:各分割で使う特徴を一部だけランダムに選ぶ
多様な木の平均をとるため、単体の決定木より過学習しにくく、安定します。
実装#
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, StratifiedKFold
model = RandomForestClassifier(
n_estimators=500, # 木の本数(多いほど安定、頭打ちあり)
max_depth=None, # 木の深さ(None は制限なし)
max_features="sqrt", # 各分割で見る特徴数
n_jobs=-1,
random_state=42,
)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
print(cross_val_score(model, X, y, cv=cv).mean())主なパラメータ#
| パラメータ | 役割 |
|---|---|
n_estimators | 木の本数。多いほど安定(増やしすぎても害は少ないが遅くなる) |
max_depth | 木の深さ。小さくすると過学習を抑制 |
max_features | 分割時に見る特徴数。小さいほど木が多様になる |
min_samples_leaf | 葉の最小サンプル数。大きくすると滑らかに |
ヒント
ランダムフォレストは前処理が少なく頑健なので、最初のベースラインに向いています。 ただしテーブルコンペの最終的な主役は、次に学ぶ勾配ブースティング(GBDT)であることが多いです。
メモ
木の本数 n_estimators は増やしても基本的に過学習しません(平均が安定するだけ)。
一方、後述のブースティングでは本数が多すぎると過学習するため、扱いが異なります。
理解度チェック#
次のステップ#
次は、逐次的に残差を補正していく勾配ブースティングの原理を学びます。