深入理解XGBoost

Ref:深入理解XGBoost

本文是在原文基础上进行修补。

在这里插入图片描述

XGBoost原理推倒:

(1)目标函数:

(2) 第一项泰勒展开:

(3) 第二项-定义树的复杂度:

(4) 最终的目标函数:

(5) 目标函数的最值:

                                       在  取到最小值:  

(6) 分裂增益计算

 

XGBoost树的生成细节:

(5.1)首先列采样,随机选出K列特征作为划分特征;

(5.2)然后这K列进行并行运算,针对每列特征将数据升序排列,保存为block结构

(5.3)再然后 采用贪心算法/近似算法/加权分位数缩略图的方法找到划分点

(5.4)其中对于缺失值采用稀疏感知算法处理,分别枚举特征缺省的样本归为左右分支后的增益,选择增益最大的枚举项即为最优缺省方向。

(5.5)加快模型训练的方法:(1)列快并行学习:通过按特征进行分块并排序,在块里面保存排序后的特征值及对应样本的引用,以便于获取样本的一阶、二阶导数值。(2)缓存访问:为每个线程分配一个连续的缓存区,将需要的梯度信息存放在缓冲区中,这样就实现了非连续空间到连续空间的转换,提高了算法效率。(3)核外 块计算:将数据集分成多个块存放在硬盘中,使用一个独立的线程专门从硬盘读取数据,加载到内存中,这样算法在内存中处理数据就可以和从硬盘读取数据同时进行。

 

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:https://blog.csdn.net/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),所以我们会采用深度很深甚至不剪枝的决策树。

而对于GBDT来说由于利用的是残差逼近的方式,即在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择 variance 更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。
Ref:https://blog.csdn.net/xwl198937/article/details/79749048

 

 

 

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页