【機械学習】Regularized Greedy Forest(RGF)で多クラス分類を試してみました
RGFとは
RGFはランダムフォレストや勾配ブースティングのように多数の決定木(Forest)を使った分類/回帰のための学習器です。
原著論文では多くのテストデータで勾配ブースティングを超えるとされています(ただし、xgboostではなくRのgbmパッケージが比較対象です)。実際、著者のチームはRGFでBond Trade Price Challengeなど複数コンペで優勝するなど華々しい成績を収めています。
RGF単体がベストなモデルでない場合もアンサンブルの部品として使われるのを見かけます。(例えば、https://github.com/ChenglongChen/Kaggle_CrowdFlower)
中身
RGFはブースティングの一種であり、イテレーションごとに弱学習機(=決定木)の枝を増やしたり、新たな決定木を生成したりして、精度を向上させます。
このとき各イテレーションの終わりに追加された決定木の重みのみを調整するのではなく、
今まで構築されていたすべての決定木の重みを動かして、学習用データに対しfittingを行います。これをGreedy(貪欲)な方法と表現しています。
ただし、Greedyなfittingは容易に過学習が起きてしまうので、正則化(Regularize)を行います。
正則化とは、各フィッティングパラメータがあまり自由に動きすぎないような損失関数を設定することです。
決定木群の正則化では各決定木の重みが重くなりすぎないように、重みが大きくなると損失関数が大きくなる項を追加します。
一般にL1、L2正則化が良く使われますが(こちらが詳しいです)、がRGFではL2が使われています。
以上をもって、Regularized(正則化された) Greedy(貪欲な) Forest(森=沢山の決定木)とよばれています。
対照的に、勾配ブースティングは学習率をさげることで過学習を防ぎますが、正則化項を学習につけくわえているわけではありません。
ただしxgboostは損失関数を二次まで展開することで、明示的な正則化を行っているとのこと。
インストール
実行ファイルの入手
まず本家からCode Archiveをクリックしてダウンロードしたzipを展開します。
Windows 64bitの場合→binディレクトリに既に実行ファイル(rgf.exe.file)があるので、rgf.exeにファイル名を変更します。
Linuxの場合→makefileが同梱されているので、makeします。
Windows 32bitの場合→Visual studio 2010で同梱されているproj_vc2010/rg.slnを開きます。
構成→リリースモード、Win32に変更します。
構成プロパティ – 全般 にある「プラットフォームツールセット」を適宜変更。
この状態でビルドを実行してください。
Visual studioじゃなくてgit-bashからgcc-makeしてもいけるかもしれません。
Perlのインストール
Linuxにはたいてい入ってます。WindowsはActive Perlをインストールするとか。
→いりませんでした(汗
Wrapperのインストール
Python向けはいくつか転がっていますが、いくつかパラメーターが設定できないので、拾い物をベースに自作しました。使いたい人は、↓
https://github.com/fukatani/rgf_python
git clone https://github.com/fukatani/rgf_python.git
python setup.py install
してください。
そしてインストール先のrgf/lib/rgf.pyを開いて、
## Edit this ##################################################
#Location of the RGF executable
loc_exec='C:\\Users\\Documents\\python\\rgf1.2\\bin\\rgf.exe'
loc_temp='temp/'
## End Edit
loc_exec変数を実際にrgf.exeが存在する場所に書き換えてください。あとはscikit learn風のインタフェースで使えます。
またオリジナルのrgfは2クラス分類と回帰しか対応していなかったので、One-vs-Rest方式で多クラス分類に対応しました。
多クラス分類に使ってみた
チューニングはかなりテキトーではありますが、irisデータ分類の正解率です。スクリプト全文はこちら。3foldで交差確認法をしています。
結果はこちら
分類器 | 正解率 |
---|---|
RGF Classfier | 0.9667 |
Gradient Boosting Classfier (scikit-learn) | 0.96 |
ちょっと勝ってるかしら…!もうちょっと難しい問題でやってみた方がいいかも
原著論文では無双してます。
手早くチューニングしたいとき
ハイパーパラメータのユーザーガイドが丁寧です。
手チューニングでささっとやりたいときは、私は以下のようにしてます。
1. loss : 回帰なら'LS'、分類なら'Log'??
2. max_leaf_node : 1000から数百刻みでヒルクライムします。ユーザーガイドには1000-10000とありますが、500位が最適なこともありました。
3. algorithm : 'RGF', 'RGF_Opt', 'RGF_Sib' をすべて試します。
4. l2 : 1, 0.1, 0.01から選びます。lossがLSでないときは1e-20や1e-30が最適なこともあるそうです。logspaceでサーチしましょう。
5. l2やalgorithmが動いたら最後にもう一度max_leaf_nodeをヒルクライムします。
というわけでRGF、よかったら使ってみましょう。