8-3 GBDT

引用&参考文章

GDBT原始文章 (已上传https://download.csdn.net/download/haozhepeng/11287103))

https://blog.csdn.net/qq_22238533/article/details/79185969 & https://www.cnblogs.com/massquantity/p/9174746.html & 

https://blog.csdn.net/qq_19446965/article/details/82079624#GBDT & https://blog.csdn.net/bitcarmanlee/article/details/77918131 &https://www.cnblogs.com/pinard/p/6140514.html & https://www.jianshu.com/p/0bc32c8e4ca8 &https://www.cnblogs.com/pinard/p/6143927.html

目录

一、GB(Gradient Boosting)

1.Gradient Descend(参数空间梯度下降)&Gradient Boosting (函数空间梯度下降)对比

2.Gradient Boosting算法流程

二、GBDT原理

1.算法流程

 第一步:初始化

第二步:顺序建立M颗树

第三步:求损失函数的负梯度,也就是我们每一颗回归数拟合的目标

1.GBDT回归(GradientBoostingRegressor)

2.GBDT分类(GradientBoostingClassifier)

第四步:是为了求一个最优的基分类器

第五步:Shrinkage

第六步:迭代更新

三、GBDT实践例子

1.举例

2.参数说明&调参经验

boosting 参数

树参数

调参经验

1)GDBT特征重要性计算逻辑:



一、GB(Gradient Boosting)

1.Gradient Descend(参数空间梯度下降)&Gradient Boosting (函数空间梯度下降)对比

这里首先回顾一下梯度下降 (Gradient Descend)。机器学习的一大主要步骤是通过优化方法最小化损失函数L(θ)L(θ),进而求出对应的参数θθ。梯度下降是经典的数值优化方法,其参数更新公式:

Gradient Boosting 采用和AdaBoost同样的加法模型,在第m次迭代中,前m-1个基学习器都是固定的,即

因而在第m步我们的目标是最小化损失函数 ,进而求得相应的基学习器。若将f(x)当成参数,则同样可以使用梯度下降法:

对比式 (1.2)和 (1.3),可以发现若将,即用基学习器hm(x)拟合前一轮模型损失函数的负梯度,就是通过梯度下降法最小化L(f)。由于f(x)实际为函数,所以该方法被认为是函数空间的梯度下降。


负梯度也被称为“响应 (response)”或“伪残差 (pseudo residual)”,从名字可以看出是一个与残差接近的概念。直觉上来看,残差r=y−f(x)r=y−f(x)越大,表明前一轮学习器f(x)f(x)的结果与真实值yy相差较大,那么下一轮学习器通过拟合残差或负梯度,就能纠正之前的学习器犯错较大的地方。

2.Gradient Boosting算法流程

 

二、GBDT原理

1.算法流程

 第一步:初始化

因为每次在计算负梯度值时需要用到前一个模型Fm−1(xi)预测的值。对于我们训练的第一个模型m=1而言需要有F0(xi)的存在

那么F0(x)怎么初始化,这个取决于loss function的选择,下面给出一般的做法: 
1)当loss function选择MSE时,F0(x)=avg(y) (均值)
2)当loss function选择MAE时,F0(x)=median(y)(中位数)

3)当loss function选择logisit loss或者指数损失

这里需要注意的是,这里就是利用对数几率来初始化,分子∑yi就是正样本的个数,分母就是负样本的个数。 
比如说,对于数据集: 
这里写图片描述

第二步:顺序建立M颗树

第三步:求损失函数的负梯度,也就是我们每一颗回归数拟合的目标

1.GBDT回归(GradientBoostingRegressor)

sklearn 中GBDT回归(GradientBoostingRegressor)损失函数包括均方差”ls”,绝对损失”lad”,Huber损失”huber”,分位数损失”quantile”(对应类LeastSquaresErrorLeastAbsoluteErrorHuberLossFunctionQuantileLossFunction

Loss选择技巧:平方损失作为loss function会有异常点敏感的缺点,因此在回归问题上,一般选用绝对值和合页损失作为loss function

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

       负梯度

b)绝对损失,这个损失函数也很常见(平方损失作为loss function会有异常点敏感的缺点,因此在回归问题上,一般选用绝对值和合页损失作为loss function)

     负梯度

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

    负梯度

d) 分位数损失quantile。它对应的是分位数回归的损失函数,(主要用于健壮回归,减少异常点对损失函数的影响)。表达式为

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

负梯度

2.GBDT分类(GradientBoostingClassifier)

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

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

损失函数负梯度

b) 如果是对数损失函数(交叉熵),分为二元分类和多元分类两种(Deviance(二分类问题BinomialDeviance和多分类问题MultinomialDeviance)。

1)BinomialDeviance损失函数为(下面式子少了个负号)

 

 

