Re Reference AI

技術

ランダムフォレストとは

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)はどれくらいが目安?

多いほど予測は安定するが、計算コストとのトレードオフになる。数百本程度から始め、検証データでの性能向上が頭打ちになる点を目安に調整することが多い。

参考文献

関連Zenn記事