Kaggle Tutorial

ランダムフォレスト

バギングの代表ランダムフォレストの仕組みと、扱いやすく頑健なベースラインとしての使い方を学びます。

ランダムフォレストとは#

ランダムフォレストは、多数の決定木を**バギング**で束ねたモデルです。 2 つのランダム性で木に多様性を持たせ、平均することで安定させます。

  1. データのランダム性:各木をブートストラップ標本(復元抽出)で学習
  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 は増やしても基本的に過学習しません(平均が安定するだけ)。 一方、後述のブースティングでは本数が多すぎると過学習するため、扱いが異なります。

理解度チェック#

Quizランダムフォレストが単体の決定木より過学習しにくいのはなぜ?

次のステップ#

次は、逐次的に残差を補正していく勾配ブースティングの原理を学びます。