Skip to content

Instantly share code, notes, and snippets.

@GINK03
Last active July 23, 2017 15:44
Show Gist options
  • Save GINK03/750dc3390de098146d5d5ae59a1ea3a9 to your computer and use it in GitHub Desktop.
Save GINK03/750dc3390de098146d5d5ae59a1ea3a9 to your computer and use it in GitHub Desktop.
yandex catboost

catboost

RussiaのGoogleと呼ばれるYandex社から、catboostと呼ばれる勾配ブースティングが発表されました
勾配ブースティングはかなり強力な、機械学習アルゴリズムで、XGBoost, LightGBMが有名です

これで、DMLC, Microsoft, Yandexというビッグプレイヤーが出てこの分野もいい感じに加熱してきました

インストールから実際に、学習するまでの様子を示していきます  

ダウンロード

$ git clone https://github.com/catboost/catboost

YMakeのインストールとビルド

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

必要ならば、リンク元のバイナリを保存しておいて、他のマシンでも使いまわした方が賢いです  

Python用のwheelのpackageを作る

$ 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での使い方

consoleでの使い方を示します
Pythonでの使い方は、公式のexampleが詳しいので、そちらに譲ります  

2値でloglossでやる時

  • 学習
./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

多分、これをシグモイド関数にかけることで、ノーマライズされていない値を取り出すことができる

CrossEntropy

  • マルチクラスでやってみる
./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
...

Option

depthについて

defaultでは6
integerで32まで取りうるが、[1:10]がオススメらしい

--depth {INT}

マルチコアCPUでやる

Ryzenとかなら16 ~ 32

-T {NUM}

RSM(Random Subspace Method)

一回のイテレーションでどの程度の素性を使うかのパーセンテージなのだけど、catboostでは1(100%)と大きい

--rsm {FLOAT}

metric

Overfitなどの検知をするオプション

--eval-metric {LOSSFUNC}

詳細オプション

色々見れるのでつけといた方がいいです

--verbose

iteration

何回iterationすうるか

--iterations {NUM}

overfit検知&終了

{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
@GINK03
Copy link
Author

GINK03 commented Jul 23, 2017

image

@GINK03
Copy link
Author

GINK03 commented Jul 23, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment