gbdt算法_详解GBDT+XGBoost算法

GBDT+XGBoost算法非常实用,且面试常考,应给予重视。

一、GBDT

1.1 GBDT的原理

用下一个弱分类器去拟合当前残差(真实值-当前预测值),之后所有弱分类器的结果相加等于预测值。这里弱分类器的表现形式就是CART树。如图所示:Y = Y1 + Y2 + Y3。

0f9530c2a3d46ea79abf416a44299d77.png

1.2 GBDT回归任务【例题一】

某人今年30岁了,但计算机或模型GBDT并不知道今年多少岁,那GBDT咋办呢?
第一步:在第一棵树中,随便用一个年龄(20岁)来拟合,发现误差有10岁(10=30-20);
第二步:在第二棵树中,用6岁去拟合剩下的损失,发现差距还有4岁;
第三步:在第三棵树中,用3岁拟合剩下的差距,发现差距只有1岁了;
第四步:在第四课树中,用1岁拟合剩下的残差,完美。
最终,四棵树的结论加起来,就是真实年龄30岁(实际工程中,gbdt是计算负梯度,用负梯度近似残差)。注意,为何gbdt可以用用负梯度近似残差呢?
回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数,

69479812ca5b0da564b21e607412ee14.gif

那此时的负梯度是这样计算的

ec89c392026ee7fd872b94d79ba7a1c0.gif

所以,当损失函数选用均方损失函数是时,每一次拟合的值就是(真实值 - 当前模型预测的值),即残差。大部分做预测的模型思路:先随便用一个值去预测(初始化),然后对比预测值与真实值的差距(目标函数),最后不断调整缩小差距(目标函数优化)以减少误差。所以会出来一系列目标函数:确定目标,和损失函数:缩小误差。

1.3 GBDT回归任务【例题二】
假定训练集只有4个人:A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工,问题是预测年龄。

如果是用一棵传统的回归决策树来训练,得到如下图所示结果:

397ccec139461d579a45c11966ccc049.png


现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点做多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。得到如下图所示结果:

c0511aa25886939d5926d506a792dd42.png


在第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为左右两拨,每拨用平均年龄作为预测值。进而得到A,B,C,D的残差分别为-1,1,-1,1。
• 计算残差(A实际值 - A预测值 = A残差),所以A残差 = 实际值14 - 预测值15 = -1。
• 注意,A预测值是指前面所有树的累加和,这里前面只有一棵树,所以直接是15,如果还有树则需要都累加起来作为A的预测值。
然后拿它们的残差-1、1、-1、1代替A,B,C,D的原值,到第二棵树去学习,第二棵树只有两个值1和-1,直接分成两个节点,即A和C分在左边,B和D分在右边,经过计算(比如A,实际值-1 - 预测值-1 = 残差0,比如C,实际值-1 - 预测值-1 = 0),此时所有人的残差都是0。
残差值都为0,相当于第二棵树的预测值和它们的实际值相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了,即每个人都得到了真实的预测值。
换句话说,现在A,B,C,D的预测值都和真实年龄一致了。Perfect!
A: 14岁高一学生,购物较少,经常问学长问题,预测年龄A = 15 – 1 = 14
B: 16岁高三学生,购物较少,经常被学弟问问题,预测年龄B = 15 + 1 = 16
C: 24岁应届毕业生,购物较多,经常问师兄问题,预测年龄C = 25 – 1 = 24
D: 26岁工作两年员工,购物较多,经常被师弟问问题,预测年龄D = 25 + 1 = 26
所以,GBDT需要将多棵树的得分累加得到最终的预测得分,且每一次迭代,都在现有树的基础上,增加一棵树去拟合前面树的预测结果与真实值之间的残差。

1.4 GBDT分类任务

从思想上讲,GBDT的分类算法和回归算法没有区别,但由于样本输出不是连续值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。

解决方式:

  • 用指数损失函数,此时GBDT退化为Adaboost算法。
  • 用类似于逻辑回归的对数似然损失函数的方法(分为二元和多元分类)。

95e3d6109e7042b3a3c68b14be32f9dc.png

1.5 GBDT 和 XGBoost 做回归训练集的label均为正值,预测会出现负值吗?原因是什么?

答案是肯定的,原因有以下几点:

  • 训练集中里很多label接近于0,testing里出现一些接近于0的负数很正常。
  • 因为GBDT是加法模型,下一轮都是上一轮预测值和实际值的残差作为label继续拟合,最后将结果相加,这样最后可能会出现负值,如1.3 GBDT回归任务【例题二】中第二棵树。

