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つです。
- mtry(木を作成するときに使う特徴量の数)
- trees(作成する木の数)
- min_n(ノードサイズの下限値)
tidymodelsの枠組みのなかでは、mtry
とtrees
を調整します。
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
変数重要度を出したい場合、impurity
やpermutation
を指定します。
なお、impurityベースの変数重要度については注意して使いましょうという議論もあります。