机器学习算法(十五):GBDT

目录

1 决策树

1.1 ID3,C4.5决策树的生成

1.2 CART决策树的生成

1.3 分类树和回归树

1.4 决策树的剪枝

1.5 决策树与集成学习结合        

2 GBDT主要思想

2.1  DT:回归树 Regression Decision Tree

2.2 GB:梯度迭代 Gradient Boosting

2.3 GBDT工作过程实例

2.4 GBDT的训练过程

3 GBDT如何选择特征?

3.1 回归树——最小二乘回归树生成法:

3.2 离散特征

4 GBDT如何构建特征 ?

5 GBDT的负梯度拟合

6 GBDT回归算法

7 GBDT分类算法

7.1 二元GBDT分类算法

7.2 多元GBDT分类算法

7.2.1 Softmax回归的对数损失函数

7.2.2 GBDT多分类原理

7.3 GBDT 多分类举例说明

8 GBDT常用损失函数

8.1 分类算法常用损失函数

8.2 回归算法常用损失函数

9 GBDT的正则化

9.1 正则化项

9.2 子采样比例

9.3 正则化剪枝

10 GBDT小结

11 GBDT常见面试题

11.1 GBDT与RF的异同

11.2 GBDT是否需要进行归一化操作?

11.2.1 为什么GBDT需要进行归一化操作?

11.2.2 为什么树模型不需要归一化?

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

11.4 GBDT那些部分可以并行

11.5 GBDT和AdaBoost的异同

11.6 XGBoost的创新 

11.7 GBDT的残差版本和梯度版本


​​​​​​​关于树的几个ensemble模型的比较(GBDT、xgBoost、lightGBM、RF):

关于树的几个ensemble模型的比较(GBDT、xgBoost、lightGBM、RF)_AI_盲的博客-CSDN博客

1 决策树

        决策树详见:机器学习算法(十四):决策树系列_意念回复的博客-CSDN博客

        常用的决策树算法有ID3(信息增益)C4.5(信息增益比)CART(基尼指数)三种。3种算法的模型构建思想都十分类似,只是采用了不同的指标。决策树模型的构建过程大致如下:

1.1 ID3,C4.5决策树的生成

输入:训练集D,特征集A,阈值eps 输出:决策树T

  1. 若D中所有样本属于同一类Ck,则T为单节点树,将类Ck作为该结点的类标记,返回T
  2. 若A为空集,即没有特征作为划分依据,则T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
  3. 否则,计算A中各特征对D的信息增益(ID3)/信息增益比(C4.5),选择信息增益最大的特征Ag
  4. 若Ag的信息增益(比)小于阈值eps,则置T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
  5. 否则,依照特征Ag将D划分为若干非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由结点及其子节点构成树T,返回T
  6. 对第i个子节点,以Di为训练集,以A-{Ag}为特征集,递归地调用1~5,得到子树Ti,返回Ti

1.2 CART决策树的生成

这里只简单介绍下CARTID3C4.5的区别。

  1. CART树是二叉树,而ID3和C4.5可以是多叉树
  2. CART在生成子树时,是选择一个特征一个取值作为切分点,生成两个子树
  3. 选择特征和切分点的依据是基尼指数,选择基尼指数最小的特征及切分点生成子树

1.3 分类树和回归树

        事实上,分类回归是一个型号的东西,只不过分类的结果是离散值,回归是连续的,本质是一样的,都是特征(feature)到结果/标签(label)之间的映射。说说决策树和回归树,在上面决策树的讲解中相信决策树分类已经很好理解了。

       分类树的样本输出(即响应值)是类的形式,如判断蘑菇是有毒还是无毒,周末去看电影还是不去。

        而回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,可以是0到120万元之间的任意值。那么,这时候你就没法用上述的信息增益、信息增益率、基尼系数来判定树的节点分裂了,你就会采用新的方式,预测误差,常用的有均方误差、对数误差等。而且节点不再是类别,是数值(预测值),那么怎么确定呢,有的是节点内样本均值,有的是最优化算出来的比如Xgboost。

1.4 决策树的剪枝

        决策树的剪枝主要是为了预防过拟合

        主要思路是从叶节点向上回溯,尝试对某个节点进行剪枝,比较剪枝前后的决策树的损失函数值。最后我们通过动态规划(树形dp)就可以得到全局最优的剪枝方案。 

1.5 决策树与集成学习结合        

        将决策树与集成学习框架进行结合所得到的新的算法:

1)Bagging + 决策树 = 随机森林(Random Forest)

2)AdaBoost + 决策树 = 提升树(Boosting Decision Tree)

3)Gradient Boosting + 决策树 = 梯度提升树(Gradient Boosting Decision Tree,GBDT)

