catboost:kaggle參數設置參考

  • 2020 年 4 月 28 日
  • AI

我是一個懶人,很不喜歡調參,比賽的超參數也基本是開源的kernel里直接借用的,但是長期下來發現了很多有意思的事情,那就是存在一些所謂「祖傳」的超參,意思就是,直接使用這些超參數組合,然後人工針對擬合情況對個別超參數進行微調就可以達到很不錯的模型結果,避免了前期把太多時間浪費在參數的調節,到最後實在沒啥可做的時候再花時間調參。

所以這裡總結一下kaggle中各路豪傑使用過的catboost參數組合作為參考:(xgb和lgb的也有,感興趣的可以自己搜索看看,我有,不給)

catboost:

//www.kaggle.com/kyakovlev/ieee-catboost-baseline-with-groupkfold-cvwww.kaggle.com

########################### Model params
cat_params = {
                'n_estimators':5000,
                'learning_rate': 0.07,
                'eval_metric':'AUC',
                'loss_function':'Logloss',
                'random_seed':SEED,
                'metric_period':500,
                'od_wait':500,
                'task_type':'GPU',
                'depth': 8,
                #'colsample_bylevel':0.7,
                } 

//www.kaggle.com/youwbpyr/ieee-cbt-9600-lb-solution?scriptVersionId=21484729www.kaggle.com

  cbt_model = cbt.CatBoostClassifier(iterations=10000,learning_rate=0.1,max_depth=7,verbose=100,
                                      early_stopping_rounds=500,task_type='GPU',eval_metric='AUC',
                                      cat_features=cat_list)

//www.kaggle.com/seesee/concise-catboost-starter-ensemble-plb-0-06435www.kaggle.com

    model = CatBoostRegressor(
        iterations=200, learning_rate=0.03,
        depth=6, l2_leaf_reg=3,
        loss_function='MAE',
        eval_metric='MAE',
        random_seed=i)

//www.kaggle.com/wakamezake/starter-code-catboost-baselinewww.kaggle.com

model = CatBoostClassifier(loss_function="Logloss",
                           eval_metric="AUC",
                           task_type="GPU",
                           learning_rate=0.01,
                           iterations=10000,
                           random_seed=42,
                           od_type="Iter",
                           depth=10,
                           early_stopping_rounds=500
                          )

//www.kaggle.com/nicapotato/simple-catboostwww.kaggle.com

cb_model = CatBoostRegressor(iterations=700,
                             learning_rate=0.02,
                             depth=12,
                             eval_metric='RMSE',
                             random_seed = 23,
                             bagging_temperature = 0.2,
                             od_type='Iter',
                             metric_period = 75,
                             od_wait=100)

//www.kaggle.com/braquino/catboost-some-more-featureswww.kaggle.com

def make_classifier(iterations=6000):
    clf = CatBoostClassifier(
                               loss_function='MultiClass',
                                eval_metric="WKappa",
                               task_type="CPU",
                               #learning_rate=0.01,
                               iterations=iterations,
                               od_type="Iter",
                                #depth=4,
                               early_stopping_rounds=500,
                                #l2_leaf_reg=10,
                                #border_count=96,
                               random_seed=42,
                                #use_best_model=use_best_model
                              )
        
    return clf

//www.kaggle.com/zxspectrum/catboost-gpuwww.kaggle.com

model = CatBoostClassifier(loss_function="Logloss",
                           eval_metric="AUC",
                           task_type="GPU",
                           learning_rate=0.01,
                           iterations=70000,
                           l2_leaf_reg=50,
                           random_seed=432013,
                           od_type="Iter",
                           depth=5,
                           early_stopping_rounds=15000,
                           border_count=64
                           #has_time= True 
                          )

對於gbdt的調參,一點建議,tree的數量通過earlystopping的功能來決定即可,對於整個gbdt模型的影響最大的參數,一個是tree的數量,一個是max_depth深度,一個是行列取樣的比例,可以說是立竿見影的影響交叉驗證的結果,其實用多了gbdt會發現很多超參數的設置對於最終模型效果的影響比較類似,有的參數稍微調整一點就變化很大,有的參數怎麼調整變化都不太大,目前我的方法基本是tree用早停決定,max_depth設置為-1,靈活調整行列取樣比例。關於max depth的問題,對於lightgbm來說,我在很多數據集熵發現max_depth如果設置為-1,雖然會導致訓練集和測試集的訓練指標差異較大也就是過擬合,但是這樣得到的交叉驗證結果往往是最好的,而對max depth的深度進行限制之後確實可以有效緩解過擬合的問題,但是交叉驗證的結果往往變差了。也就是所謂的「我們一定要解決過擬合問題嗎」,使用一些超參數的方式約束模型的過擬合程度實際上也可能限制了模型對數據的學習能力,因此,還是得根據實際的情況來是靈活使用,用腦編程。