ランダムフォレストBookmarkTwitterFacebook読者になるはじめにランダムフォレストは決定木のアンサンブル学習なので、何も考えずに使うと過学習します。過学習対策はいろいろあるので(木の深さだったり、ノードあたりのサンプル数による制御だったり)、やってみます。その過学習した状態の方が性能良いこともあるんですが......sklearnの場合に設定できるパラメータ以下のようなものがあるようですね。以下で「ノードに属する」のような表現がたくさん出てきますが、すべて学習時の話です。max_depth(default=None)木の最大深さです。何も設定しないと伸び放題になります。min_samples_split(default=2)中間ノードに属するサンプル数がこの数字未満になったら、分割をやめます。デフォルトの2は「2つまでは分割する」と言っているので、制約がきついというか過学習しやすい設定です。min_samples_leaf(default=1)葉ノードに属するサンプル数がこの数を下回らないようにします。デフォルトの1は「分けられるだけ分ける」という方針です。上のmin_samples_splitとよく似ていますが、中間ノードに対してかかる制約なのか葉ノードにかかる制約なのかだけが違います。min_samples_leaf=20という設定だったとして、あるノードに39個のサンプルが入ってくるとそもそもそれ以上子を作れないことになります(そのノードが葉になる)。30]とかに分けてしまうとmin_samples_leafの制約を満たさなくなるので、こちらも子を作れなくなってそのノードが葉になります。min_weight_fraction_leaf(default=0.0)あまり使用例を見ないのと、ドキュメントの説明が判然としない部分がありますが、基本的にはノードにサンプルをいくつ残すのかを比率で指定できるはずです(全サンプル数1000のとき0.1と指定すれば10以上)。fitの際にsample_weightを渡すとそれに基づいて比率を決めてくれる機能もあります。min_impurity_decrease(default=0.0)これ以上不純度が上昇すれば、という条件を指定できます。max_leaf_nodes葉ノードの数。min_samples_leafあたりでしょう。他は少し使いづらい気がします。この中で、max_depthはデータによってどれくらいの深さが適当なのか予想しづらいので、少し使いづらい印象があります。min_samples_splitとmin_samples_leafはわかりやすいのと、過学習対策としては木の深さを制限するよりは理にかなっている気がするので、個人的には好んで使います。documentation実験ということで、上であげた直感的にわかりやすいパラメータをいじりながら少し回してみました。例によって2次元の2クラス分類です。コードはお世辞にも見やすいとは言えないので、流し読みで構いません。結果の図を下に示しているので、そちらを御覧ください。main()result.pngこんな感じで、どの方法を使ってもだいたい同じような結果が得られます(雑な結論)。どれくらいが良いのか定量的なことは言えませんし、サンプルサイズによっても変わりますが、総サンプル数の1%程度をmin_samples_leafに指定するのが良さげな気がします。決定木系はもともとモデルの表現力がいまいちなので、あまり過学習対策を効かせても表現力が落ちて性能に結びつかない感触があります。まとめまあ、いろいろな方法でできます、という程度です。回帰の場合こちらの記事も御覧ください。このブログについてスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。