当前位置:   article > 正文

GBDT、XGBoost、LightGBM汇_gbdt xgboost lightgbm

gbdt xgboost lightgbm

1、决策树

 ID3、C4.5、CART分类树算法总结: 感觉背这些无意义。

ID3:缺点:

  • ID3 没有剪枝策略,容易过拟合;
  • 信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;因为ID3是多叉树,一次将所有样本按不同年龄划分成多个叶子节点,这样叶子节点就会很纯,H(D|A)就很小,gain= H(D)-H(D|A)就会很大。
  • 只能用于处理离散分布的特征;
  • 没有考虑缺失值。

C4.5:采取的优化措施:

  • 采用后剪枝策略,防止过拟合
  • 引入信息增益率作为划分标准;
  • 将连续特征离散化,
  • 对于缺失值的处理:将样本以不同概率划分到不同节点中。

C4.5缺点:

  • 剪枝策略可以再优化;
  • C4.5 用的是多叉树,用二叉树效率更高;
  • C4.5 只能用于分类;
  • C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;
  • C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。

CART 在 C4.5 的基础上进行了很多提升:

  • C4.5 为多叉树,运算速度慢,CART 为二叉树,运算速度快;
  • C4.5 只能分类,CART 既可以分类也可以回归;
  • CART 使用 Gini 系数作为变量的不纯度量,减少了大量的对数运算;

Ref: 最常见核心的决策树算法—ID3、C4.5、CART(非常详细)

决策树及剪枝操作:

1. 简述决策树原理?

       决策树是一种自上而下,对样本数据进行树形分类的过程,由节点和有向边组成。节点分为内部节点和叶节点,其中每个内部节点表示一个特征或属性,叶节点表示类别。从顶部节点开始,所有样本聚在一起,经过根节点的划分,样本被分到不同的子节点中,再根据子节点的特征进一步划分,直至所有样本都被归到某个类别。

2.  为什么要对决策树进行减枝?如何进行减枝?

剪枝是决策树解决过拟合问题的方法。在决策树学习过程中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,于是可能将训练样本学得太好,以至于把训练集自身的一些特点当作所有数据共有的一般特点而导致测试集预测效果不好,出现了过拟合现象。因此,可以通过剪枝来去掉一些分支来降低过拟合的风险。

        决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。 

        预剪枝使得决策树的很多分支都没有"展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降?但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于"贪心"本质禁止这些分支展开,给预剪枝决策树带来了欠拟含的风险。

        后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树 。但后剪枝过程是在生成完全决策树之后进行的 并且要白底向上对树中的所有非叶结点进行逐 考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。 

集成学习思想

stacking的例子如GBDT+LR

2、随机森林RF

决策树最重要的6个参数       

        决策树最重要的6个参数包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。已红色标出: (1)选择决策树分裂的标准,(2) 构建多少颗决策树,(3) 每棵树用多少特征,(4) ok,开始构建,先来看第一个节点,是否需要分裂 即:是否满足节点划分所需最小样本数(5)当前节点是否达到树的最大深度, (6) 划分之后的节点是否小于min_sample_leaf 叶子节点最少样本数。
Ref:https://blog.csdn.net/qfikh/article/details/103913834

3、GBDT

GBDT 分类和回归算法的比较:

        GBDT回归算法中每棵树都是预测y真实值或者y的残差,采用平方损失函数,所以划分节点时采用平方损失和最小作为划分依据。        

        GBDT分类算法是一个基于梯度提升的集成学习算法,它本身并不直接使用逻辑回归,但可以使用类似逻辑回归的对数似然损失函数来指导每一轮迭代中弱学习器的拟合过程,从而获得更好的分类性能。

        GBDT二分类采用类似逻辑回归的对数损失函数,将决策树输出累加得到概率值F(x),通过对数损失函数将yi 与F(xi) 联系起来,用来表示损失函数。实际的效果感觉很像GBDT的最终输出在经过一个sigmoid函数。(GBDT+LR 是)

== 

将单个样本的对数损失函数 进行二阶泰勒展开,求得每棵树叶子节点C的权重取值

Bagging 和Boosting 的区别?

GBDT与随机森林的区别与联系?

记忆宝典:GBDT 和RF区别,首先想到的就是 bagging/boosting 然后联想到 3-3组合

  • 3:由bagging-->降低方差-->泛化能力强,不容易过拟合;boosting-->降低偏差-->准确度高-->容易过拟合 
  • 3:是否能并行训练;异常值敏感否; 训练结果怎么得到

相同点: 都是由多棵树组成,最终的结果都是由多棵树一起决定。

