机器学习笔记21-XGBoost

XGBoost:

算法核心思想

  1. 不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差
  2. 当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数
  3. 最后只需要将每棵树对应的分数加起来就是该样本的预测值

决策树模型

训练数据集D=\left \lfloor (x_{i},y_{i}) \right \rfloor,其中x_{i}\in \mathbb{R}^{m},y_{i}\in\mathbb{R},\left | D \right |=n

\vec{x_{i}}=(x^{(1)},x^{(2)},......,x^{(m)})^{T}

决策树模型:f_{t}(x)=\omega _{q(x)}

把树分成结构部分q叶子权重部分w后,q(x)为一个映射函数,把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数,\omega \in \mathbb{R}^{T}是叶子节点向量,T为决策树叶子节点数

举个例子,我们要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示。

就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所示

提升决策树模型预测输出:其中f_{k}(x_{i})为第k颗决策树

\hat{y_{i}}=\o (x_{i})=\sum_{k=i}^{K}f_{k}(x_{i})

目标函数/损失函数

  • 红色箭头所指向的L 即为损失函数(比如平方损失函数、logistic损失函数)
  • 红色方框所框起来的是正则项(包括L1正则、L2正则)
  • 红色圆圈所圈起来的为常数项
  • 对于f(x),xgboost利用泰勒展开三项,做一个近似
  • 泰勒二阶展开f 里的x对应目标函数里的,\hat{y_{i}}^{t-1}
  • f里的\Delta (x)对应目标函数的f_{t}(x_{i})
  • 从而f 对x求导数时,对应为目标函数对\hat{y_{i}}^{t-1}求偏导

结构风险/正则化项:

T表示叶子节点的个数,w表示叶子节点的分数。直观上看,目标要求预测误差尽量小,且叶子节点T尽量少(γ控制叶子结点的个数),节点数值w尽量不极端(λ控制叶子节点的分数不会过大),防止过拟合。

对于这个误差函数的式子而言,在第t步 ,y_{i}是真实值,是已知的,\hat{y_{i}}^{t-1}可由第t-1步中的\hat{y_{i}}^{t-2}加上f_{t-2}(x_{i})计算所得,某种意义上也算已知值,故误差函数中的l(y_{i},\hat{y}_{i}^{t-1})是常数项,模型学习函数的是f_{t}(x_{i})

上面那个Obj的公式表达的可能有些过于抽象,我们可以考虑当l是平方误差的情况,这个时候我们的目标可以被写成下面这样的二次函数(图中画圈的部分表示的就是预测值和真实值之间的残差):

在这种新的定义下,我们可以把之前的目标函数进行如下变形,因为每个数都会在叶子节点上:其中I_{j}被定义为每个叶节点 j 上的样本下标的集合 I_{j}=\left \{ i|q(x_{i})=j \right \},每个样本值xi 都能通过函数q(xi)映射到树上的某个叶子节点,从而通过这个定义把两种累加统一到了一起。

接着,我们可以定义

最终公式可以化简为

通过对求导等于0,可以得到(Gj和Hj是已知的,可以直接求解)

然后把最优解代入得到:

分裂节点

1)枚举所有不同树结构的贪心法

我们试下贪心法,从树深度0开始,每一节点都遍历所有的特征,比如年龄、性别等等,然后对于某个特征,先按照该特征里的值进行排序,然后线性扫描该特征进而确定最好的分割点,最后对所有特征进行分割后,我们选择所谓的增益Gain最高的那个特征,而Gain如何计算呢?

当分裂后的损失减少量Gain值为正才有意义

换句话说,对于所有的特征x,我们只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和GL和GR。然后用计算Gain的公式计算每个分割方案的分数就可以了。然后后续则依然按照这种划分方法继续第二层、第三层、第四层、第N层的分裂。

论文中的算法:

2)近似算法

主要针对数据太大,不能直接进行计算

总而言之,XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用的目标函数不一样。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。

凡是这种循环迭代的方式必定有停止条件,什么时候停止呢?简言之,设置树的最大深度、当样本权重和小于设定阈值时停止生长以防止过拟合。具体而言,则

  • 当引入的分裂带来的增益小于设定阀值的时候,我们可以忽略掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思,阈值参数为(即正则项里叶子节点数T的系数); 
  • 当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,避免树太深导致学习局部样本,从而过拟合; 
  • 当样本权重和小于设定阈值时则停止建树。什么意思呢,即涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样。大意就是一个叶子节点样本太少了,也终止同样是防止过拟合; 
  • 貌似看到过有树的最大数量的…

XGBoost相比于GBDT的创新之处:

1.传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数

2.XGBoost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。

3.Shrinkage(缩减),相当于学习速率(xgboost中的eta)。每次迭代,增加新的模型,在前面成上一个小于1的系数,降低优化的速度,每次走一小步逐步逼近最优模型比每次走一大步逼近更加容易避免过拟合现象;

4.列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

 

参考:https://blog.csdn.net/v_JULY_v/article/details/81410574

https://zhuanlan.zhihu.com/p/34534004?utm_source=qq&utm_medium=social&utm_oi=26711534075904

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值