ランダムフォレスト徹底ガイド:仕組み・ハイパーパラメータ・実務で使えるチューニングと評価指標

ランダムフォレストとは — 概要

ランダムフォレスト(Random Forest)は、機械学習における代表的なアンサンブル学習手法の一つで、複数の決定木(Decision Tree)を組み合わせて予測精度を高めるアルゴリズムです。2001年に Leo Breiman が体系化した手法で、分類(classification)・回帰(regression)の双方に用いられます。個々の木は「弱学習器」ですが、多数の木を集めることで過学習を抑えつつ高い汎化性能を実現します。

基本アイデアと直感

直感的には「多数決」の考え方に基づきます。データの異なるサブサンプルから多数の決定木を作り、それらの予測を平均(回帰)または多数決(分類)で集約します。個々の木は相互に独立(できるだけ相関が小さい)であることが理想で、個々の誤差が互いに相殺されることで全体としての誤差が減少します。

アルゴリズムの仕組み(ステップ)

  • ブートストラップサンプリング(Bootstrap):学習データから復元抽出で複数のサブセットを作成し、各サブセットから1本の決定木を学習します(この過程は「bagging:bootstrap aggregating」と呼ばれます)。
  • ランダム特徴選択(mtry/max_features):各分割ノードで全特徴量の中からランダムに一部の特徴量のみを候補として選び、その中で最も良い分割を採用します。これにより木同士の相関が減り、アンサンブル効果が高まります。
  • 成長と集約:各木は一般に深く(完全に)成長させることが多く、最後に各木の予測を平均または多数決でまとめます。
  • アウト・オブ・バッグ(OOB)推定:各木の学習に用いられなかったデータ(OOBサンプル)を使って、追加の検証を行い、汎化誤差の推定や変数重要度の算出に利用できます。

主要なハイパーパラメータ

  • n_estimators(木の本数): 増やすほど性能が安定するが計算コストが増加します。
  • max_features(各分割でランダムに選ぶ特徴量の数): 小さくすると木間の相関が下がりバリアンスは減るが、バイアスが増える可能性があります。分類では sqrt(p)、回帰では p/3 といった経験則があります。
  • max_depth、min_samples_split、min_samples_leaf:木の深さや分割条件を制限して過学習や計算負荷を制御します。
  • bootstrap:サンプリングを行うか(True/False)。一部実装ではブートストラップ無しでランダムにサブサンプルを取ることも可。

評価指標と可視化

  • Out-of-Bag(OOB)誤差:交差検証の代替として各木のOOBサンプルを用いれば、追加の検証データ無しに汎化誤差を推定できます(Breiman の原典で提案)。
  • 変数重要度(Variable Importance):代表的には「平均的な不純度減少(Gini重要度 / mean decrease in impurity)」と「置換による重要度(permutation importance / mean decrease in accuracy)」があります。Gini重要度はカテゴリや数値の分布によってバイアスが生じやすく、置換法はその偏りを軽減します(研究で指摘あり)。
  • 部分依存プロット(Partial Dependence Plot):特定の特徴量と予測値の関係を平均化して可視化する手法。

利点(メリット)

  • 高い精度:多くの実問題で安定して良い性能を示します。
  • 過学習に強い:単一の深い木に比べて過学習の影響が小さい。
  • 非線形かつ特徴量間の相互作用を自動で扱える。
  • 特徴量のスケーリング(標準化)をほとんど必要としない。
  • 欠損値やカテゴリ変数の扱いが実装によっては柔軟(ただし全実装が対応しているわけではない)。

注意点・欠点(デメリット)

  • 解釈性の低さ:個々の木は解釈可能でも、全体としてはブラックボックス的です。変数重要度や部分依存で補うことはできますが限界があります。
  • 計算コスト:木の本数や深さ、データ量が大きいと学習・予測が重くなります。並列化で改善可能。
  • 高次元疎データや多数のカテゴリカル変数でバイアスが出る場合がある(特にGini重要度)。
  • 確率出力の較正:クラス確率は必ずしも良くキャリブレーションされていないため、確率が重要な場合は校正が必要です。

実装上の差異と実務上の注意

「ランダムフォレスト」はアルゴリズムの大枠が同じでも実装(RのrandomForest、scikit-learn、XGBoostの類似実装、Spark MLlibなど)によりデフォルト値・機能が異なります。例えば、欠損値の扱い、カテゴリ変数の内部表現、変数重要度の算出方法、OOBスコアの計算方法などは実装に依存します。scikit-learn の RandomForest は古くから NaN を直接扱えないため前処理が必要ですが、R のパッケージには補完手段を持つものがあります。利用するライブラリのドキュメントを確認してください。

派生手法・関連手法

  • Extra Trees(Extremely Randomized Trees):分割点の選び方をさらにランダム化して計算速度を上げる手法。
  • 勾配ブースティング(Gradient Boosting)系(XGBoost、LightGBM、CatBoost):木を逐次的に学習させ誤差を減らす方式で、ランダムフォレストとは異なる長所(高精度)短所(ハイパーパラメータ調整の難しさ)があります。
  • 最近の解析手法:ランダムフォレストの不偏性や重要度のバイアスに関する研究(例:変数重要度のバイアスを扱う手法)も多数あります。

実務でのチューニングに関するコツ

  • まずはデフォルトで n_estimators を増やして安定性を確認(例えば100〜1000本)。並列で学習可能なら多めにしてもよい。
  • max_features を変えてモデルのバイアス・バリアンスのトレードオフを探る。分類で sqrt(p)、回帰で p/3 を試すのが経験則。
  • OOBスコアを使えば検証を効率化できる。ただし交差検証と併用して頑健性を確認するのが望ましい。
  • 変数重要度は置換重要度(permutation)を活用するとバイアスが少ない。
  • 確率が重要なら、キャリブレーション(Platt scaling や isotonic regression)を検討。

利用例(ユースケース)

  • 顧客の離反予測、与信(信用スコア)モデル、医療診断や遺伝子データの特徴選択、製造の異常検知など幅広いドメインで用いられます。
  • 特徴量が多数あり、非線形性や相互作用が多そうな問題に強い選択肢です。

まとめ

ランダムフォレストは「安定して高性能」「過学習に比較的強い」「前処理の手間が少ない」といった点で実務に非常に適したアルゴリズムです。とはいえ解釈性や計算コストの問題、変数重要度のバイアスなど注意点もあるため、用途に応じてブースティング系手法や解釈手法と組み合わせて使うのが良いアプローチです。実装ごとの細かな挙動の違いに留意して、OOBや交差検証、置換重要度などを用いて結果を検証してください。

参考文献