2 GBDT主要思想

         GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。

        在目标函数所在的函数空间中做梯度下降,即把待求的函数模型当作参数,每一步要拟合目标函数关于上一步获得的模型的梯度,从而使得参数朝着最小化目标函数的方向更新。

        GBDTGradient Boosting Decison Tree中的树都是回归树,GBDT用来做回归预测,调整后也可以用于分类(设定阈值,大于阈值为正例,反之为负例),可以发现多种有区分性的特征以及特征组合。GBDT是把所有树的结论累加起来做最终结论的,GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量

         Boosting的最大好处在于,每一步的残差计算其实变相地增大了分错instance的权重,而已经分对的instance则都趋向于0。这样后面的树就能越来越专注那些前面被分错的instance。Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的建立是为了使模型的残差往梯度方向减少。

         Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系。

        一些特性:

  1. 每次迭代获得的决策树模型都要乘以一个缩减系数,从而降低每棵树的作用,提升可学习空间。
  2. 每次迭代拟合的是一阶梯度。

        GBDT主要由三个概念组成:Regression Decistion Tree(即DT)Gradient Boosting(即GB)Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)。

2.1  DT:回归树 Regression Decision Tree

        提起决策树(DT, Decision Tree) ,千万不要以为GBDT是很多棵分类树。决策树分为两大类,回归树分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女? GBDT的核心在于累加所有树的结果作为最终结果,就像前面对年龄的累加(-3是加负3),而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,不是分类树,这点对理解GBDT相当重要(尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树)。那么回归树是如何工作的呢?

        下面我们以对人的性别判别 / 年龄预测为例来说明,每个instance都是一个我们已知性别/年龄的人,而feature则包括这个人上网的时长、上网的时段、网购所花的金额等。

        作为对比,先说分类树,C4.5分类树在每次分枝时,是穷举每一个feature的每一个阈值,找到使得按照feature<=阈值,和feature>阈值分成的两个分枝的熵最大的feature和阈值(熵最大的概念可理解成尽可能每个分枝的男女比例都远离1:1),按照该标准分枝得到两个新节点,用同样方法继续分枝直到所有人都被分入性别唯一的叶子节点,或达到预设的终止条件,若最终叶子节点中的性别不唯一,则以多数人的性别作为该叶子节点的性别。

        回归树总体流程也是类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差——即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误差平方和除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

2.2 GB:梯度迭代 Gradient Boosting

        Boosting,迭代,即通过迭代多棵树来共同决策。这怎么实现呢?难道是每棵树独立训练一遍,比如A这个人,第一棵树认为是10岁,第二棵树认为是0岁,第三棵树认为是20岁,我们就取平均值10岁做最终结论?--当然不是!且不说这是投票方法并不是GBDT,只要训练集不变,独立训练三次的三棵树必定完全相同,这样做完全没有意义。GBDT是把所有树的结论累加起来做最终结论的,所以可以想到每棵树的结论并不是年龄本身,而是年龄的一个累加量。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。

2.3 GBDT工作过程实例

       还是年龄预测,简单起见训练集只有4个人,A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。如果是用一棵传统的回归决策树来训练,会得到如下图1所示结果:

        

                                                                          图1

       现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点最多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。我们会得到如下图2所示结果:

      

                                                                          图2

        在第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为两拨,每拨用平均年龄作为预测值。此时计算残差(残差的意思就是: A的预测值 + A的残差 = A的实际值),所以A的残差就是16-15=1(注意,A的预测值是指前面所有树累加的和,这里前面只有一棵树所以直接是15,如果还有树则需要都累加起来作为A的预测值)。进而得到A,B,C,D的残差分别为-1,1,-1,1。然后我们拿残差替代A,B,C,D的原值,到第二棵树去学习,如果我们的预测值和它们的残差相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了。这里的数据显然是我可以做的,第二棵树只有两个值1和-1,直接分成两个节点。此时所有人的残差都是0,即每个人都得到了真实的预测值。

        换句话说,现在A,B,C,D的预测值都和真实年龄一致了:

  • A: 14岁高一学生,购物较少,经常问学长问题;预测年龄A = 15 – 1 = 14
  • B: 16岁高三学生;购物较少,经常被学弟问问题;预测年龄B = 15 + 1 = 16
  • C: 24岁应届毕业生;购物较多,经常问师兄问题;预测年龄C = 25 – 1 = 24
  • D: 26岁工作两年员工;购物较多,经常被师弟问问题;预测年龄D = 25 + 1 = 26 

        那么哪里体现了Gradient呢?其实回到第一棵树结束时想一想,无论此时的cost function是什么,是均方差还是均差,只要它以误差作为衡量标准,残差向量(-1, 1, -1, 1)都是它的全局最优方向,这就是Gradient。

既然图1和图2 最终效果相同,为何还需要GBDT呢?

        答案是过拟合过拟合是指为了让训练集精度更高,学到了很多”仅在训练集上成立的规律“,导致换一个数据集当前规律就不适用了。其实只要允许一棵树的叶子节点足够多,训练集总是能训练到100%准确率的(大不了最后一个叶子上只有一个instance)。在训练精度和实际精度(或测试精度)之间,后者才是我们想要真正得到的。

        我们发现图1为了达到100%精度使用了3个feature(上网时长、时段、网购金额),其中分枝“上网时长>1.1h” 很显然已经过拟合了,这个数据集上A,B也许恰好A每天上网1.09h, B上网1.05小时,但用上网时间是不是>1.1小时来判断所有人的年龄很显然是有悖常识的;

        相对来说图2的boosting虽然用了两棵树 ,但其实只用了2个feature就搞定了,后一个feature是问答比例,显然图2的依据更靠谱。Boosting的最大好处在于,每一步的残差计算其实变相地增大了分错instance的权重,而已经分对的instance则都趋向于0。这样后面的树就能越来越专注那些前面被分错的instance。就像做互联网,总是先解决60%用户的需求凑合着,再解决35%用户的需求,最后才关注那5%人的需求,这样就能逐渐把产品做好,因为不同类型用户需求可能完全不同,需要分别独立分析。如果反过来做,或者刚上来就一定要做到尽善尽美,往往最终会竹篮打水一场空。