不同点:

  • 1)集成的方式:随机森林属于Bagging思想,而GBDT是Boosting思想。
  • 3)训练样本方式:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT的样本是无放回采样或采用全部样本。
  • 2)偏差-方差权衡:RF不断的降低模型的方差,而GBDT不断的降低模型的偏差。
  • 7)泛化能力:RF不易过拟合,而GBDT容易过拟合。Ref:https://blog.csdn.net/program_developer/article/details/102763481
  • 4)并行性:RF的树可以并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)。
  • 6)数据敏感性:RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。
  • 5)最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而GBDT是加权融合。
  • 1、RF的树可以是回归树也可以是分类树,而GBDT只能是回归树。
  • 6、RF不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化??说法不一。

为什么GBDT的树深度较RF通常都比较浅?

        泛化误差可以分为偏差(bias)和方差(variance);偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了相同的样本时模型预测值的离散程度。

        模型越复杂时,拟合的程度就越高,模型的训练偏差就越小;但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大,所以模型过于复杂的时候会导致过拟合

        对于RF来说由于并行训练很多不同的分类器,然后求均值作为最后预测值。所以保证了方差,那么对于每个基分类器来说,目标就是如何降低这个偏差,所以我们会采用深度很深甚至不剪枝的决策树。

        而对于GBDT来说用残差更新样本迭代训练多个弱学习器,然后进行加权累加作为最后预测值,可以保证偏差,所以对于每个基分类器来说,目标就是如何降低这个方差,所以会采用更简单的分类器 即深度很浅的决策树。
Ref:https://blog.csdn.net/xwl198937/article/details/79749048

Ref: 深入理解GBDT回归算法_Microstrong0305的博客-CSDN博客

深入理解GBDT二分类算法_Microstrong0305的博客-CSDN博客

3、XGBoost

Ref:深入理解XGBoost

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

在这里插入图片描述

XGBoost原理公式推倒:

(1)目标函数:

(2) 第一项泰勒展开:

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

(4) 最终的目标函数:

(5) 目标函数的最值:

                                       在  取到最小值:  

(6) 分裂增益计算

XGBoost分类和回归的关系:

        XGBoost可以同时用于分类和回归任务。对于分类任务,XGBoost使用对数损失函数,对于回归任务,XGBoost使用平方损失函数。

XGBoost 二分类问题:就是在XGBoost回归模型外面套了一个逻辑回归。

       在得到多个弱cart树模型后,输入一个原始数据,经过n个树打分,残差相加,得到的数值要经过logictic function映射成概率值,也就是该样本被划分为正样本的概率。

XGBoost多分类问题:就是在XGBoost回归模型外面套了一个Softmax。

XGBoost树的生成过程:

(5.1)首先对每列特征将数据升序排列,保存为block结构

(5.2)然后列采样,随机选出K列特征作为划分特征;

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

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

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

 特征重要度怎么看?

XGBoost的介绍、优缺点:

XGBoost 与GBDT的对比:

首先从模型选择角度,然后模型原理推倒角度,再之后就是树的生长过程

记忆宝典:选用的弱分类器、弱分类器之间的关系(都加上学习率)、ok然后 目标函数由两部分组成:损失函数的二阶泰勒展开 + 正则化项,然后开始列采样 获得数据,缺失值处理,进行工程实现(列块并行,缓存访问、核外块计算);单棵树训练完后累加到总模型中(学习率),总模型采用early stopping 来停止训练。

缺点:预排序和近似算法的时间复杂度和空间复杂度 较大

优点:

(1)灵活性更强: GBDT 以 CART 作为弱分类器,XGBoost 不仅支持 CART 还支持线性分类器,使用线性分类器的 XGBoost 相当于带 L1和 L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;

(2)Shrinkage(缩减): XGBoost和GBDT的每棵树都乘以学习速率。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)虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂时计算分裂增益 仍需要遍历数据集,对每个样本的梯度求和;

(3)对 cache 优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对 cache 进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的 cache miss。

 XGBoost相比GBDT做的改进:

  • XGB中损失函数二阶泰勒展开,GBDT中只用到了一阶
  • XGB 加了正则项
  • 工程实现做的优化:列块并行,缓存优化,核外块计算

过拟合现象:训练集上损失不断减小,测试集上损失逐渐增大。

欠拟合现象:训练误差和测试误差值均较高,随着训练时间及模型复杂度的增加而下降。

Dropout 仅在神经网络中用到,树模型中没有用到。

XGBoost 中的 subsample 参数用于控制每轮训练中随机选择的样本的比例

背诵技巧:nssle:目标函数正则化N -> 子/列采样S -> 学习率L --> Early Stopping E。

  • 单棵树训练过程中对样本进行子采样或列采样、进行正则化剪枝/目标函数正则化,限制树深
  • 每棵树的结果乘以学习率防止过拟合,XGB训练过程中采用Early Stopping的方法防止过拟合。

