集成学习2——XGBoost本身的特点,及XGB与GBDT、LGB、RF的区别于联系

XGB模型十分优秀,在很多大赛中表现很好,如果选出3个优秀的机器学习算法,XGB肯定能排上号。本部分将会总结XGB的众多关键点,同时对比其他相关的树模型,比如GBDT、LGB、RF等,理解了这些,拿下相关面试不在话下。

集成学习1——XGBoost
集成学习2——XGBoost本身的特点,及XGB与GBDT、LGB、RF的区别于联系


1,简要介绍XGB

介绍XGB之前先简单说下GBDT模型,GBDT模型是一种基于boosting思想的加法模型,训练的时候采用前向分布算法进行贪婪学习,每建立一棵决策树都会拟合前一棵决策树与目标值的残差。
XGBoot在GBDT基础上做了一些优化,比如二阶泰勒展开、正则化、缺失值处理、并行运算等,其基本思想没有太大变化。

2,XGB与GBDT的不同点

1)分类器:XGB可以支持线性分类器,GBDT只支持CART树
2)导数:对于loss函数,GBDT只用了一阶导数,XGB采用二阶泰勒展开,可以自定义损失函数。
3)正则化:XGB有正则项,相当于剪枝
4)列抽样:XGB与RF一样支持列抽样
5)缺失值:XGB可以自动处理缺失值,归入默认方向,或者两个方向择优
6)并行:树的维度是串行的,但是特征的维度是并行的,事先将特征按照大小排好,存储为块结构,选取分裂点时,多线程并行计算。

3, XGB为什么要泰勒展开?

1)精准:二阶泰勒展开更加逼近真实值。
2)可扩展:损失函数可以自定义,只要损失函数支持二阶可导,都可以作为损失函数。

4, XGB为什么可以并行?

XGB的并行并不是每棵树之间的并行,XGB是boosting的思想,每棵树训练要等前一棵树训练完成之后再训练。
XGB的并行指的特征维度的并行:在训练之前,每个特征按照特征值的大小排序,保存为block结构,可以重复使用,可以多线程对block操作。
在这里插入图片描述

5 XGB为什么快?

1)分块并行,特征值排序后保存在块结构中,每个节点选择最优分裂点时都可并行。
2)候选分位点,每个特征采用常数个分位点作为候选分位点。
3)CPU cache 命中优化: 使用缓存预取的方法,对每个线程分配一个连续的buffer,读取每个block中样本的梯度信息并存入连续的Buffer中。
4)Block 处理优化:Block预先放入内存;Block按列进行解压缩;将Block划分到不同硬盘来提高吞吐。

6 XGB防止过拟合的方法?

1)正则:叶子点个数,叶子点的l2正则
2)列抽样:部分特征
3)子采样:部分样本
4)shrinkage:按照一定的学习率或者步长来加权。

7 XGB如何处理缺失值?

1)选取分裂值时不会对缺失值操作,然后将缺失值分别放到左右两个子节点,选取增益最大的一个方向,作为预测时的默认方向。
2)如果训练时没有缺失,测试有缺失,自动划分到右侧。

8 叶子节点的权重如何计算?

XGB目标函数求导,求极值。

O b j ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + λ T Obj^{(t)} = \sum_{j=1}^T[G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2]+ \lambda T Obj(t)=j=1T[Gjwj+21(Hj+λ)wj2]+λT
w j ∗ = − G j H j + λ w_j^*=-\frac{G_j}{H_j+\lambda} wj=Hj+λGj
O b j = − 1 2 ∑ j = 1 T G j 2 H j + λ + λ T Obj = -\frac{1}{2}\sum_{j=1}^{T}\frac{G_j^2}{H_j + \lambda} + \lambda T Obj=21j=1THj+λGj2+λT

9, XGB中一棵树的停止生长条件?

1)节点分类增益低于某一阈值,比如0
2)达到最大深度
3)叶子节点的样本权重低于某一阈值。

10, RF和GBDT的区别?

相同点:
1)都是多棵树组成。
不同点:
2)集成学习:RF是bagging思想,GBDT是boosting思想
3)偏差方差:RF主在降低方差,GBDT主在降低偏差。
4)训练样本:RF每次训练会从样本集中进行有放回的样本抽样,GBDT每次用全部样本。
5)并行:RF每棵树会并行,GBDT不会
6)结果:RF多票表决,GBDT加权融合。
7)数据敏感性:RF对异常值不敏感,GBDT敏感
8)泛化能力:RF不易过拟合,GBDT容易过拟合。

