[1] http://www.360doc.com/content/18/0101/17/40769523_718161675.shtml
[2] https://www.cnblogs.com/wxquare/p/5541414.html
[3] https://blog.csdn.net/xwd18280820053/article/details/68927422
[4] https://blog.csdn.net/u013363120/article/details/80195471
[5] 主要参考wepon的资料
预备知识
首先介绍一下牛顿法:
将
L
(
θ
t
)
L(\theta ^t)
L(θt)在
θ
t
−
1
\theta ^{t-1}
θt−1处进行二阶泰勒展开:
L
(
θ
t
)
≈
L
(
θ
t
−
1
)
+
L
′
(
θ
t
−
1
)
Δ
θ
+
L
′
′
(
θ
t
−
1
)
Δ
θ
2
2
L(\theta ^t) \approx L(\theta ^{t-1}) + L'(\theta ^{t-1}) \Delta \theta + L''(\theta ^{t-1})\frac{\Delta \theta^2}{2}
L(θt)≈L(θt−1)+L′(θt−1)Δθ+L′′(θt−1)2Δθ2
令
g
g
g表示一阶导数,
h
h
h表示二阶导数,
h
>
0
h>0
h>0。
求出
Δ
θ
=
−
g
h
\Delta \theta = - \frac{g}{h}
Δθ=−hg
概括XGBoost
相比原始的GBDT, XGBoost的目标函数多了正则项,使得学习出的模型更加不容易过拟合,此外,使用了同时使用了一阶和二阶导数信息。
有哪些指标可以衡量树的复杂度?
树的深度,内部节点个数,叶子节点个数,叶节点分数
正则项:XGBoost采用的是叶子节点个数和叶节点分数。对叶子节点个数进行惩罚,相当于在训练过程中做了剪枝。
XGBoost原理
目标函数:
因为本质是加法模型,当进行第t棵树的学习时:
Note that 上面式子里的正则项是对第t棵树进行正则化。
前面我们提到,XGBoost是对叶子节点个数以及叶子节点值进行正则化。
打分函数:
节点分裂前后的增益准则(越大越好):
XGBoost特点总结
常用的booster有树模型和线性模型。
1. 正则化
XGBoost在代价函数里加了正则项,用于控制模型的复杂度,缓解过拟合。正则项里包含了树的叶子节点个数,每个叶子节点上输出值的平方和。
2. 二阶导数信息
XGBoost同时用到了一阶和二阶导数。
3.并行处理
这里的并行不是树粒度级别的并行,而是特征粒度。
4.灵活性
支持自定义代价函数,只要函数可以一阶和二阶求导。
5. 列抽取
借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还可以减少计算。
6.树节点分裂算法—近似算法
对于每个特征,只考察分位点,减少计算复杂度
XGBoost不是简单地按照样本个数进行分位,而是以二阶导数值作为权重,举例如下:
7.Shrinkage(缩减,即学习速率):
在进行完一次迭代后,会将叶子节点的值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。
8.对缺失值的处理
对于特征的值有缺失的样本,XGBoost可以学习出默认的节点分裂方向。缺失值数据会被分到左子树和右子树分别计增益,选择较优的那一个。
9.剪枝
XGBoost 先从顶到底建立所有可以建立的子树,再从底到顶反向进行剪枝。
10.内置交叉验证
XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。