XGBoost调参过程:

  • step4.调整subsample 和colsample_bytree     { 'subsample': 0.85,'colsample_bytree': 0.85}
  • step1.修正学习速率及调参估计量                 0.1  20
  • step2.调整max_depth 和min_child_weight     {'max_depth’: 8, 'min_child_weight': 1}
  • step3.调整gamma  (gamma*T)                           {'gamma': 0.2}
  • step5.调整正则化参数alpha会让减少模型复杂度    L1:{‘reg_alpha': 0.01}  L2:reg_lambda
    • L1正则项:alpha*∑|叶子结点权重|         alpha=0/0.01
    • L2正则项:0.5*lambda*∑wj^2              lambda=2
  • step6.减小学习率                            0.01   100颗

背诵技巧: 

  • 数据 ①先对训练集进行采样;
  • 模型 ②横向设置学习率、决策树数目;③纵向设置最大深度、叶子结点最少样本数;
  • 目标函数 ④开始训练需要关注损失函数的参数 gama,alpha/lambda 参数;
  • 调剂参数 ⑤最后调解学习率、决策树数量。

4、LightGBM

深入理解LightGBM_Microstrong0305的博客-CSDN博客

1、LightGBM产生的背景:

        常用的机器学习算法,例如神经网络等算法,都可以以 mini-batch 的方式训练,训练数据的大小不会受到内存限制。而 GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的 GBDT 算法是不能满足其需求的。
        LightGBM 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。

 2、XGBoost的不足:

Xgboost 原理:目前已有的 GBDT 工具基本都是基于预排序的方法(pre-sorted)的决策树算法(如 xgboost)。这种构建决策树的算法基本思想是:  

  • 首先,对所有特征都按照特征的数值进行预排序。   
  • 其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。   
  • 最后,找到一个特征的分割点后,将数据分裂成左右子节点。   

这样的预排序算法的优点是:能精确地找到分割点。缺点也很明显:

(1)预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
(2)时间复杂度高:虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂时计算分裂增益 仍需要遍历数据集,对每个样本的梯度求和;

(3)对 cache 优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对 cache 进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的 cache miss。

3、LightGBM 相比XGB做出的优化:

记忆宝典: light光线直(直方图)着并行射下来(并行优化;光线是一条条的分类的(直接支持类别特征处理);深度优先遍历的leaf wise生长策略 效率、精度更高且能防止过拟合:

  • 1、直方图算法(基于 Histogram 的决策树算法) 以及做差加速

        直方图算法的基本思想是将训练样本的每一维特征离散化成k个整数,构造一个宽度为k的直方图,遍历数据时将离散化后的值作为索引在直方图中累积统计量(一般是1阶梯度之和、样本数量(2阶梯度为1)),当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

        直方图算法优缺点:

  •  首先,明显降低空间复杂度,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用 8 位整型存储就足够了,内存消耗可以降低为原来的1/8。
  • 其次,时间复杂度也大幅降低,预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data*#feature)优化到O(k*#features)
  • 最后,精度下降但提高模型的泛化能力:Histogram 算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,但是因为决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合。即单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。

  • 直方图做差加速

 LightGBM 另一个优化是 Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM 可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

  • 2、并行优化:

LightGBM 还具有支持高效并行的优点。LightGBM 原生支持并行学习,目前支持特征并行和数据并行的两种。

  • 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
  • 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
  • 3、带深度限制的 Leaf-wise 的叶子生长策略

        Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上 Level-wise 是一种低效的算法,因为它不加区分的对待同一层的叶子,很多叶子的分裂增益较低,没必要进行搜索和分裂,带来了很多没必要的开销

        Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合

  • 4、直接支持类别特征(Categorical Feature)

        大多数机器学习工具都无法直接支持类别特征,一般需要把无序类别特征进行onehot encoding,有序类别特征进行label encoding,降低了空间和时间的效率。基于这个考虑,LightGBM 优化了对类别特征的支持,在决策树算法上增加了类别特征的决策规则,可以直接输入类别特征,不需要额外的编码。在 Expo 数据集上的实验,相比0/1 展开的方法,训练速度可以加速 8 倍,并且精度一致。据我们所知,LightGBM 是第一个直接支持类别特征的 GBDT 工具。

  • 6、Cache 命中率优化
  • 7、基于直方图的稀疏特征优化
  • 8、多线程优化。

LightGBM的优缺点
 

优点:
这部分主要总结下 LightGBM 相对于 XGBoost 的优点,从内存和速度两方面进行介绍。

  • (1)速度更快
    • LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度
    • LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
    • LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;
    • LightGBM 对缓存也进行了优化,增加了缓存命中率
    • LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
  • (2)内存更小
    • LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗;
    • LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
    • XGBoost使用预排序后需要记录特征值及其对应样本的统计值的索引,而 LightGBM 使用了直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,将空间复杂度从 O ( 2 ∗ # d a t a ) O(2*\#data)O(2∗#data) 降低为 O ( # b i n ) O(\#bin)O(#bin) ,极大的减少了内存消耗;

缺点:

  • 可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合;
  • Boosting族是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,模型的偏差(bias)会不断降低。由于LightGBM是基于偏差的算法,所以会对噪点较为敏感;
  • 在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/574658
推荐阅读
  

闽ICP备14008679号