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などでまとめて調整。