2.4 GBDT的训练过程

        我们通过一张图片来说明gbdt的训练过程: 

         

                                                    图 3:GBDT 的训练过程

        gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差高偏差(模型的预测效果不好,但是模型比较健壮(稳定),预测结果比较集中)的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。

        弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差简单的要求,每个分类回归树的深度不会很深。最终的总分类器是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。

         在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是, 损失函数是 ,我们本轮迭代的目标是找到一个CART回归树模型的弱学习器,让本轮的损失函数最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

GBDT如何选择特征?

       GBDT选择特征的细节其实是想问你CART Tree生成的过程。这里有一个前提,gbdt的弱分类器默认选择的是CART TREE。其实也可以选择其他弱分类器的,选择的前提是低方差高偏差。框架服从 boosting 框架即可。

3.1 回归树——最小二乘回归树生成法:

        下面我们具体来说CART TREE(是一种二叉树) 如何生成。CART TREE 生成的过程其实就是一个选择特征的过程。假设我们目前总共有 M 个特征。第一步我们需要从中选择出一个特征 j,做为二叉树的第一个节点。然后对 特征 j 的值选择一个切分点 m。一个样本的特征j的值如果小于m,则分为一类;如果大于m,则分为另外一类,如此便构建了CART 树的一个节点。其他节点的生成过程和这个是一样的。现在的问题是在每轮迭代的时候,如何选择这个特征 j,以及如何选择特征 j 的切分点 m

        原始的gbdt的做法非常的暴力,首先遍历每个特征,然后对每个特征遍历它所有可能的切分点,找到最优特征 m 的最优切分点 j。我们先遍历训练样本的所有的特征,对于特征 j,我们遍历特征 j 所有特征值的切分点 c。找到可以让下面这个式子最小的特征 j 以及切分点c。

       

3.2 离散特征

GBDT在处理离散特征时, 会默认特征是有序的

  • 如果排序后的特征对应的标记为为[0, 1, ..., 0, 1]交叉型, 则不能很好的分类
  • 如果使用one-hot, 对于高基数离散特征, 会生成不平衡的树, 且每次划分带来的增益较少

        对类别特征进行one-hot编码带了效果很差更多指的是类别特征维度很高的时候(相对样本量来说),主要的问题是:

  1. 可能无法在这个类别特征上进行切分。使用one-hot coding的话,意味着在每一个决策节点上只能用 one-vs-rest (例如是不是狗,是不是猫,等等) 的切分方式。当特征纬度高时,每个类别上的数据都会比较少,这时候产生的切分不平衡,切分增益(split gain)也会很小(比较直观的理解是,不平衡的切分和不切分几乎没有区别)
  2. 会影响决策树的学习。因为就算可以在这个类别特征进行切分,也会把数据切分到很多零散的小空间上,如下图左所示。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习会变差。但如果使用下图右边的切分方法,数据会被切分到两个比较大的空间,进一步的学习也会更好。

           ​​​​​​​

        也就是说,正确的做法应该是一次切分,均匀的切分成两部分,使得两边都包含足够的样本继续学习,然而使用one-hot编码,在类别维度很大的情况下,无法保证这种情况。那么gbdt应该怎样使用类别特征?

总结为以下三种方法:

  1. 类别特征的最优切分。这个方法需要对应工具的支持,我所知的支持这个方法的工具有h2o.gbm和LightGBM。用LightGBM可以直接输入类别特征,并产生同上图右边的最优切分。在一个k维的类别特征寻找最优切分,朴素的枚举算法的复杂度是指数的 O(2^k)。LightGBM 用了一个 O(klogk)[1] 的算法。算法流程如下图所示:在枚举分割点之前,先把直方图按照每个类别对应的label均值进行排序;然后按照排序的结果依次枚举最优分割点。当然,这个方法很容易过拟合,所以LightGBM里面还增加了很多对于这个方法的约束和正则化。当然了,如果不具备这种工具,那可以对数据进行可视化,然这个特征不同属性对应的label分布,手动选择合适的切分点!    
  2. 进行信息压缩:转成数值特征。在使用 sklearn 或 XGBoost 等不支持类别特征的最优切分工具时,可以用这个方法。常见的转换方法有:
    1. a) 把类别特征转成one-hot coding扔到NN里训练个embedding;
    2. b) 类似于CTR特征,统计每个类别对应的label(训练目标)的均值。统计的时候有一些小技巧,比如不把自身的label算进去(leave-me-out, leave-one-out)统计, 防止信息泄露。ps:我在比赛中的做法一般是统计出现的次数+正样本数,两个特征在表示原特征,进行压缩,效果不错~
  3. 使用其他的编码方法。
  4. 计算每个特征取值的熵, 通过熵的大小对特征进行有序重编码

