深⼊理解XGBoost Ref:
本⽂是在原⽂基础上进⾏修补。
XGBoost原理推倒:
(1)⽬标函数:
(2) 第⼀项泰勒展开:
(3) 第⼆项-定义树的复杂度:
(4) 最终的⽬标函数:
(5) ⽬标函数的最值:
在  取到最⼩值:
(6) 分裂增益计算
XGBoost树的⽣成细节:
(5.1)⾸先列采样,随机选出K列特征作为划分特征;
(5.2)然后这K列进⾏并⾏运算,针对每列特征将数据升序排列,保存为block结构
(5.3)再然后 采⽤贪⼼算法/近似算法/加权分位数缩略图的⽅法到划分点
(5.4)其中对于缺失值采⽤稀疏感知算法处理,分别枚举特征缺省的样本归为左右分⽀后的增益,选择增益最⼤的枚举项即为最优缺省⽅向。
(5.5)加快模型训练的⽅法:(1)列快并⾏学习:通过按特征进⾏分块并排序,在块⾥⾯保存排序后的特征值及对应样本的引⽤,以便于获取样本的⼀阶、⼆阶导数值。(2)缓存访问:为每个线程分配⼀个连续的缓存区,将需要的梯度信息存放在缓冲区中,这样就实现了⾮连续空间到连续空间的转换,提⾼了算法效率。(3)核外 块计算:将数据集分成多个块存放在硬盘中,使⽤⼀个独⽴的线程专门从硬盘读取数据,加载到内存中,这样算法在内存中处理数据就可以和从硬盘读取数据同时进⾏。function怎么记忆
XGBoost 的优缺点:
⾸先从模型选择⾓度,然后模型原理推倒⾓度,再之后就是树的⽣长过程
记忆宝典:选⽤的基模型、基模型之间的关系(都加上学习率)、ok然后给每个基模型订⽴ ⽬标函数由两部分组成:损失函数的⼆阶泰勒展开+ 正则化项,然后开始列采样 获得数据,缺失值处理、进⾏⼯程实现(列块并⾏,缓存访问、核外块计算)
缺点:预排序和近似算法的时间复杂度和空间复杂度 较⼤
优点:
(1)灵活性更强: GBDT 以 CART 作为基分类器,XGBoost 不仅⽀持 CART 还⽀持线性分类器,使
⽤线性分类器的 XGBoost 相当于带 L1和 L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost ⼯具⽀持⾃定义损失函数,只需函数⽀持⼀阶和⼆阶求导;
(2)Shrinkage(缩减): 相当于学习速率。XGBoost 在进⾏完⼀次迭代后,会将叶⼦节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后⾯有更⼤的学习空间。传统GBDT的实现也有学习速率;
(3)精度更⾼: GBDT 只⽤到⼀阶泰勒展开,⽽ XGBoost 对损失函数进⾏了⼆阶泰勒展开。XGBoost 引⼊⼆阶导⼀⽅⾯是为了增加精度,另⼀⽅⾯也是为了能够⾃定义损失函数,⼆阶泰勒展开可以近似⼤量损失函数;
(4)正则化:XGBoost 在⽬标函数中加⼊了正则项,⽤于控制模型的复杂度。正则项⾥包含了树的叶⼦节点个数、叶⼦节点权重的L2范式。正则项降低了模型的⽅差,使学习出来的模型更加简单,有助于防⽌过拟合,这也是XGBoost优于传统GBDT的⼀个特性。
(5)列抽样: XGBoost 借鉴了随机森林的做法,⽀持列抽样,不仅能降低过拟合,还能减少计算。这也是XGBoost异于传统GBDT的⼀个特性;
(6)XGBoost⼯具⽀持并⾏: boosting不是⼀种串⾏的结构吗?怎么并⾏的?注意XGBoost的并⾏不
是tree粒度的并⾏,XGBoost也是⼀次迭代完才能进⾏下⼀次迭代的(第t次迭代的代价函数⾥包含了前⾯t−1次迭代的预测值)。XGBoost的并⾏是在特征粒度上的。我们知道,决策树的学习最耗时的⼀个步骤就是对特征的值进⾏排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进⾏了排序,然后保存为block结构,后⾯的迭代中重复地使⽤这个结构,⼤⼤减⼩计算量。这个block结构也使得并⾏成为了可能,在进⾏节点的分裂时,需要计算每个特征的增益,最终选增益最⼤的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进⾏。
(7)可并⾏的近似算法: 树节点在进⾏分裂时,我们需要计算每个特征的每个分割点对应的增益,即⽤贪⼼法枚举所有可能的分割点。当数据⽆法⼀次载⼊内存或者在分布式情况下,贪⼼算法效率就会变得很低,所以XGBoost还提出了⼀种可并⾏的近似算法,⽤于⾼效地⽣成候选的分割点。
(8)缺失值处理: 对于特征的值有缺失的样本,XGBoost 采⽤的稀疏感知算法可以⾃动学习出它的分裂⽅向;
缺点:
(1)预排序过程的空间复杂度过⾼,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。(2)虽然利⽤预排序和近似算法可以降低寻最佳分裂点的计算量,但在节点分裂时计算分裂增益 仍需要遍历数据集,对每个样本的梯度求和;
XGBoost调参过程:
step1.修正学习速率及调参估计量                0.1  20
step2.调整max_depth 和min_child_weight    {'max_depth’: 8, 'min_child_weight': 1}
step3.调整gamma                            {'gamma': 0.2}
step4.调整subsample 和colsample_bytree    { 'subsample': 0.85,'colsample_bytree': 0.85}
step5.调整正则化参数alpha会让减少模型复杂度    L1:{‘reg_alpha': 0.01}  L2:reg_lambda
step6.减⼩学习率                            0.01  100颗
GBDT和XGBoost 的区别:
XGB中损失函数⼆阶泰勒展开,GBDT中只⽤到了⼀阶
XGB 加了正则项
⼯程实现做的优化:列块并⾏,缓存优化,核外块计算
GBDT与随机森林(RF)的区别与联系?
相同点: 都是由多棵树组成,最终的结果都是由多棵树⼀起决定。
不同点:
1)集成的⽅式:随机森林属于Bagging思想,⽽GBDT是Boosting思想。
2)偏差-⽅差权衡:RF不断的降低模型的⽅差,⽽GBDT不断的降低模型的偏差。
7)泛化能⼒:RF不易过拟合,⽽GBDT容易过拟合。Ref:
blog.csdn/program_developer/article/details/102763481
3)训练样本⽅式:RF每次迭代的样本是从全部训练集中有放回抽样形成的,⽽GBDT的样本是⽆放回采样或采⽤全部样本。
4)并⾏性:RF的树可以并⾏⽣成,⽽GBDT只能顺序⽣成(需要等上⼀棵树完全⽣成)。
5)最终结果:RF最终是多棵树进⾏多数表决(回归问题是取平均),⽽GBDT是加权融合。
6)数据敏感性:RF对异常值不敏感,原因是多棵树表决,⽽GBDT对异常值⽐较敏感,原因是当前的错误会延续给下⼀棵树。
1、RF的树可以是回归树也可以是分类树,⽽GBDT只能是回归树。
6、RF不需要进⾏数据预处理,即特征归⼀化。⽽GBDT则需要进⾏特征归⼀化??说法不⼀。
记忆宝典:GBDT 和RF区别,⾸先想到的就是 bagging/boosting 然后联想到 3-3组合
3:由bagging-->降低⽅差-->泛化能⼒强,不容易过拟合;boosting-->降低偏差-->准确度⾼-->容易过拟合
3:训练样本有/⽆放回; 是否能并⾏训练;训练结果怎么得到
为什么GBDT的树深度较RF通常都⽐较浅?
泛化误差可以理解为两部分,分别是偏差(bias)和⽅差(variance);偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本⾝的拟合能⼒;⽅差度量了同等⼤⼩的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。当模型越复杂时,拟合的程度就越⾼,模型的训练偏差就越⼩;但此时如果换⼀组数据可能模型的变化就会很⼤,即模型的⽅差很⼤,所以模型过于复杂的时候会导致过拟合。
对于RF来说由于并⾏训练很多不同的分类器的⽬的就是降低这个⽅差(variance)。所以对于每个基分类器来说,⽬标就是如何降低这个偏差(bias),所以我们会采⽤深度很深甚⾄不剪枝的决策树。
XGBoost ⼆分类问题:就是在XGBoost回归模型外⾯套了⼀个逻辑回归。
在得到多个弱cart树模型后,输⼊⼀个原始数据,经过n个树打分,残差相加,得到的数值要经过logictic function映射成概率值,也就是该样本被划分为正样本的概率。
XGBoost多分类问题:就是在XGBoost回归模型外⾯套了⼀个Softmax。 还不太理解。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。