机器学习之从gbdt到xgboost

GBDT中每一个树拟合的是残差负梯度

相关参考:https://www.zhihu.com/question/63560633

 

 

一、GBDT

    1.GBDT相关原理详细讲解

1.GBDT算法原理以及实例理解

https://blog.csdn.net/zpalyq110/article/details/79527653(必看)

Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial

2.机器学习 【 GBDT算法】 实例推导计算+详细过程 (入门必备)

https://blog.csdn.net/weixin_41194171/article/details/85042720

3.GBDT原理解析:为什么说GBDT是拟合残差的梯度下降算法

https://blog.csdn.net/nickzzzhu/article/details/81539138

4.简单易学的机器学习算法——梯度提升决策树GBDT

https://blog.csdn.net/google19890102/article/details/51746402/

      2. GBDT其他零散笔记

           

        

      如上公式中是p步长,而h(x;am)是第m颗树的预测值---梯度方向。我们可以在函数空间上形式使用梯度下降法求解,首先固定x,对F(x)求其最优解。下面给出框架流程和Logloss下的推导,框架流程如下:

Logloss损失函数下的具体推导:

       

(GBDT预测值到输出概率[0,1]时需要sigmoid转换)

      下面,我们需要首先求解F0,然后再求解每个梯度。

       Step 1. 首先求解初始值F0,令其偏导为0。(实现时是第1颗树需要拟合的残差)

       

        Step2. 估计g_m(x),并用决策树对其进行拟合。g_m(x)是梯度,实现时是第m颗树需要拟合的残差:

             

       Step3.  使用牛顿法求解下降方向步长。r_jm是拟合的步长,实现时是每棵树的预测值:

         

       Step4. 预测时就很简单啦,把每棵树的预测值乘以缩放因子加到一起就得到预测值啦:

         

       注意如果需要输出的区间在(0,1)之间,我们还需要使用sigmoid进行转换

      3. 优缺点

        GBDT的优点当然很明显啦,它的非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换。

        GBDT的缺点也很明显,Boost是一个串行过程,不好并行化,而且计算复杂度高,同时不太适合高维洗漱特征。

      4.GBDT的 sklearn函数接口

       在sk-learn中,GradientBoostingClassifier为GBDT的分类类,GradientBoostingRegressor为GBDT的回归类,两者的参数类型相同,我们把参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器(Cart树)的重要参数。 
       Boosting框架的参数: 
1. n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑 
2. learning_rate: 即每个弱学习器的权重缩减系数,也称作步长。对于同样的训练集拟合效果,较小的学习率意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的学习率开始调参,默认是0.1。 
3. subsample:无放回采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。 
4. Init: 即我们的初始化的时候的弱学习器,如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。 
5. loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。对于分类模型,有对数似然损失函数”deviance”和指数损失函数”exponential”两者输入选择。默认是对数似然损失函数”deviance”。一般来说,推荐使用默认的”deviance”。它对二元分离和多元分类各自都有比较好的优化。 
6. alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失”huber”和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。 
      弱分类器参数: 