4 GBDT如何构建特征 ?

        其实说gbdt 能够构建特征并非很准确,gbdt 本身是不能产生特征的,但是我们可以利用gbdt去产生特征的组合。在CTR预估中,工业界一般会采用逻辑回归去进行处理,逻辑回归本身是适合处理线性可分的数据,如果我们想让逻辑回归处理非线性的数据,其中一种方式便是组合不同特征,增强逻辑回归对非线性分布的拟合能力。

        长久以来,我们都是通过人工的先验知识或者实验来获得有效的组合特征,但是很多时候,使用人工经验知识来组合特征过于耗费人力,造成了机器学习当中一个很奇特的现象:有多少人工就有多少智能。关键是这样通过人工去组合特征并不一定能够提升模型的效果。所以我们的从业者或者学界一直都有一个趋势便是通过算法自动,高效的寻找到有效的特征组合。Facebook 在2014年 发表的一篇论文便是这种尝试下的产物,利用gbdt去产生有效的特征组合,以便用于逻辑回归的训练,提升模型最终的效果。

                 

                                      图 4:用GBDT 构造特征

        如图 4 所示,我们使用 GBDT 生成了两棵树,两颗树一共有五个叶子节点。我们将样本 X 输入到两颗树当中去,样本X 落在了第一棵树的第二个叶子节点,第二颗树的第一个叶子节点,于是我们便可以依次构建一个五纬的特征向量,每一个纬度代表了一个叶子节点,样本落在这个叶子节点上面的话那么值为1,没有落在该叶子节点的话,那么值为 0.

        于是对于该样本,我们可以得到一个向量[0,1,0,1,0] 作为该样本的组合特征,和原来的特征一起输入到逻辑回归当中进行训练。实验证明这样会得到比较显著的效果提升。

5 GBDT的负梯度拟合

        为解决损失函数拟合方法的问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度:

                 

        利用,我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域。其中J为叶子节点的个数。

        针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值j如下:

                   

        这样我们就得到了本轮的决策树拟合函数如下:

                   

        从而本轮最终得到的强学习器的表达式如下:

                   

        gbdt 通过经验风险极小化来确定下一个弱分类器的参数。具体到损失函数本身的选择也就是L的选择,有平方损失函数0-1损失函数对数损失函数等等。如果我们选择平方损失函数,那么这个差值其实就是我们平常所说的残差。这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。

        通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无论是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。

6 GBDT回归算法

        输入:训练集样本, 最大迭代次数T,损失函数L

        输出:是强学习器f(x)

        1) 初始化弱学习器       

               

        2) 对迭代轮数 t =1,2,...T 有:

          a) 对样本i=1,2,...m,计算负梯度

                         

            b) 利用 ,拟合一颗CART回归树,得到第 t 颗回归树,其对应的叶子节点区域为。其中J为回归树t的叶子节点的个数。

       c) 对叶子区域 j =1,2,..J,计算最佳拟合值

                            

               d) 更新强学习器

                            

        3) 得到强学习器f(x)的表达式

                

7 GBDT分类算法

        GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。

  为了解决这个问题,主要有两个方法,

  • 一个是用指数损失函数,此时GBDT退化为Adaboost算法。
  • 另一种方法是用类似于逻辑回归的对数似然损失函数的方法。

        也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。本文仅讨论用对数似然损失函数的GBDT分类。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。

        首先明确一点,gbdt 无论用于分类还是回归一直都是使用的 CART 回归树。不会因为我们所选择的任务是分类任务就选用分类树,这里面的核心是因为gbdt 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的,残差相减是有意义的。

        如果选用的弱分类器是分类树,类别相减是没有意义的。上一轮输出的是样本 x 属于 A类,本一轮训练输出的是样本 x 属于 B类。 A 和 B 很多时候甚至都没有比较的意义,A 类- B类是没有意义的。

7.1 二元GBDT分类算法

        对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:

               

        其中。则此时的负梯度误差为

               

        对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为

               

        由于上式比较难优化,我们一般使用近似值代替

               

        除了负梯度计算叶子节点的最佳负梯度拟合线性搜索二元GBDT分类GBDT回归算法过程相同。

GBDT二分类算法完整的算法过程如下:

详细讲解及示例见:深入理解GBDT二分类算法 - 知乎

        每次将残差作为样本的标签来训练弱学习器 

7.2 多元GBDT分类算法

