文章目录
一、知识点总结
1. xgboost与GBDT的区别:
(1)xgboos相比GBDT的优点
(1)精度更高:GBDT只用到一阶泰勒, 而xgboost对损失函数进行了二阶泰勒展开, 一方面为了增加精度, 另一方面也为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数。
(2)灵活性更强:GBDT以CART作为基分类器,而Xgboost不仅支持CART,还支持线性分类器,另外,Xgboost支持自定义损失函数,只要损失函数有一二阶导数。
(3)正则化:xgboost在目标函数中加入了正则,用于控制模型的复杂度。有助于降低模型方差,防止过拟合。正则项里包含了树的叶子节点个数,叶子节点权重的L2范式。
(4)Shrinkage(缩减):相当于学习速率。这个主要是为了削弱每棵树的影响,让后面有更大的学习空间,学习过程更加的平缓
(5)列抽样:这个就是在建树的时候,不用遍历所有的特征了,可以进行抽样,一方面简化了计算,另一方面也有助于降低过拟合
(6)缺失值处理:这个是xgboost的稀疏感知算法,加快了节点分裂的速度
(7)并行化操作:块结构可以很好的支持并行计算
(2)xgboost相比GBDT的缺点:
- 时间复杂度高:虽然利用了预排序和近似算法可以降低寻找最优分裂点的计算量,但在节点分裂过程中仍需要遍历整个数据集。
- 空间复杂度高:预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本梯度统计值的索引,相当于消耗了两倍的内存。
2. 应该在哪个特征的哪个点上进行分裂?
(1)基本思想——最优切分点算法:
如何建立一颗树呢?XGBoost采用二叉树, 用了贪心策略。在开始的时候, 全部样本在一个叶子节点上, 然后叶子节点不断通过二分裂,逐渐生成一棵树。
- 从深度为 0 的树开始,对每个叶节点枚举所有的可用特征;
- 针对每个特征,把属于该节点的训练样本根据该特征值进行升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的分裂收益;(这个过程每个特征的收益计算是可以并行计算的)
- 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,在该节点上分裂出左右两个新的叶节点,并为每个新节点关联对应的样本集
- 回到第 1 步,递归执行到满足特定条件为止
(2)优化划分方式——基于分桶的划分策略
近似分割的方式(可以理解为分割点分桶的思路),选出一些**候选的分裂点,然后再遍历这些较少的分裂点来找到最佳分裂点。**作者这里采用了一种对loss的影响权重的等值percentiles(百分比分位数)划分算法(Weight Quantile Sketch)。也就是说,进行候选点选取的时候,考虑的是想让loss在左右子树上分布的均匀一些,而不是样本数量的均匀。
3. 怎样避免过拟合?
(1)正则化
xgboost在GBDT的基础上,在损失函数加入正则化部分,并且每一轮迭代对损失函数做二阶泰勒展开,加快对损失函数的优化速度。
Tt:叶子节点数,wj:叶子上的节点权重,r,lamba是超参数。当正则化为零时,目标回归到传统的梯度提升树GBDT。正则化控制叶子结点的个数和叶子结点的权重,起到了抑制模型复杂度的作用,从而避免了过拟合。
XGBoost的目标(损失)函数可以表示为:
(2)Shrinkage
每次走一小步逼近最优值,比每次迈一大步很快逼近结果的方式更容易避免过拟合。因为这个过程不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。
原来的弱学习器迭代:
由于Shrinkage思想的加入,变成了:
(3)特征采样和样本采样
XGBoost借鉴RF的思想,对特征和特征进行采样以达到降低过拟合的目的,根据用户反馈,特征采样比起样本采样效果更优(特征采样率:[0.5,0.8])。当然,XGBoost同时支持以上两种降低过拟合的采样方式。
(4)Early Stopping
对于每一次分离后的增益,在sklearn接口当中,如果G a i n GainGain出现负值,则提前停止;但是,被提前终止掉的分裂可能其后续的分裂会带来好处。在XBGoost原生接口当中是采用过后剪枝策略:将树分裂到最大深度,然后再基于上述增益计算剪枝。在具体实现时,还有learning rate等其它参数一起控制,给G a i n GainGain出现负值的后续轮留机会。
4. 缺失值处理
尝试通过枚举所有缺失值在当前节点是进入左子树,还是进入右子树更优,来决定一个处理缺失值默认的方向,这样处理起来更加的灵活和合理。
二、代码调参
(一)重要参数
1、booster
用于指定弱学习器的类型,默认值为 ‘gbtree’,表示使用基于树的模型进行计算。还可以选择为 ‘gblinear’ 表示使用线性模型作为弱学习器。
推荐设置为 ‘gbtree’,本文后面的相关参数设置都以booster设置为’gbtree’为前提。
2、eta / learning_rate
如果你看了我之前发的XGBoost算法的相关知识,不难发现XGBoost为了防止过拟合,引入了"Shrinkage"的思想,即不完全信任每个弱学习器学到的残差值。为此需要给每个弱学习器拟合的残差值都乘上取值范围在(0, 1] 的 eta,设置较小的 eta 就可以多学习几个弱学习器来弥补不足的残差。
在XGBClassifier与XGBRegressor中,对应参数名为 learning_rate。
推荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]
3、gamma
指定叶节点进行分支所需的损失减少的最小值,默认值为0。设置的值越大,模型就越保守。
**推荐的候选值为:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1] **
4、alpha / reg_alpha
L1正则化权重项,增加此值将使模型更加保守。
在XGBClassifier与XGBRegressor中,对应参数名为 reg_alpha 。
推荐的候选值为:[0, 0.01~0.1, 1]
5、lambda / reg_lambda
L2正则化权重项,增加此值将使模型更加保守。
在XGBClassifier与XGBRegressor中,对应参数名为 reg_lambda。
推荐的候选值为:[0