1. max_features: 划分时考虑的最大特征数, 可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log_2N个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑sqrt{N}个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比N)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。 
2. max_depth:控制决策树最大深度,默认不输入,一般来说,数据少或者特征少的时候不用考虑。如果模型样本量多,特征也多的情况下,推荐限制最大深度,常用的取值10-100之间。假设树的深度为N,树为完全二叉树,则树有2**N个叶子节点。 
3. min_samples_leaf:叶子节点最少样本数,这个值限制了叶子结点最少的样本数,如果叶子节点数目小于该值,则会和兄弟节点一起被剪枝,默认是1,可以输入最少的样本数的证书,或者最少样本数占样本总数的百分比,如果样本量不大,则不需要考虑这个值,如果样本数据集非常大,则推荐增大这和值。 
4. min_samples_split:内部节点再划分所需最小样本数,这个值限制了子树继续划分的条件,如果某节点的样本数少于,min_saples_split,则不会继续再尝试最优特征来进行划分。默认是2.如果样本数量不大,不需要考虑该值。 
5. min_weight_fraction_leaf:叶子节点最小的样本权重,这个值限制了叶子节点所有样本权重和的最小值,若果小于这个值,就会和兄弟节点一起呗剪枝,默认是0,即不考虑权重问题,一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值。 
6. max_leaf_nodes;最大叶子节点数,通过限制最大叶子结点数,可以防止过拟合,默认是None,即不限制。如果加了限制,算法就会建议在最大叶子节点数内最优的决策树。如果特征不多,不用考虑这个值,但是特征分成多的话,可以通过交叉验证获得该值。 
7. min_impurity_split:节点划分最小不纯度,这个值限制了决策树的增长,如果节点的不纯度(基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,即为叶子节点,默认值1e-7。

二、Xgboost

      1. xgboost原理

      XGBoost原理与应用:https://blog.csdn.net/q383700092/article/details/60954996(必看,讲解的非常详细,包括原理和公式讲解)   

      2. XGBoost中参数调整的完整指南(包含Python中的代码)

      https://www.cnblogs.com/roygood/p/10417683.html

      3.xgboost其他笔记

       xgboost是boosting Tree的一个很牛的实现,它在最近Kaggle比赛中大放异彩。它 有以下几个优良的特性:

            1. 显示的把树模型复杂度作为正则项加到优化目标中。

            2. 公式推导中用到了二阶导数,用了二阶泰勒展开。(GBDT用牛顿法貌似也是二阶信息)

            3. 实现了分裂点寻找近似算法。

            4. 利用了特征的稀疏性。

            5. 数据事先排序并且以block形式存储,有利于并行计算。

            6. 基于分布式通信框架rabit,可以运行在MPI和yarn上。(最新已经不基于rabit了)

            7. 实现做了面向体系结构的优化,针对cache和内存做了性能优化。

      在项目实测中使用发现,Xgboost的训练速度要远远快于传统的GBDT实现,10倍量级。

      1. 原理

            在有监督学习中,我们通常会构造一个目标函数和一个预测函数,使用训练样本对目标函数最小化学习到相关的参数,然后用预测函数和训练样本得到的参数来对未知的样本进行分类的标注或者数值的预测。一般目标函数是如下形式的,我们通过对目标函数最小化,求解模型参数。预测函数、损失函数、正则化因子在不同模型下是各不相同的。

           其中预测函数有如下几种形式:

            1. 普通预测函数

                a. 线性下我们的预测函数为

                b. 逻辑回归下我们的预测函数为

            2. 损失函数:

                a. 平方损失函数:

                b. Logistic损失函数:

            3. 正则化:

                a. L1  参数求和

                b. L2  参数平方求和

            其实我个人感觉Boosting  Tree的求解方式和以上略有不同,Boosting Tree由于是回归树,一般是构造树来拟合残差,而不是最小化损失函数。且看GBDT情况下我们的预测函数为:

             而Xgboost引入了二阶导来进行求解,并且引入了节点的数目、参数的L2正则来评估模型的复杂度。那么Xgboost是如何构造和预测的呢?

             首先我们给出结果,Xgboost的预测函数为:

               

     而目标函数为:

           那么作者是如何构思得到这些预测函数和优化目标的呢?它们又如何求解得到的呢? 答案是作者巧妙的利用了泰勒二阶展开和巧妙的定义了正则项,用求解到的数值作为树的预测值。

               我们定义正则化项:

                        

               可以得到目标函数转化为:

                       

                然后就可以求解得到:

               同样在分裂点选择的时候也,以目标函数最小化为目标。

                          

      2. xgboost相关参数

General Parameters(常规参数) 
1.booster [default=gbtree]:选择基分类器,gbtree: tree-based models/gblinear: linear models 
2.silent [default=0]:设置成1则没有运行信息输出,最好是设置为0. 
3.nthread [default to maximum number of threads available if not set]:线程数

Booster Parameters(模型参数) 
1.eta [default=0.3]:shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。 
2.min_child_weight [default=1]:这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。 
3.max_depth [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。 
4.max_leaf_nodes:最大叶结点数,与max_depth作用有点重合。 
5.gamma [default=0]:后剪枝时,用于控制是否后剪枝的参数。 
6.max_delta_step [default=0]:这个参数在更新步骤中起作用,如果取0表示没有约束,如果取正值则使得更新步骤更加保守。可以防止做太大的更新步子,使更新更加平缓。 
7.subsample [default=1]:样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。 
8.colsample_bytree [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1 
9.lambda [default=1]:控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。 
10.alpha [default=0]:控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。 
11.scale_pos_weight [default=1]:如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。

Learning Task Parameters(学习任务参数) 
1.objective [default=reg:linear]:定义最小化损失函数类型,常用参数: 
binary:logistic –logistic regression for binary classification, returns predicted probability (not class) 
multi:softmax –multiclass classification using the softmax objective, returns predicted class (not probabilities) 
you also need to set an additional num_class (number of classes) parameter defining the number of unique classes 
multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class. 
2.eval_metric [ default according to objective ]: 
The metric to be used for validation data. 
The default values are rmse for regression and error for classification. 
Typical values are: 
rmse – root mean square error 
mae – mean absolute error 
logloss – negative log-likelihood 
error – Binary classification error rate (0.5 threshold) 
merror – Multiclass classification error rate 
mlogloss – Multiclass logloss 
auc: Area under the curve 
3.seed [default=0]: 
The random number seed. 随机种子,用于产生可复现的结果 
Can be used for generating reproducible results and also for parameter tuning.

注意: python sklearn style参数名会有所变化 
eta –> learning_rate 
lambda –> reg_lambda 
alpha –> reg_alpha

 

参考文献:

     1. xgboost导读和实践:http://vdisk.weibo.com/s/vlQWp3erG2yo/1431658679

     2. GBDT(MART) 迭代决策树入门教程: http://blog.csdn.net/w28971023/article/details/8240756

     3. Introduction to Boosted Trees : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf

     4. xgboost: https://github.com/dmlc/xgboost

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值