7.2.1 Softmax回归的对数损失函数

        当使用逻辑回归处理多标签的分类问题时,如果一个样本只对应于一个标签,我们可以假设每个样本属于不同标签的概率服从于几何分布,使用多项逻辑回归(Softmax Regression)来进行分类:

         其中,  为模型的参数,而  可以看作是对概率的归一化。一般来说,多项逻辑回归具有参数冗余的特点,即将  同时加减一个向量后预测结

         假设从参数向量  中减去向量  ,这时每一个都变成了。此时假设函数变成了以下公式:

                    

         从上式可以看出,从  中减去  完全不影响假设函数的预测结果,这表明前面的  Softmax回归模型中存在冗余的参数。特别地,当类别数为2时,

                 

         利用参数冗余的特点,我们将所有的参数减去  ,上式变为:

                

         其中  。而整理后的式子与逻辑回归一致。因此,多项逻辑回归实际上是二分类逻辑回归在多标签分类下的一种拓展

         当存在样本可能属于多个标签的情况时,我们可以训练  个二分类的逻辑回归分类器。第  个分类器用以区分每个样本是否可以归为第  类,训练该分类器时,需要把标签重新整理为“第 类标签”与“非第  类标签”两类。通过这样的办法,我们就解决了每个样本可能拥有多个标签的情况。

        在二分类的逻辑回归中,对输入样本  分类结果为类别1和0的概率可以写成下列形式:

        其中,  是模型预测的概率值,  是样本对应的类标签。

      将问题泛化为更一般的多分类情况:

                 

         由于连乘可能导致最终结果接近0的问题,一般对似然函数取对数的负数,变成最小化对数似然函数。

             

补充:交叉熵
        假设  和  是关于样本集的两个分布,其中  是样本集的真实分布,  是样本集的估计分布,那么按照真实分布  来衡量识别一个样本所需要编码长度的期望(即,平均编码长度):   

如果用估计分布  来表示真实分布  的平均编码长度,应为:

       这是因为用  来编码的样本来自于真实分布  ,所以期望值 中的概率是  。而  就是交叉熵。
        可以看出,在多分类问题中,通过最大似然估计得到的对数似然损失函数与通过交叉熵得到的交叉熵损失函数在形式上相同。 

7.2.2 GBDT多分类原理

​​​​​​​深入理解GBDT多分类算法 - 知乎

理解一:

        将GBDT应用于二分类问题需要考虑逻辑回归模型,同理,对于GBDT多分类问题则需要考虑以下Softmax模型:

                    

         其中   是  个不同的CART回归树集成。每一轮的训练实际上是训练了  棵树去拟合softmax的每一个分支模型的负梯度。

            

         这里的  是样本label在k个类别上作one-hot编码之后的取值,只有一维为1,其余都是0。由以上表达式不难推导:

        可见,这 k 棵树同样是拟合了样本的真实标签与预测概率之差,与GBDT二分类的过程非常类似。 

 理解二:

        多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:

                

        其中如果样本输出类别为k,则。第k类的概率的表达式为:

                

        集合上两式,我们可以计算出第t轮的第i个样本对应类别l的负梯度误差为

                 

        观察上式可以看出,其实这里的误差就是样本i 对应类别l 的真实概率 t−1轮预测概率差值

   对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为

               

        由于上式比较难优化,我们一般使用近似值代替

               

        除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,多元GBDT分类二元GBDT分类以及GBDT回归算法过程相同。

        多元GBDT分类算法:

        假设样本 X 总共有 K类。来了一个样本 x,我们需要使用gbdt来判断 x 属于样本的哪一类。

       

                                            图5 gbdt 多分类算法流程     

        第一步 我们在训练的时候,是针对样本 X 每个可能的类都训练一个分类回归树。举例说明,针对样本有三类的情况,我们实质上是在每轮的训练的时候是同时训练三颗树。目前样本有三类,也就是 K = 3。样本 x 属于 第二类。那么针对该样本 x 的分类结果,其实我们可以用一个 三维向量 [0,1,0] 来表示。0表示样本不属于该类,1表示样本属于该类。 由于样本已经属于第二类了,所以第二类对应的向量维度为1,其他位置为0。

        第一颗树针对样本x的第一类,输入为(x,0)。第二颗树输入针对 样本x 的第二类,输入为(x,1)。第三颗树针对样本x 的第三类,输入为(x,0)。

        在这里每颗树的训练过程其实就是我们之前已经提到过的CATR TREE 的生成过程。在此处我们参照之前的生成树的程序,即可以就解出三颗树,以及三颗树对x 类别的预测值。那么在此类训练中,我们仿照多分类的逻辑回归 ,使用softmax 来产生概率,则属于类别 1 的概率

                

        并且我们可以针对类别1求出残差;类别2求出残差;类别3 求出残差

        然后开始第二轮训练,针对第一类输入为, 针对第二类输入为 ,针对 第三类输入为 .,继续训练出三颗树。一直迭代M轮。每轮构建 3颗树。

        所以当K =3。我们其实应该有三个式子

         

        当训练完毕以后,新来一个样本 x1 ,我们需要预测该样本的类别的时候,便可以有这三个式子产生三个值,。样本属于 某个类别c的概率为 

         

7.3 GBDT 多分类举例说明

示例一:

深入理解GBDT多分类算法 - 知乎

 

