首页 > 技术文章 > catboost原理以及Python代码

dudumiaomiao 2018-09-23 20:41 原文

原论文:

   http://learningsys.org/nips17/assets/papers/paper_11.pdf

catboost原理:

One-hot编码可以在预处理阶段或在训练期间完成。后者对于训练时间而言能更有效地执行,并在Catboost中执行。

类别特征:

为了减少过拟合以及使用整个数据集进行训练,Catboost使用更有效的策略。

1、对输入的观察值的集合进行随机排列,生成多个随机排列;

2、给定一个序列,对于每个例子,对于相同类别的例子我们计算平均样本值;

3、使用如下公式将所有的分类特征值转换为数值:

,那么可以代替为  

在这里,我们还增加了先验值P和参数a>0,即为先验的权重。添加先验是一种常见的做法,它有助于减少从低频类别获得的噪声。

特征组合:

在数据集中,组合的数量随类别特征个数成指数型增长,在算法中不太可能考虑所有。在当前树考虑新的拆分时,Catboost以贪婪的方式考虑组合。

1、 第一次分裂不考虑任何组合在树上;

2、 对于下一次分类,在有所有类别特征的数据集的当前树,Catboost包含了所有的组合和分类特征。组合值即被转换为数字;

3、 Catboost还以以下方式生成数值和类别特征的组合:在树中选择的所有分裂视为具有两个值的类别,并在组合中也类似使用。

python代码:

import catboost

model = CatBoostClassifier(iterations=17000,

#                              depth = 6,

                               learning_rate = 0.03,

                               custom_loss='AUC',

                               eval_metric='AUC',

                               bagging_temperature=0.83,

                               od_type='Iter',

                               rsm = 0.78,

                               od_wait=150,

                               metric_period = 400,

                               l2_leaf_reg = 5,

                               thread_count = 20,

                               random_seed = 967

                              )

            model.fit(tr_x, tr_y, eval_set=(te_x, te_y),use_best_model=True)

            pre= model.predict_proba(te_x)[:,1].reshape((te_x.shape[0],1))

            train[test_index]=pre

            test_pre[i, :]= model.predict_proba(test_x)[:,1].reshape((test_x.shape[0],1))

            print (roc_auc_score(te_y, pre))

            cv_scores.append(roc_auc_score(te_y, pre))

 

推荐阅读