RussiaのGoogleと呼ばれるYandex社から、catboostと呼ばれる勾配ブースティングが発表されました
勾配ブースティングはかなり強力な、機械学習アルゴリズムで、XGBoost, LightGBMが有名です
インストールから実際に、学習するまでの様子を示していきます
$ git clone https://github.com/catboost/catboost
YMakeと呼ばれる、Yandexが開発したビルド環境でビルドする必要があり、yaコマンドを実行することで自動的にインストールされますが、サーバがロシアにあるのか激重です
時間が十分にあるときにやるといいかもしれません
$ cd catboost/catboost/app
$ ../../ya make -r -j16 (<-このコマンドで、YMakeがインストールされます)
すると、catboostという実行可能なバイナリができますが、これはリンクであり実体ではありません
$ ls -alht catboost
lrwxrwxrwx 1 user user 71 7月 24 00:15 catboost -> /home/user/.ya/build/symres/4bba8343862dafeb1179b5ac8c5ada37/catboost
必要ならば、リンク元のバイナリを保存しておいて、他のマシンでも使いまわした方が賢いです
$ cd catboost/python-package
wheelをビルド
$ python3 mk_wheel.py
wheelのインストール
$ python3 -m pip install ./catboost-0.1.1.5-cp35-none-manylinux1_x86_64.whl
2017/07/21現在、Python3では、文字列を引数に渡し処理する際に、utf8 <-> bytesの変換がcythonの中身で失敗しているようで、チュートリアル通りやってもうまくいかないものがあります
文字をbytes型で定義することで一部は回避できますが、十分ではありません
>>> "alice-bob-charile" # ダメな場合がある
'alice-bob-charile'
>>> b"alice-bob-charile" # 行ける時がある
b'alice-bob-charile'
そのうち直るのをゆっくり待って見たいと思います
consoleでの使い方を示します
Pythonでの使い方は、公式のexampleが詳しいので、そちらに譲ります
- 学習
./catboost fit --learn-set {train.txt} --test-set {test.txt} --loss-function Logloss
- 予想
./catboost calc -m model.bin --input-path {test.txt} -o out.txt --prediction-type Probability
- 学習
./catboost fit --learn-set {train.txt} --test-set {test.txt} --loss-function MultiClass
- 予想(Probability)
./catboost calc -m model.bin --input-path {test.txt} -o out.txt --prediction-type Probability
- 予想した時のフォーマット(SoftMaxぽい)
0.0764710339 0.8184620593 0.04472625396 0.06034065281
0.1073033709 0.7722927387 0.06731940903 0.05308448136
0.06251615167 0.04445742958 0.8151422363 0.07788418243
0.0434378044 0.83882107 0.06233469617 0.05540642941
- 予想(RawFormatData)
-0.3993144196 1.971200595 -0.9356657809 -0.6362203944
-0.2009291755 1.772774433 -0.6671406496 -0.9047046079
-0.6117106865 -0.952603544 1.956226984 -0.391912754
-0.8913052144 2.069362072 -0.5301171538 -0.6479397042
多分、これをシグモイド関数にかけることで、ノーマライズされていない値を取り出すことができる
- マルチクラスでやってみる
./catboost fit --learn-set {train.txt} --test-set {test.txt} --loss-function CrossEntropy
結果(ダメっぽい)
0.9979542287
0.9992597065
0.9785520258
...
- CrossEntropyをバイナリーでやってみる 極端な値が出力されなくなっている
0.7195823957
0.1755157727
0.6131157384
...
defaultでは6
integerで32まで取りうるが、[1:10]がオススメらしい
--depth {INT}
Ryzenとかなら16 ~ 32
-T {NUM}
一回のイテレーションでどの程度の素性を使うかのパーセンテージなのだけど、catboostでは1(100%)と大きい
--rsm {FLOAT}
Overfitなどの検知をするオプション
--eval-metric {LOSSFUNC}
色々見れるのでつけといた方がいいです
--verbose
何回iterationすうるか
--iterations {NUM}
{FLOAT}の閾値以上のテストデータにおける改悪が、あったら停止
--auto-stop-pval {FLOAT}
データフォーマットは、lightgbm, xgboostで解析可能なlibsvm形式ではなくて、タブ区切りのフォーマットになっています
公式サイトを見ても、tab区切りであるという気持ちがよくわからなくて、 コードを見たりしていました
一番左が所属するクラスまたは値です 右側が説明変数です
2 0.3327 0.6769 0.1039 0.5183 0.8690 0.9757 0.6578 0.1164 0.8744 0.4942
1 0.5005 0.7650 0.1870 0.0075 0.8382 0.5829 0.6274 0.1380 0.8077 0.8349
0 0.9100 0.7651 0.5374 0.1220 0.6504 0.2899 0.4770 0.1075 0.5081 0.8941
3 0.4440 0.7735 0.5775 0.4822 0.1442 0.1967 0.5334 0.1002 0.4597 0.2226
1 0.2716 0.6426 0.0659 0.4127 0.4377 0.3117 0.6662 0.3851 0.1715 0.3204
2 0.9606 0.6350 0.3412 0.5861 0.9503 0.3935 0.1779 0.5046 0.8144 0.1555
https://user-images.githubusercontent.com/4949982/28500695-ae6cb4ca-7007-11e7-9067-28ce35db9388.png