示例二:

          上面的理论阐述可能仍旧过于难懂,我们下面将拿Iris 数据集中的六个数据作为例子,来展示gbdt 多分类的过程。

                                                                      图6 Iris 数据集

        这是一个有6个样本的三分类问题。我们需要根据这个花的花萼长度,花萼宽度,花瓣长度,花瓣宽度来判断这个花属于山鸢尾,杂色鸢尾,还是维吉尼亚鸢尾。具体应用到gbdt多分类算法上面。我们用一个三维向量来标志样本的label。[1,0,0] 表示样本属于山鸢尾,[0,1,0] 表示样本属于杂色鸢尾,[0,0,1] 表示属于维吉尼亚鸢尾。

        gbdt 的多分类是针对每个类都独立训练一个 CART Tree。所以这里,我们将针对山鸢尾类别训练一个 CART Tree 1。杂色鸢尾训练一个 CART Tree 2 。维吉尼亚鸢尾训练一个CART Tree 3,这三个树相互独立。

        我们以样本 1 为例。针对 CART Tree1 的训练样本是[5.1,3.5,1.4,0.2],label 是 1,最终输入到模型当中的为[5.1,3.5,1.4,0.2,1];针对 CART Tree2 的训练样本也是[5.1,3.5,1.4,0.2],但是label 为 0,最终输入模型的为[5.1,3.5,1.4,0.2,0]。 针对 CART Tree 3的训练样本也是[5.1,3.5,1.4,0.2],label 也为0,最终输入模型当中的为[5.1,3.5,1.4,0.2,0]。

        下面我们来看 CART Tree1 是如何生成的,其他树 CART Tree2 , CART Tree 3的生成方式是一样的。CART Tree的生成过程是从这四个特征中找一个特征做为CART Tree1 的节点。比如花萼长度做为节点。6个样本当中花萼长度大于5.1 cm的就是 A类,小于等于5.1 cm 的是B类。生成的过程其实非常简单,问题 1.是哪个特征最合适? 2.是这个特征的什么特征值作为切分点? 即使我们已经确定了花萼长度做为节点。花萼长度本身也有很多值。在这里我们的方式是遍历所有的可能性,找到一个最好的特征和它对应的最优特征值可以让当前式子的值最小。

         

        我们以第一个特征的第一个特征值为例。R1 为所有样本中花萼长度小于 5.1 cm 的样本集合,R2 为所有样本当中花萼长度大于等于 5.1cm 的样本集合。所以 R1={2},R2={1,3,4,5,6}。

          

        y1 为 R1 所有样本的label 的均值 1/1=1。y2 为 R2 所有样本的label 的均值 (1+0+0+0+0)/5=0.2。

        下面便开始针对所有的样本计算这个式子的值。样本1 属于 R2 计算的值为, 样本2 属于R1 计算的值为, 样本 3,4,5,6同理都是属于 R2的,所以值是, 把这六个值加起来,便是山鸢尾类型在特征1 的第一个特征值的损失值。这里算出来(1-0.2)^2+ (1-1)^2 + (0-0.2)^2+(0-0.2)^2+(0-0.2)^2 +(0-0.2)^2= 0.84

        我们可以遍历所有特征的所有特征值,找到让这个式子最小的特征以及其对应的特征值,一共有24种情况,4个特征*每个特征有6个特征值。在这里我们算出来让这个式子最小的特征花萼长度,特征值为5.1 cm。这个时候损失函数最小为 0.8。

          

        于是我们的预测函数此时也可以得到:

                

         此处 R1 = {2},R2 = {1,3,4,5,6},y1 = 1,y2 = 0.2。训练完以后的最终式子为

               

       借由这个式子,我们得到对样本属于类别1 的预测值 f1(x)=1+0.2∗5=2。同理我们可以得到对样本属于类别2,3的预测值f2(x),f2(x),样本属于类别1的概率,即为 

               

8 GBDT常用损失函数

8.1 分类算法常用损失函数

        对于分类算法,其损失函数一般有对数损失函数指数损失函数两种:

    a) 如果是指数损失函数,则损失函数表达式为

                       

    b) 如果是对数损失函数,分为二元分类和多元分类两种,参见2.5.1节和2.5.2节。

8.2 回归算法常用损失函数

        a) 均方差,这个是最常见的回归损失函数了

                       

  b) 绝对损失,这个损失函数也很常见

                       

         对应负梯度误差为:

                        

  c) Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:

                       

      对应的负梯度误差为:

                       

  d) 分位数损失。它对应的是分位数回归的损失函数,表达式为

                       

   其中θ为分位数,需要我们在回归前指定。对应的负梯度误差为:

                        

   对于Huber损失分位数损失主要用于健壮回归,也就是减少异常点对损失函数的影响。

9 GBDT的正则化

        和Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。

9.1 正则化项

  第一种是和Adaboost类似的正则化项,即步长(learning rate)。定义为ν,对于前面的弱学习器的迭代

                        

        如果我们加上了正则化项,则有

                        

        ν的取值范围为0<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

9.2 子采样比例

        第二种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。

  使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。

9.3 正则化剪枝

        对于弱学习器即CART回归树进行正则化剪枝。

10 GBDT小结

        GDBT本身并不复杂,不过要吃透的话需要对集成学习的原理,决策树原理和各种损失函树有一定的了解。由于GBDT的卓越性能,只要是研究机器学习都应该掌握这个算法,包括背后的原理和应用调参方法。目前GBDT的算法比较好的库是xgboostscikit-learn也可以。

  最后总结下GBDT的优缺点。

