ランダムフォレストとは
Random Forest
多数の決定木をランダムな条件下で学習させ、それらの予測を多数決・平均で統合するアンサンブル学習手法
ひとことで言うと
概要
ランダムフォレストとは、学習データと特徴量の両方をランダムに抽出しながら多数の決定木を学習させ、それぞれの予測結果を多数決(分類の場合)または平均(回帰の場合)で統合するアンサンブル学習手法。 個々の決定木は学習データの一部(ブートストラップサンプル)と特徴量の一部のみを使って学習するため、木同士の予測が互いに独立しやすくなる。 単体の決定木で起きやすい過学習を抑えつつ、高い予測性能を実現する手法として広く使われている。
背景
単体の決定木は学習データのわずかな変化にも敏感で、過学習を起こしやすいという弱点があった。 ランダムフォレストは、多数の決定木をあえてランダムにばらつかせて学習し、その予測を組み合わせることでこの不安定さを緩和するために考案された。
歴史
2001年: Leo Breimanが、決定木にバギング(ブートストラップ集約)と特徴量のランダム選択を組み合わせたランダムフォレストを提案する論文を発表。
アーキテクチャ
各決定木は、学習データから復元抽出(ブートストラップサンプリング)したデータ集合と、各ノードでランダムに選んだ一部の特徴量のみを使って学習する。 この2重のランダム性により個々の木の相関が下がり、多数決・平均で統合した際の分散が小さくなる。 学習に使われなかったデータ(Out-of-Bag、OOB)を使って、追加の検証データを用意せずに汎化性能を見積もることもできる。
ワークフロー
学習データから復元抽出でブートストラップサンプルを作成 → 各サンプルに対しランダムに選んだ特徴量の部分集合で決定木を学習 → これを木の本数分繰り返す → 予測時は全ての木の出力を多数決(分類)または平均(回帰)で統合する。
コード例
scikit-learnでランダムフォレストを学習する
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
print(model.score(X_test, y_test))利点
欠点
比較
関連用語
よくある質問
ランダムフォレストと決定木、どちらを使うべき?
解釈性より予測精度・安定性を重視する場合はランダムフォレスト、判断根拠の単純さを重視する場合は単体の決定木が向く。
木の本数(n_estimators)はどれくらいが目安?
多いほど予測は安定するが、計算コストとのトレードオフになる。数百本程度から始め、検証データでの性能向上が頭打ちになる点を目安に調整することが多い。
参考文献
- Research PaperRandom Forests
- Documentationscikit-learn: RandomForestClassifier