1.6 GBDT与LR的区别

(1)模型:都是监督学习,判别模型,直接对数据的分布建模,不尝试挖掘隐含变量,这些方面是大体相同的,但LR是分类模型,GBDT即可做分类又可回归。

(2)损失函数:在极大似然下,lr的loss 是交叉熵,此时lr的准测是最大熵原理,也就是为了追求最小分类误差。而GBDT采用的cart回归树作为基本分类器,无论是分类还是回归,都是采用回归拟合(将分类问题通过softmax转换为回归问题),用当前损失函数负梯度去拟合实际值与前一轮模型预测值之间的残差。

(3)从特征空间角度:lr是特征的线性组合,求交叉熵的最小化,也就是对特征的线性组合做logistic分类。而GBDT采用cart树作为基分类器,其每一轮的特征拟合都是对特征空间做平行于坐标轴的空间分割,所以自带特征选择和可解释性。GBDT既可以做分类也可以做回归,只是统一采用回归的思路进行求解。

(4)从正则的角度:lr 采用 l1 和 l2 正则;GBDT采用弱分类器的个数,也就是迭代轮次T,T的大小影响着算法的复杂度。

(5)特征组合:GBDT 特征的选择方法是采用最小化均方误差,来寻找分裂特征和适用的分裂点,所以会自动在当前特征A分裂的基础上,继续寻找其他能使负梯度最小的特征B,这样就出现了特征组合的性能,也能给出哪些特征比较重要。LR 不具有特征组合能力,并假设各个维度的特征独立,因此只具有线性分界面,实际应用中,多数特征之间又相关性,只有维度特别大的稀疏数据中特征才会近似独立,所以适用于特征稀疏的情形。而GBDT更适合处理稠密特征,有利于特征表达。

(6)数据分布假设:Logistic Regression的数据分布假设:噪声服从高斯分布,数据服从伯努利分布;而 GBDT 并未对数据做出上述假设。


二、XGBoost

2.1 XGBoost的原理

XGBoost属于ensemble方法中的boosting算法,而boosting算法的思想就是一个加法模型不同的基模型之间存在强关联性,串行生成

2.2 XGBoost理论推导

f319466e8c81ece087ad53b18013283b.png

11d3156e5749c760246287138178478e.png

2.3 XGBoost的优势

(1)算法本身优化

    • 基学习器的选择:XGBoost 支持除了决策树之外的其余分类器,而 GBDT 等只用决策树
    • 导数信息:对损失函数进行了二阶导的展开,相对GBDT的一阶导展开更加的精确
    • 正则化:目标函数中显示的正则化项,防止过拟合效果比较好

(2)算法运行效率优化

    • 预排序:先对所有的特征值进行排序分组,并以Block形式储存,方便后面计算。
    • 并行计算:对每个弱学习器,决策树建立的过程是多线程并行查找每个特征的最佳分割点(即并行计算不同特征划分后的增益),进而选择合适的子树分裂特征和特征值。

(3)算法健壮性的优化

    • 缺失值的处理:对于含有缺失值的样本,会分别把它分配到左叶子节点和右叶子节点,然后再选择分裂后增益最大的那个方向,作为预测时特征值缺失样本的默认分支方向。

2.4 XGBoost不适用于什么样情景的数据?

对于呈偏态分布的数据,预排序以及寻找切分点不太友好,因为数据分布的非常不均匀。这一点暂时不是非常清楚,感兴趣的伙伴可以自行查阅,也请大佬们补充。


【参考】

[1]

AI笔试面试题库 - 七月在线​www.julyedu.com

[2]

机器学习 | GBDT+XGBoost知识补充及梳理​blog.csdn.net
58ba1b7754c9358d0d3c1e12b26332ec.png

[3]

GBDT面试级知识点整理_兰陵鸡王的博客-CSDN博客_gbdt面试题​blog.csdn.net
988b550b90f714534d7380297db990a6.png

[4]

沙漠之狐:GBDT与lr的区别​zhuanlan.zhihu.com

[5]

Jack Stark:[校招-基础算法]GBDT/XGBoost常见问题​zhuanlan.zhihu.com

[6]

https://arxiv.org/pdf/1603.02754.pdf​arxiv.org

[7]

https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf​homes.cs.washington.edu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值