(1)GBDT主要的优点有:

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。
  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
  3. 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数Quantile损失函数
  4. 预测阶段的计算速度快, 树与树之间可并行化计算。所有的树一旦建好,用它来预测时是并行的,最终的预测值就是所有树的预测值之和。​​​​​​​

          如上图,书中可以说是将6棵树合并成了一棵树,因为这个例题有比较简单的结构,每棵树都是由树桩组成,因此非常容易合并,复杂一些无法合并的树,就是并行地得到每棵树的预测值然后相加就是最终的预测值。

  5. 在分布稠密的数据集上, 泛化能力和表达能力都很好, 这使得GBDT在Kaggle的众多竞赛中, 经常名列榜首。
  6. 采用决策树作为弱分类器使得GBDT模型具有较好的解释性鲁棒性,能够自动发现特征间的高阶关系, 并且也不需要对数据进行特殊的预处理如归一化等。

(2)GBDT的主要缺点有:

  1. 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
  2. GBDT在高维稀疏的数据集上, 表现不如支持向量机或者神经网络。
  3. GBDT在处理文本分类特征问题上, 相对其他模型的优势不如它在处理数值特征时明显。
  4. 训练过程需要串行训练, 只能在决策树内部采用一些局部并行的手段提高训练速度。

11 GBDT常见面试题

11.1 GBDT与RF的异同

相同点: 
1、GBDT与RF都是采用多棵树组合作为最终结果;这是两者共同点。 

不同点: 
1、RF的树可以是回归树也可以是分类树,而GBDT只能是回归树。 
2、RF中树是独立的,相互之间不影响,可以并行;而GBDT树之间有依赖,是串行。 
3、RF最终的结果是有多棵树表决决定,而GBDT是有多棵树叠加组合最终的结果。 
4、RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。 
5、RF是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的。偏差太大容易欠拟合,方差太大容易过拟合。但是xgb引入了正则项列采样等等正则化手段之后,可以在少量增加偏差的情况下大幅度缩减模型的方差。
6、RF不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化。

11.2 GBDT是否需要进行归一化操作?

        概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。
        而像adaboost、svm、lr、KNN、KMeans之类的最优化问题就需要归一化。

11.2.1 为什么GBDT需要进行归一化操作?

        因为GBDT的树是在上一颗树的基础上通过梯度下降求解最优解,归一化能收敛的更快,GBDT通过减少偏差来提高性能,而随机森林本来就是通过减少方差提高性能的,树之间建立关系是独立的,不需要归一化

        对于线性模型,特征值差别很大时,比如说LR,我有两个特征,一个是(0,1)的,一个是(0,10000)的,运用梯度下降的时候,损失等高线是椭圆形,需要进行多次迭代才能到达最优点。但是如果进行了归一化,那么等高线就是圆形的,促使SGD往原点迭代,从而导致需要的迭代次数较少

11.2.2 为什么树模型不需要归一化?

        因为数值缩放不影响分裂点位置,对树模型的结构不造成影响,而且是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化 。

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

        (RF是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的原理)

        对于机器学习来说,泛化误差可以理解为两部分,分别是偏差(bias)方差(variance)偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小;但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大,所以模型过于复杂的时候会导致过拟合。

        对于RF来说由于并行训练很多不同的分类器的目的就是降低这个方差(variance)。所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。

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

11.4 GBDT那些部分可以并行

  1. 计算每个样本的负梯度; 
  2. 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时; 
  3. 更新每个样本的负梯度时; 
  4. 最后预测过程中,每个样本将之前的所有树的结果累加的时候。

11.5 GBDT和AdaBoost的异同

       将 Adaboost 看作是 GBDT 的一种特例,是否非要这样看见仁见智,无需强求。 

11.6 XGBoost的创新 

        GBDT以CART回归树作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

  1. 传统GBDT在优化时只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
  2. XGBoost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从偏差、方差逼近的角度来讲,正则项降低了模型的方差,使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性
  3. 列抽样(column subsampling)。XGBoost借鉴了随机森林的做法,支持列抽样(即每次的输入特征不是全部特征),不仅能降低过拟合,还能减少计算,这也是XGBoost异于传统GBDT的一个特性。
  4. 传统的GBDT在每轮迭代时使用全部的数据, XGBoost则采用了与随机森林相似的策略, 支持对数据进行采样。
  5. 忽略缺失值:在寻找分裂点的时候,不会对该缺失特征的样本进行遍历统计,只对该列特非缺失征值的样本上对应的特征值进行遍历,通过这个工程技巧来减少了为稀疏离散特征寻找分裂点的时间开销。
  6. 指定缺失值的分隔方向:可以为缺失值或者指定的值指定分支的默认方向,为了保证完备性,会分别处理缺失特征值的样本分配到左叶子结点和右叶子结点的两种情形,分到那个子节点带来的增益大,默认的方向就是哪个子节点,这能大大提升算法的效率。
  7. 并行化处理:在训练之前,预先对每个特征内部进行了排序找出候选切割点,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点

11.7 GBDT的残差版本和梯度版本

GBDT分为两种:

