机器学习面试必知:XGBoost简介

原始的GBDT算法基于经验损失函数的负梯度来构造新的决策树,只是在决策树构建完成后再进行剪枝。而XGBoost在决策树构建阶段就加入了正则项即 L t = ∑ i l ( y i , F t − 1 ( x i ) + f t ( x i ) ) + Ω ( f t ) L_{t}=\sum_{i}l(y_{i},F_{t-1}(x_{i})+f_{t}(x_{i}))+\Omega(f_{t}) Lt=il(yi,Ft1(xi)+ft(xi))+Ω(ft)其中 F t − 1 ( x i ) F_{t-1}(x_{i}) Ft1(xi)表示现有的 t − 1 t-1 t1棵树最优解。正则项定义为 Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_{t})=\gamma T+\frac{1}{2}\lambda \sum_{j=1}^{T}w_{j}^{2} Ω(ft)=γT+21λj=1Twj2其中 T T T为叶子节点个数, w j w_{j} wj表示第 j j j个叶子节点的预测值。对该损失函数在 F t − 1 F_{t-1} Ft1处进行二阶泰勒展开可以推导出 L t ≈ L ~ t = ∑ j = 1 T { G j w j + 1 2 ( H j + λ ) w j 2 } + γ T L_{t}\approx \tilde{L}_{t}=\sum_{j=1}^{T}\left\{G_{j}w_{j}+\frac{1}{2}(H_{j}+\lambda)w_{j}^{2} \right\}+\gamma T LtL~t=j=1T{Gjwj+21(Hj+λ)wj2}+γT其中 T T T为决策树 f t f_{t} ft中叶子节点的个数, G j = ∑ i ∈ I j ▽ F t − 1 l ( y i , F t − 1 ( x i ) ) G_{j}=\sum_{i\in I_{j}}\bigtriangledown _{F_{t-1}}l(y_{i},F_{t-1}(x_{i})) Gj=iIjFt1l(yi,Ft1(xi)) H j = ∑ i ∈ I j ▽ F t − 1 2 l ( y i , F t − 1 ( x i ) ) H_{j}=\sum_{i\in I_{j}}\bigtriangledown _{F_{t-1}}^{2}l(y_{i},F_{t-1}(x_{i})) Hj=iIjFt12l(yi,Ft1(xi)) I j I_{j} Ij表示所有属于叶子节点 j j j的样本的索引的结合。

假设决策树的结构已知,通过令损失函数相对于 w j w_{j} wj的导数为0可以求出在最小化损失函数的情况下各个叶子节点上的预测值 w j ∗ = − G j H j + λ w_{j}^{*}=-\frac{G_{j}}{H_{j}+\lambda} wj=Hj+λGj
在实际中往往采用贪心法来构建出一个次优的树结构,基本思想是从根节点开始,每次对一个叶子节点进行分裂,针对每一种可能分裂根据特定的准则选取最优的分裂。

XGBoost如同ID3,C4.5,CART那样也有自己特定的准则
通过将预测值代入到损失函数中可求得损失函数的最小值 L ~ t ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \tilde{L}_{t}^{*}=-\frac{1}{2}\sum_{j=1}^{T}\frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T L~t=21j=1THj+λGj2+γT
容易计算出分裂前后损失函数的差值为 G a i n = G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − γ Gain=\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}-\gamma Gain=HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2γXGBoost采用最大化这个差值作为准则来进行决策树的构建,通过遍历所有特征的所有值,寻找使得损失函数前后差值最大的相对应分裂方式。此外由于损失函数前后存在差值一定是正的限制,此时 γ \gamma γ起到了一定的预剪枝效果。

除了算法上与传统的GBDT有不同外,XGBoost还在工程实现上做了大量的优化。
(1)GBDT是机器学习算法,XGBoost是该算法的工程实现
(2)在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度。
(3)GBDT在模型训练时只使用来代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
(4)传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
(5)传统的GBDT在每轮迭代时使用全部数据集,XGBoost采用与随机森林相似的策略,支持对数据进行采样。
(6)传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。

XGBoost的并行
XGBoost的并行并不能像随机森林那样一次能建立多个决策树,XGBoost是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行体现在特征粒度上,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点)。XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的 G a i n Gain Gain,最终选最大的那个特征去做分裂,那么各个特征的计算就可以开多线程进行。
树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

你可能感兴趣的:(机器学习,面试,统计学习)