XGB算法梳理

参考链接:http://blog.itpub.net/31542119/viewspace-2199549/https://www.cnblogs.com/zhouxiaohui888/p/6008368.htmlhttps://blog.csdn.net/a819825294/article/details/51206410http://www.dehong.space/XGBoost

一、CART回归树

CART回归树是假设树为二叉树,通过不断将特征进行分裂。比如当前树结点是基于第j个特征值进行分裂的,设该特征值小于s的样本划分为左子树,大于s的样本划分为右子树。

而CART回归树实质上就是在该特征维度对样本空间进行划分,而这种空间划分的优化是一种NP难问题,因此,在决策树模型中是使用启发式方法解决。典型CART回归树产生的目标函数为:

因此,当我们为了求解最优的切分特征j和最优的切分点s,就转化为求解这么一个目标函数:

所以我们只要遍历所有特征的的所有切分点,就能找到最优的切分特征和切分点。最终得到一棵回归树。

二、算法原理

1)定义树的复杂度 
对于f的定义做一下细化,把树拆分成结构部分q叶子权重部分w。下图是一个具体的例子。结构函数q把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么。 

定义这个复杂度包含了一棵树里面节点的个数,以及每个树叶子节点上面输出分数的L2模平方。当然这不是唯一的一种定义方式,不过这一定义方式学习出的树效果一般都比较不错。下图还给出了复杂度计算的一个例子。 

注:方框部分在最终的模型公式中控制这部分的比重 
在这种新的定义下,我们可以把目标函数进行如下改写,其中I被定义为每个叶子上面样本集合 

  

 

这一个目标包含了TT个相互独立的单变量二次函数。我们可以定义

 

 

最终公式可以化简为

 

 

通过对求导等于0,可以得到

 

 

然后把最优解代入得到:

 

 

(2)打分函数计算示例

Obj代表了当我们指定一个树的结构的时候,我们在目标上面最多减少多少。我们可以把它叫做结构分数(structure score)

(3)枚举不同树结构的贪心法

贪心法:每一次尝试去对已有的叶子加入一个分割

 

 

对于每次扩展,我们还是要枚举所有可能的分割方案,如何高效地枚举所有的分割呢?我假设我们要枚举所有x < a 这样的条件,对于某个特定的分割a我们要计算a左边和右边的导数和。

 

 

我们可以发现对于所有的a,我们只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和GL和GR。然后用上面的公式计算每个分割方案的分数就可以了。

观察这个目标函数,大家会发现第二个值得注意的事情就是引入分割不一定会使得情况变好,因为我们有一个引入新叶子的惩罚项。优化这个目标对应了树的剪枝, 当引入的分割带来的增益小于一个阀值的时候,我们可以剪掉这个分割。大家可以发现,当我们正式地推导目标的时候,像计算分数和剪枝这样的策略都会自然地出现,而不再是一种因为heuristic(启发式)而进行的操作了。

三、损失函数

(1)损失函数

(2)grad、hess推导

四、分裂节点算法

五、正则化

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合。

六、对缺失值处理

对缺失值的处理。对于特征的值有缺失的样本,XGBoost内置处理缺失值的规则,可以自动学习出它的分裂方向。

七、优缺点

1.高度灵活性

传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

2.正则化

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

3.Shrinkage(缩减)

相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。

4.剪枝

当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法。XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂。 这种做法的优点,当一个负损失(如-2)后面有个正损失(如+10)的时候,就显现出来了。GBM会在-2处停下来,因为它遇到了一个负值。但是XGBoost会继续分裂,然后发现这两个分裂综合起来会得到+8,因此会保留这两个分裂。

5.缺失值处理

对缺失值的处理。对于特征的值有缺失的样本,XGBoost内置处理缺失值的规则,可以自动学习出它的分裂方向。

6.并行操作

xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。

八、应用场景

 

九、sklearn参数

XGBoost的参数主要可以分为三大类:1.General parameters(通用参数);2.Booster parameters(booster参数);3.Learning Task parameters(学习目标参数)。

(一)通用参数:这些参数来控制XGBoost的宏观功能。

1. booster (默认gbtree)

选择每次迭代的模型,有两种选择:

  • gbtree(基于树的模型)
  • gbline(线性模型)

2. silent (默认0)

  • 当这个参数值为1时,静默模式开启,不会输出任何信息。
  • 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。

3. nthread (默认值为最大可能的线程数)

  • 这个参数用来进行多线程控制,应当输入系统的核数。
  • 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它。

(二) booster参数:

尽管有两种booster可供选择,这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到。

1. eta (默认0.3)

  • 和GBM中的 learning rate 参数类似。通过减少每一步的权重,可以提高模型的鲁棒性。
  • 典型值为0.01-0.2。

2. min_child_weight (默认1)

  • 决定最小叶子节点样本权重和。这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。
  • 但如果这个值过高,会导致欠拟合。这个参数需要用cv来调整。

3. max_depth (默认6)

  • 和GBM中的参数相同,这个值为树的最大深度。这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。
  • 需要使用CV函数来进行调优。典型值:3-10。

4. max_leaf_nodes

  • 树上最大的节点或叶子的数量。
  • 可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成n2个叶子。如果定义了这个参数,GBM会忽略max_depth参数。

5. gamma (默认0)

  • 在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。
  • 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。

6. max_delta_step (默认0)

  • 这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
  • 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。这个参数一般用不到,但是你可以挖掘出来它更多的用处。

7. subsample (默认1)

  • 和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
  • 典型值:0.5-1。

8. colsample_bytree (默认1)

  • 和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。
  • 典型值:0.5-1。

9. colsample_bylevel (默认1)

  • 用来控制树的每一级的每一次分裂,对列数的采样的占比。
  • 一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。

10. lambda (默认1)

  • 权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。
  • 虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

11. alpha (默认1)

  • 权重的L1正则化项。(和Lasso regression类似)。
  • 可以应用在很高维度的情况下,使得算法的速度更快。

12. scale_pos_weight (默认1)

  • 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。

(三) 学习目标参数: 这些参数用来控制理想的优化目标和每一步结果的度量方法。

1. objective (默认reg:linear) 这个参数定义需要被最小化的损失函数。最常用的值有:

  • binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。
  • multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。 在这种情况下,你还需要多设一个参数:num_class(类别数目)。
  • multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。

2. eval_metric (默认值取决于objective参数的取值)

  • 对于有效数据的度量方法。
  • 对于回归问题,默认值是rmse,对于分类问题,默认值是error。
  • 典型值有: rmse 均方根误差(∑Ni=1ϵ2N−−−−−√)
    mae 平均绝对误差(∑Ni=1|ϵ|N)
    logloss 负对数似然函数值
    error 二分类错误率(阈值为0.5)
    merror 多分类错误率
    mlogloss 多分类logloss损失函数
    auc 曲线下面积

3. seed (默认0)

  • 随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值