11, XGB如何处理数据不平衡问题?

1)scale_pos_weight加权
2)如果你在意概率(预测得分的合理性),你不能重新平衡数据集(会破坏数据的真实分布),应该设置max_delta_step为一个有限数字来帮助收敛(基模型为LR时有效)
3)还可以通过上采样、下采样、SMOTE算法或者自定义代价函数的方式解决正负样本不平衡的问题。

12, 比较LR与GBDT,分别适用于那种场景?

区别:
LR是线性模型,简单易解释,容易并行,但是学习能力有限,需要大量人工特征。
GBDT是非线性模型,有天然的特征组合优势,表达能力强,但是不能并行。

高维稀疏场景中LR要比GBDT效果好:
高维稀疏容易过拟合,但是当有正则化时,LR对权值的惩罚远大于GBDT,因为LR是对特征系数的惩罚,GBDT是通过节点数量、树深度等进行惩罚,对于某个节点惩罚要小的多。

先看一个例子: 假设一个二分类问题,label为0和1,特征有100维,如果有1w个样本,但其中只要10个正样本1,而这些样本的特征
f1的值为全为1,而其余9990条样本的f1特征都为0(在高维稀疏的情况下这种情况很常见)。
我们都知道在这种情况下,树模型很容易优化出一个使用f1特征作为重要分裂节点的树,因为这个结点直接能够将训练数据划分的很好,但是当测试的时候,却会发现效果很差,因为这个特征f1只是刚好偶然间跟y拟合到了这个规律,这也是我们常说的过拟合。
那么这种情况下,如果采用LR的话,应该也会出现类似过拟合的情况呀:y = W1f1 + Wifi+….,其中
W1特别大以拟合这10个样本。为什么此时树模型就过拟合的更严重呢? 仔细想想发现,因为现在的模型普遍都会带着正则项,而 LR
等线性模型的正则项是对权重的惩罚,也就是 W1一旦过大,惩罚就会很大,进一步压缩
W1的值,使他不至于过大。但是,树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种
case,树只需要一个节点就可以完美分割9990和10个样本,一个结点,最终产生的惩罚项极其之小。

13, XGB如何进行剪枝?

1)正则化:用叶子节点的数目,或者叶子节点的权值加正则,控制树的负责度。
2)增益阈值:设置一定的节点分裂阈值,小到一定的阈值,停止分裂。
3)节点权重:节点小于一定的权重停止分裂。
4)XGBoost 先从顶到底建立树直到最大深度,再从底到顶反向检查是否有不满足分裂条件的结点,进行剪枝。

14, 如何选择最佳分裂节点?

XGBoost在训练前预先将特征按照特征值进行了排序,并存储为block结构,以后在结点分裂时可以重复使用该结构。
因此,可以采用特征并行的方法利用多个线程分别计算每个特征的最佳分割点,根据每次分裂后产生的增益,最终选择增益最大的那个特征的特征值作为最佳分裂点。如果在计算每个特征的最佳分割点时,对每个样本都进行遍历,计算复杂度会很大,这种全局扫描的方法并不适用大数据的场景。XGBoost还提供了一种直方图近似算法,对特征排序后仅选择常数个候选分裂位置作为候选分裂点,极大提升了结点分裂时的计算效率。

15, XGBoost的Scalable(延展性)性如何体现?

1)基础的分类器:可以是用cart也可以用linear、LR
2)目标函数:支持自定义
3)学习方法:支持并行

16, XGB如何评价特征重要性?

weight :该特征在所有树中被用作分割样本的特征的总次数。
gain :该特征在其出现过的所有树中产生的平均增益。
cover :该特征在其出现过的所有树中的平均覆盖范围。

17, XGB调优的一般步骤

