66
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CatBoostのチューニングについてまとめ(ただの訳)

Posted at

CatBoostとは

勾配ブースティング木モデルの1種

公式の訳+αを備忘録的にまとめる。

CatBoostモデルのチューニング

One-hot-encoding

前処理の段階ではやるなというのが公式の指示。何よりも先に説明するあたり重要そうだ。
categorical featuresについては、ちゃんと設定しないとよいスコアがないらしいい
参照:https://towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db

一意の値が”one_hot_max_size”で設定したint以下の特徴量についてone-hot-encodingを適用する。デフォルト値は2

Number of trees

 他のパラメータを調整する前に優先して設定する。反復回数を大きな値に設定しつつ、オーバーフィット検出器パラメータを使用し、最良のモデルオプションをオンにして検証する。

  • iterations : まず大きな数を設定しておく。
  • use_best_model : Trueにしておく。評価用のeval_setがfitのパラメータとして必要になる。
  • eval_metric : overfitting detection と use_bset_modelで使用する評価指標。41種
  • od_type : IncToDecIter または Iterを設定
  • od_pval : IncToDeclterの場合に使用するしきい値。10^-10~10^-2が推奨されている。値が大きいほど、過学習が早期に予防される。デフォルトは0
  • od_wait : 最適な指標値に達した後、iterationを続ける数。IncToDeclterの場合、しきい値を無視して指定回数を続ける。fitしたあと、model.tree_count_で最適な木の数がわかる。

たとえば以下のようになるか。

import catboost

mod = catboost.CatBoostClassifier(iterations=5000,

                                  calc_feature_importance = True,

                                  use_best_model=True,

                                  eval_metric = 'Accuracy' )

mod.fit(X_train, y_train,

        cat_features=categorical_features_indices,

        eval_set=(X_validation, y_validation),

        plot=True)

print(mod.tree_count_)

 

learning_rate (float)

デフォルトは自動または0.03となる。

検証方法:

  • 最後のiterationに過学習がない → Learning rateを上げる。
  • 過学習している → Learning rate を下げる。

 

色々試す必要があるもの

depth (int)

4~10が最適になることが多い。おすすめは6~10

l2_leaf_reg (int)

正則化係数。正の値のみ。これを使用するとlearning_rateが自動設定ではなくなる。

random_strength (float)

木構造を構築する際、どのような分割したらコスト関数をより改善するかスコアを計算することになるが、そのスコアに加える正規分布確率変数(平均0)の標準偏差乗数。過学習対策に利用できる。(アンサンブルされる木構造のランダム性があがるため?)。デフォルトは1

bagging_temperature (float)

ベイジアンブートストラップを使用すると(デフォルト)、訓練データをサンプリングする際にランダムな重みを割り当てることができる。bagging_temperatureのパラメータの値が「1」に設定されている場合、重みは指数分布からサンプリングされる。このパラメータの値が "0"に設定されている場合、すべての重みは1に等しくなる。パラメータは0~infの範囲で設定する。大きいほどbaggingが積極的になる。

 

has_time (bool)

時系列など、データセットに順序がある場合に使用する。

オーバーフィット検出器

オーバーフィットが発生した場合、CatBoostはトレーニングパラメータよりも早くトレーニングを停止することができる。IncToDecとIterの2つのタイプがある。

IncToDec

改善率CurrentPValueが設定した閾値を下回ったとき、トレーニングを停止する。
CurrentPValuenの計算式はよくわからない……。

Iter

指標最大値を得た後、更新までのイテレーション回数の猶予

 

トレーニングの可視化

plot=trueをパラメータにセットする。独自のビュアーやTensorBoardが使用できるほか、

jupyter notebookで使用する場合、拡張パッケージが必要

pip install ipywidgets

jupyter nbextension enable --py widgetsnbextension

jupyter labについては別の方法でipywidgetsを適用させる必要がある。

jupyter labextension install @jupyter-widgets/jupyterlab-manager

が、それでも手元ではプロットされない(断念)。

まとめ

  • まず、デフォルトのパラメータでモデルを訓練してみる。plotや自前のlearning_curveで確認しつつ、tree_count_でNumber of treesを決定。過学習の傾向があれば、learning_rateの調整へ。
  • 交差検証+検証曲線で汎化性能をチェックしながら。learning_rateを上げたり下げたり。
  • 残りのパラメータをRandomsearchやHyperoptなどでまとめて調整。

ref

66
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?