2)多分类MultinomialDeviance

 

GBDTK分类问题是for1..M 每次for 1...k 产生。颗数,最后产出结果prediction_result 表示训练的类别结果,prediction_score 为属于该类别的概率。(可参考文章https://blog.csdn.net/qq_22238533/article/details/79199605

第四步:是为了求一个最优的基分类器

 

对于不同的基分类器有不同的寻找,对于决策树,寻找一个最优的树的过程其实依靠的就是启发式的分裂准则。目前是用MSE,目标值指的是g,而预测值是该结点上样本梯度g的平均值(样本梯度g的平均值的意思: 比如,上述数据集中,当选择x<=6进行分裂时,左子结点的平均值为aver=-1.0703,那么在计算以x<=6作为时,左子结点的MSE为:MSE_left={(x1-aver)^2+(x2-aver)^2+...(x6-aver)^2}/6))。(在拟合的过程,原始label y只是在计算残差y-Fm(x)用到,每次建树的时候拟合都是梯度值g  )

第五步:Shrinkage

是一个Line search 的过程,具体可以参考Friedman的文章。在GBDT里,通常将这个过程作为Shrinkage,也就是把ρm做为学习率ρm做为学习率,后面实践部分可以看到效果。

第六步:迭代更新

求得新的基分类器后,利用加法模型,更新出下一个模型Fm(x)

三、GBDT实践例子

1.举例

见 https://blog.csdn.net/qq_22238533/article/details/79185969

2.参数说明&调参经验

调参参照:https://blog.csdn.net/u014465639/article/details/74351982

参数主要分为 boost 参数和 数参数,调参根据一般是auc ,或者k 折交叉(cross_val_score)的auc.调参顺序一般是先调boost 参数,如learning_rate ,n_estimators,然后再调 树参数max_depth,min_samples_split 等,主要是根据经验的取值范围,使用网格法在经验范围内调参。

  • boosting 参数

              1) n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。

    2) learning_rate: 即每个弱学习器的权重缩减系数νν,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为fk(x)=fk−1(x)+νhk(x)fk(x)=fk−1(x)+νhk(x)。νν的取值范围为0<ν≤10<ν≤1。对于同样的训练集拟合效果,较小的νν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的νν开始调参,默认是1。

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

    4) init: 即我们的初始化的时候的弱学习器,拟合对应原理篇里面的f0(x)f0(x),如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。

    5) loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。

      对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。

      对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。

    6) alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。

  • 树参数

              1) 划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

               2) 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,默认值是3。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

    3) 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

    4) 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

    5)叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

    6) 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

    7) 节点划分最小不纯度min_impurity_split:  这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

 

  • 调参经验

一般是先调boosting参数,(固定树参数为默认值),调整好boost参数后,再调树参数。我一般只调一些主要参数,下面讲一下我的调参数过程,供大家参考。

boosting参数

0)loss:见上面损失函数介绍,我一般分类问题选交叉熵(对数似然)。回归问题选方差”ls”(最小二乘)或者绝对损失”lad”(减少异常点影响)。

1) learning rate: 这个参数没有什么特别的调节方法,因为只要我们训练的树足够多learning rate总是小值来得好。默认值是0.1,在0.05-0.2 之间调节,越小越复杂,需要资源越多。主要考虑模型特征量数据量,和跑模型时间和资源的平衡。一般用0.1。

2)n_estimators: 树个数,我一般用40-70 左右。这个是依赖于和learning_rate,learning_rate减小,n_estimators要适当增大。

3)subsample:默认值是1,也就是不采样,用全部数据。一般用范围在0.5-0.8之间,0.8左右用的比较多。

树参数

1)max_depth:根据数据量和特征数做选择,根据经验一般5-8之间。

2)max_features:特征抽样,默认是None也就是不抽样。回归一般用\log_{2} N,抽样一般用N的平方根,N为特征个数。

3)min_ samples_ split=500: 这个值应该在总样本数的0.5-1%之间,默认是2,样本大的时候一般考虑增加这个值。防止过拟合,提高模型速度。
4)min_ samples_ leaf=50: 默认是1,样本大的时候一般考虑增加这个值,也可以使用百分比。防止过拟合,提高模型速度。

1)GDBT特征重要性计算逻辑:

GBDT是根据非叶子阶段分裂时候的加权不纯度的平方损失减少值来算的。

https://yangxudong.github.io/tree-ensemble-importance/

对比:XGB 有3种,weight(做为分裂特征的次数),gain(特征带来的信息增益),cover(特征在分裂节点覆盖的样本数)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值