首先需要初始化一些基本变量,例如:
max_depth = 5
min_child_weight = 1
gamma = 0
subsample, colsample_bytree = 0.8
scale_pos_weight = 1
(1) 确定learning rate和estimator的数量learning rate可以先用0.1,用cv来寻找最优的estimators
(2) max_depth和 min_child_weight
我们调整这两个参数是因为,这两个参数对输出结果的影响很大。我们首先将这两个参数设置为较大的数,然后通过迭代的方式不断修正,缩小范围。
max_depth,每棵子树的最大深度,check from range(3,10,2)。
min_child_weight,子节点的权重阈值,check from range(1,6,2)。
如果一个结点分裂后,它的所有子节点的权重之和都大于该阈值,该叶子节点才可以划分。
(3) gamma也称作最小划分损失min_split_loss,check from 0.1 to 0.5,指的是,对于一个叶子节点,当对它采取划分之后,损失函数的降低值的阈值。
如果大于该阈值,则该叶子节点值得继续划分
如果小于该阈值,则该叶子节点不值得继续划分
(4) subsample, colsample_bytree
subsample是对训练的采样比例
colsample_bytree是对特征的采样比例
both check from 0.6 to 0.9
(5) 正则化参数
alpha 是L1正则化系数,try 1e-5, 1e-2, 0.1, 1, 100
lambda 是L2正则化系数
(6) 降低学习率降低学习率的同时增加树的数量,通常最后设置学习率为0.01~0.1

18, XGB过拟合怎么办?

1)控制模型复杂度max_depth,min_child_weight,gamma
2)增加随机性:subsample,colsample_bytree

19, 为什么XGB对于缺失值不怎么敏感?

一般模型对缺失值进行填充后破坏了样本的原有分布特性,但是树模型是寻找最佳分裂点,可以忽略缺失值。
另外有缺失值的数据,尽量避免用距离度量的模型,比如KNN、SVM 等。

20, XGB的缺点

1)每一次迭代都要遍历整个训练集多次,装进内存会限制数据大小,不装进内存会反复读写,非常耗时。
2)预排序:对数据进行预排序,保存数据特征,和排序索引,需要消耗数据两倍的内存。
3) 异常值敏感:因为采用残差的思想,每个基础模型的构建都要拟合前一个模型的残差,如果出现异常点,模型会对异常值过度关注,尤其是当选择loss函数是平方损失函数的时候,这个缺点会进一步方法,所以一般都会选择其他损失函数,比如:绝对损失或者huber损失函数来代替平方损失函数。

21,LGB的优点

相对于XGB,LGB注重效率上的提升。
1)基于直方图的决策树算法。直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

2)带深度限制的Leaf-wise的叶子生长策略
Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
3)其他
直方图做差加速
直接支持类别特征(Categorical Feature)
Cache命中率优化
基于直方图的稀疏特征优化
多线程优化

22 ,XGB与lightGBM的区别。

1)树生长策略:XGB采用level-wise的分裂策略,LGB采用leaf-wise的分裂策略。XGB对每一层所有节点做无差别分裂,但是可能有些节点增益非常小,对结果影响不大,带来不必要的开销。Leaf-wise是在所有叶子节点中选取分裂收益最大的节点进行的,但是很容易出现过拟合问题,所以需要对最大深度做限制 。

2)分割点查找算法:XGB使用特征预排序算法,LGB使用基于直方图的切分点算法,其优势如下:(节省内存、提高效率、加速计算)
减少内存占用,比如离散为256个bin时,只需要用8位整形就可以保存一个样本被映射为哪个bin(这个bin可以说就是转换后的特征),对比预排序的exact greedy算法来说(用int_32来存储索引+ 用float_32保存特征值),可以节省7/8的空间。
计算效率提高,预排序的Exact greedy对每个特征都需要遍历一遍数据,并计算增益,复杂度为𝑂(#𝑓𝑒𝑎𝑡𝑢𝑟𝑒×#𝑑𝑎𝑡𝑎)。而直方图算法在建立完直方图后,只需要对每个特征遍历直方图即可,复杂度为𝑂(#𝑓𝑒𝑎𝑡𝑢𝑟𝑒×#𝑏𝑖𝑛𝑠)。
LGB还可以使用直方图做差加速,一个节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算

3)支持离散变量:无法直接输入类别型变量,因此需要事先对类别型变量进行编码(例如独热编码),而LightGBM可以直接处理类别型变量。

4)并行策略不同。XGB的work之间传递的是样本的索引。
特征并行
LGB特征并行的前提是每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。
XGB的特征并行与LGB的最大不同在于XGB每个worker节点中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。

数据并行 :当数据量很大,特征相对较少时,可采用数据并行策略。LGB中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。XGB中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率贼慢,每个worker间的通信量也就变得很大。

集成学习1——XGBoost
集成学习2——XGBoost本身的特点,及XGB与GBDT、LGB、RF的区别于联系

参考文献:
1,算法研习社
2,https://www.jianshu.com/p/48e82dbb142b
3,https://zhuanlan.zhihu.com/p/29765582

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值