机器学习 深度学习 NLP 搜索推荐 等 索引目录
上一篇博文提到XGBoost是GBDT的扩展和改进,在GBDT中只用了一阶导信息,XGBoost中考虑了二阶导信息,对Loss Function做了二阶泰勒展开,并在目标函数上加入了正则项,用以权衡目标函数的下降和模型的复杂度,避免过拟合。
J ( f t ) = ∑ i = 1 n L ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + C ( 式 1 ) J(f_{t})=\sum_{i=1}^{n}L(y_{i},\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}))+\Omega (f_{t})+C (式1) J(ft)=i=1∑nL(yi,y^i(t−1)+ft(xi))+Ω(ft)+C(式1)
式中第二项为正则项,第三项为常数项。
对 L ( ⋅ ) L(\cdot) L(⋅)进行一阶求导为 g i g_i gi,二阶求导为 h i h_i hi,根据泰勒展开式,则可将目标函数转化为如下形式:
J ( f t ) ≈ ∑ i = 1 n [ L ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) + C ( 式 2 ) J(f_{t})\approx \sum_{i=1}^{n}\left [ L(y_{i},\hat{y}_{i}^{(t-1)})+g_{i}f_{t}(x_{i})+\frac{1}{2}h_{i}f_{t}^{2}(x_{i}) \right ]+\Omega (f_{t})+C (式2) J(ft)≈i=1∑n[L(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)+C(式2)
使用决策树做分类或回归,是从根节点到叶节点的细化过程;落在相同叶节点的预测值是相同的。假设叶节点的数目为 T T T,每个叶节点的权值为 w = ( w 1 , w 2 , . . . , w T ) w=(w_1,w_2,...,w_T) w=(w1,w2,...,wT),决策树的学习过程就是构造如何使用特征得到划分,从而得到这些权值的过程。
假设 q ( x ) q(x) q(x)表示样本 x x x落在 q q q节点上,例如,样本"小女孩"落在第2个叶子节点上,则, q q q(“小女孩”)=2。
定义基函数:
f t = w q ( x ) ( 式 3 ) f_{t}=w_{q\left ( x \right )} (式3) ft=wq(x)(式3)
一棵决策树的核心即为“树结构 q ( x ) q(x) q(x)”和“叶权值 w w w”。
正则项的加入,可以防止训练数据的过度拟合。考虑到决策树的复杂度与叶节点的个数和叶权值相关,在这里使用叶节点总数和叶权值平方和的加权来作为正则项(不是唯一的方式)
则正则项为:
Ω ( f t ) = γ ⋅ T t + λ ⋅ 1 2 ∑ j = 1 T w j 2 ( 式 4 ) \Omega (f_{t})=\gamma \cdot T_{t}+\lambda \cdot \frac{1}{2}\sum_{j=1}^{T}w_{j}^{2} (式4) Ω(ft)=γ⋅Tt+λ⋅21j=1∑Twj2(式4)
以上即为XGBoost的核心推倒过程,上面的对目标函数进行优化的过程实际上就是对第t棵树进行分裂,启发式地寻找树的最优结构的过程。每次分裂,都对应于将该叶结点下的样本分配到左右两个新的叶节点上,每个叶节点上的所有训练样本都会对应一个学习值,在优化过程中,可以看出,损失函数满足样本之间的累加特性,所以可以通过分裂前的叶节点上样本的损失函数值与分裂后两个新的叶子节点上的样本的损失函数值的和进行对比,进而找到可用的分裂特征和特征分裂点,每个叶子节点上都有其对应的权值,这些权值用于对对应的叶子进行打分,所以对叶子节点的权值赋值,也影响到损失函数的变化,最终通过对目标函数的简化可以看到,这种转换,将损失函数从样本维度转换为叶结点维度。
根据上面的分析,最终我们需要求解的变量就是如何构造决策树的结构。
对于当前节点,应该如何进行子树划分?
1)贪心法枚举每个叶节点的可行分裂点,计算分裂后的 J ( f ) J(f) J(f);
2)对于所有可行划分,选择 J ( f ) J(f) J(f)降低最小的分割点。
在知乎上有人提过这种问题,看到下面大家的回答真的很全面,感兴趣的同学可以看看机器学习算法中GBDT和XGBOOST的区别有哪些?
下面的内容也是来自知乎答友们的内容。
1)GBDT特指梯度提升决策树算法,以CART为基学习器,而XGBoost中的基学习器也可以是线性分类器,此时的XGBoost相当于带有L1和L2正则项的Logistic回归(分类问题)或者线性回归(回归问题);
2)GBDT在迭代优化中只使用了一阶导数信息,而XGBoost对损失函数进行泰勒展开的二阶近似,既用到了一阶导信息,也用到了二阶导信息;并且XGBoost还支持自定的可一阶导和二阶导的损失函数;
3)XGBoost显式地将树模型的复杂度(即,夜间点的个数和每个叶节点上的权值平方和)作为正则项加入目标函数,以降低模型的方差(variance),使其学习出来的模型更加简单,防止过拟合;
4)XGBoost寻找最佳分割点时,考虑到传统的贪心法效率较低,实现了一种分裂节点近似算法,用于加速和减小内存消耗,除此之外还考虑了稀疏数据集、缺失值的处理(对于特征的值有缺失的样本,XGBoost可以自动学习出它的分裂方向),大大提升算法的效率;
5)XGBoost借用了随机森林的思想,允许使用列抽样(column sampling)来防止过拟合,并且可以减少计算量
6)XGBoost支持分布式并行计算。XGBoost的并行不是tree粒度的并行,而是在特征粒度上的并行。决策树的学习因为要寻找最佳分裂点,最耗时的一步是对特征的值进行排序,XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,在后面的迭代中重复使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。 可并行的近似直方图算法,树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。