Chapter 1 Introduction

ランダムフォレストは Breiman (2001) で提案された教師あり学習の手法です。

集団学習(ensemble learning, アンサンブル学習)のなかでもバギングと呼ばれるやつで、複数の弱学習器(決定木)を組み合わせています。

ランダムフォレストは次のような特徴があるとされていて、とくに2010年代前半ごろまでよく使われていました。

  • 過学習が起こりにくいとされ、扱いやすい
  • 高次元だったり、相関があったりするデータでもわりと大丈夫1
  • 欠損値がある・不均衡なデータでもわりと大丈夫2
  • 木をつくるのは並列実行できるので、速い
  • 変数重要度を確認できる

現在では勾配ブースティング系のアルゴリズムのほうが強力なので、以前のようには使われませんが、高次元のデータでも使えてそれなりに速く、変数重要度を確認できるため、とりあえずランダムフォレストに突っ込んで特徴量選択するみたいな使い方ができるようです。

1.1 rangerのランダムフォレストについて

この資料では、tidymodelsからrangerのランダムフォレストを使います。

parsnip::rand_forestでは、以下のエンジンを使用することができます。デフォルトでは、rangerのランダムフォレストが使用されます。

  • ranger
  • aorsf
  • h2o
  • randomForest
  • spark

Wright and Ziegler (2017) は、randomForestよりも後発の実装です。同じくらいの時期に発表されたRboristという実装もありましたが、そちらは使えないようです。

1.2 ハイパーパラメータ

parsnip::rand_forestの各エンジンに共通するハイパーパラメータは次の3つです。

  1. mtry(木を作成するときに使う特徴量の数)
  2. trees(作成する木の数)
  3. min_n(ノードサイズの下限値)

tidymodelsの枠組みのなかでは、mtrytreesを調整します。

1.2.1 mtry(木を作成するときに使う特徴量の数)

mtryです。scikit-learnにおけるmax_featuresのようなものですが、max_featuresとは異なり、それぞれの木をつくるときに使用する特徴量の数をintegerで直接指定します。

mtryのデフォルト値はfloor(sqrt(ncol(x)))となっています。ranger::rangerでは引数を受け取ってinteger scalarを返す関数を指定してもよいことになっていますが、tidymodelsのなかではintegerしか指定できません。

1.2.2 trees(作成する木の数)

num.treesです。scikit-learnにおけるn_estimatorsにあたります。

デフォルト値は500Lになっています。

treesは大きいほうが精度が上がりますが、そのぶん学習にかかる時間も増えます。また、十分に大きくすると、それ以上大きくしてもあまり性能が改善しなくなるため、ふつうは適度な大きさで決め打ちします。

1.2.3 min_n(ノードサイズの下限値)

min.node.sizeです。scikit-learnにおけるmin_samples_splitのようなものです。

デフォルト値は分類の場合は1L、回帰の場合は5Lです。

min_nについては、max.depth=NULLの場合、最小ノードサイズを1にしたときによい結果が得られやすいとされています(1.11. Ensemble methods — scikit-learn 1.2.2 documentation)。ただし、そのぶん過学習は起こりやすくなります。また、一つ一つの木が深くなると学習に時間がかかるようになるため、速く学習を終わらせたいときには、この値を大きくして調整します。

1.3 その他の引数

ranger::rangerの引数はたくさんありますが、ハイパーパラメータは上の3つなので、他の引数についてはあまり触る機会はないです。

1.3.1 importance

変数重要度を出したい場合、impuritypermutationを指定します。

なお、impurityベースの変数重要度については注意して使いましょうという議論もあります。

1.3.2 num.threads

ranger::rangerはデフォルトでは利用可能なCPUコア数と同じ数のスレッドを使用しますが、parsnipのヘルプによると、parsnip::rand_forestではマルチスレッドでの実行は無効になっています。このため、マルチスレッドでの学習を有効にしたい場合は、parsnip::set_engineranger::rangerに渡されるnum.threads引数を明示的に指定します。

References

Breiman, Leo. 2001. “Random Forests.” Machine Learning 45 (1): 5–32. https://doi.org/10.1023/A:1010933404324.
Wright, Marvin N., and Andreas Ziegler. 2017. “Ranger: A Fast Implementation of Random Forests for High Dimensional Data in c++ and r.” Journal of Statistical Software 77 (1): 1–17. https://doi.org/10.18637/jss.v077.i01.

  1. たぶん実装によって異なります↩︎

  2. 実装によって異なります↩︎