(1)残差版本   

        残差其实就是真实值和预测值之间的差值,在学习的过程中,首先学习一颗回归树,然后将“真实值-预测值”得到残差,再把残差作为一个学习目标,学习下一棵回归树,依次类推,直到残差小于某个接近0的阀值或回归树数目达到某一阀值。其核心思想是每轮通过拟合残差来降低损失函数。总的来说,第一棵树是正常的,之后所有的树的决策全是由残差来决定;

(2)梯度版本

        与残差版本把GBDT说成一个残差迭代树,认为每一棵回归树都在学习前N-1棵树的残差不同,Gradient版本把GBDT说成一个梯度迭代树,使用梯度下降法求解,认为每一棵回归树在学习前N-1棵树的梯度下降值。总的来说两者相同之处在于,都是迭代回归树,都是累加每颗树结果作为最终结果(Multiple Additive Regression Tree),每棵树都在学习前N-1棵树尚存的不足,从总体流程和输入输出上两者是没有区别的。 

       两者的不同主要在于每步迭代时,是否使用Gradient作为求解方法。前者不用Gradient而是用残差(残差是全局最优值),Gradient是局部最优方向*步长,即前者每一步都在试图让结果变成最好,后者则每步试图让结果更好一点。

        两者优缺点。看起来前者更科学一点——有绝对最优方向不学,为什么舍近求远去估计一个局部最优方向呢?原因在于灵活性。前者最大问题是,由于它依赖残差,cost function一般固定为反映残差的均方差,因此很难处理纯回归问题之外的问题。而后者求解方法为梯度下降,只要可求导的cost function都可以使用。
 

4 lightGBM

        LigthGBM是boosting集合模型中的新进成员,由微软提供,它和XGBoost一样是对GBDT的高效实现,原理上它和GBDT及XGBoost类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。

4.1 提出LightGBM的动机

4.2 LightGBM在哪些地方进行了优化?

4.2.1 histogram算法

4.2.2 直方图差加速

4.2.3 决策树生长策略

4.2.4 直接支持类别特征

4.2.5 直接支持高效并行

4.2.6 网络通信优化

4.3 LightGBM原理

4.3.1 单边梯度采样,Gradient-based One-Side Sampling(GOSS)

4.3.2 互斥特征绑定,Exclusive Feature Bundling(EFB)

机器学习算法之LightGBM:机器学习算法之LightGBM – 标点符

Lightgbm基本原理介绍:Lightgbm基本原理介绍_Y学习使我快乐V的博客-CSDN博客_lightgbm

LightGBM 中文文档https://lightgbm.apachecn.org/#/docs/7

基于决策树算法的分布式梯度提升框架。

1.LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此 LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

2.LightGBM使用的是histogram算法,占用的内存更低,数据分隔的复杂度更低。比较巧妙的优化是 histogram 做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。

下面是将决策树与这些算法框架进行结合所得到的新的算法:

1)Bagging + 决策树 = 随机森林(Random Forest)

2)AdaBoost + 决策树 = 提升树(Boosting Decision Tree)

3)Gradient Boosting + 决策树 = 梯度提升树(Gradient Boosting Decision Tree,GBDT)

4 随机森林(Random Forests)

        随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类回归等问题。

        随机森林有许多优点:

  • 具有极高的准确率
  • 随机性的引入,使得随机森林不容易过拟合
  • 随机性的引入,使得随机森林有很好的抗噪声能力
  • 能处理很高维度的数据,并且不用做特征选择
  • 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
  • 训练速度快,可以得到变量重要性排序
  • 容易实现并行化

随机森林的缺点:

  • 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
  • 随机森林模型还有许多不好解释的地方,有点算个黑盒模型

与上面介绍的Bagging过程相似,随机森林的构建过程大致如下:

  1. 从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
  2. 对于n_tree个训练集,我们分别训练n_tree个决策树模型
  3. 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
  4. 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
  5. 将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

GBDT:

梯度提升树(GBDT)原理小结梯度提升树(GBDT)原理小结 - 刘建平Pinard - 博客园     

一文弄懂AdaBoost、提升树、残差树、GDBT:一文弄懂AdaBoost、提升树、残差树、GDBT - 知乎

深入理解GBDT多分类算法 - 知乎

机器学习算法GBDT的面试要点总结-上篇机器学习算法GBDT的面试要点总结-上篇 - ModifyBlog - 博客园

机器学习与人工智能技术分享(未完待续):机器学习与人工智能技术分享(未完待续) - 作业部落 Cmd Markdown 编辑阅读器       

GBDT 详解_不积跬步,无以至千里-CSDN博客_gbdt实例   

http://statweb.stanford.edu/~jhf/ftp/trebst.pdf   

Boosting Decision Tree入门教程 http://www.schonlau.net/publication/05stata_boosting.pdf

LambdaMART用于搜索排序入门教程 http://research.microsoft.com/pubs/132652/MSR-TR-2010-82.pdf

XGBoost:

Introduction to Boosted Trees:Introduction to Boosted Trees — xgboost 1.5.0-dev documentation

xgboost原理:xgboost原理? - 知乎

Python机器学习笔记:XgBoost算法Python机器学习笔记:XgBoost算法 - 战争热诚 - 博客园

机器学习--boosting家族之XGBoost算法机器学习--boosting家族之XGBoost算法 - 理想几岁 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值