はじめに
初めまして、いわです。
今回は、scikit-learnのRandom forest regressorをデフォルトのパラメータで使用するとRandom forestとしては機能していないという話をします。
Random forestとは?
Random forestは決定木ベースのアルゴリズムである、くらいの理解はある前提で話を進めます。
まず、random forestの定義について説明します。
以下のqiita記事とRandom forestの論文を参考にしました。
定義
- 学習データから重複を許してランダムに複数組のサンプル集合を抽出(Bootstrap Aggregating: バギング)
- 各ノードを分割するために特徴量をランダムに選択する(ここ重要)と、Adaboostと比較して良好な結果が得られる
- ジニ係数を計算し、決定木を作成
- 予測時は各決定木の結果でアンサンブルに推定
データセットをランダムに分割して、複数のサブサンプルに対して特徴量もランダムに選んで決定木を複数作ってその結果をアンサンブルして推定すると精度がAdaboostより良い。ということですね。
Random forestのドキュメントを見てみると
Random forest classifierのドキュメント
Random forest regressorのドキュメント
色々なパラメータを調整できるのですが、max_features
を調整することで、各弱学習器を構築する際に、特徴をいくつ使用するかを決定することができます。
Random forest classifierの場合
max_features{“sqrt”, “log2”, None}, int or float, default=”sqrt”
となっており、入力した特徴量の数の根号数分だけで決定木を作るようになっています。ちゃんとRandom forestの定義に則っていそうで素晴らしいですね。ところが・・
Random forest regressorの場合
max_features{“sqrt”, “log2”, None}, int or float, default=1.0
となっており、デフォルトだと入力した特徴全てを利用するような設定になっています。なんということでしょう。。
これではRandom forestの定義に則っておらず、ただバギングを行っているだけになっています。。。
公式の見解
公式ドキュメントを眺めていた時にこのことに気づき、scikit-learnのissueを覗いたんですが、実はこの議論、scikit-learnのgithubにissueとして上がっていました。
熱い議論が繰り広げられているので興味のある方は是非覗いて見てください。
ざっくりいうと、回帰の場合特徴は全部取ってきた方が性能がいい(今回の実験では)
とのことです。
まとめ
- Scikit-learnのRandom forest regressorはデフォルトのパラメータだとただのバギングした決定木としてしか機能していない
- もし、正しくRandom forestとして使いたい場合は自分でmax_featureを調整しよう
- 公式ドキュメントをちゃんと読もう
以上です、最後まで見てくださった方ありがとうございました!