GBDT算法梳理

学习内容:

1.前向分布算法

2.负梯度拟合

3.损失函数

4.回归

5.二分类,多分类

6.正则化

7.优缺点

8.sklearn参数

9.应用场景


1.前向分布算法

在学习模型时,每一步只学习一个基函数及其系数,逐步逼近优化函数式,从而简化优化的复杂度。

2.负梯度拟合

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

  $r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} $

  利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m),我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域Rtj,j=1,2,...,JRtj,j=1,2,...,J。其中J为叶子节点的个数。

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

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

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

  

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

3.损失函数

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

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

$L(y, f(x)) = exp(-yf(x))$

  b) 如果是对数损失函数,分为二元分类和多元分类两种.

  对于回归算法,常用损失函数有如下4种:

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

$L(y, f(x)) =(y-f(x))^2$

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

  对应负梯度误差为:

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

  对应的负梯度误差为:

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

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

  

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

4.回归

  输入是训练集样本$T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}$, 最大迭代次数T, 损失函数L。

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

  1) 初始化弱学习器$f_0(x) = \underbrace{arg\; min}_{c}\sum\limits_{i=1}^{m}L(y_i, c) $

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

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

    $r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partialf(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} $

    b)利用$(x_i,r_{ti})\;\; (i=1,2,..m)$, 拟合一颗CART回归树,得到第t颗回归树,其对应的叶子节点区域为$R_{tj}, j =1,2,..., J$。其中J为回归树t的叶子节点的个数。

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

    $c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c) $

    d) 更新强学习器

    $f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj}) $

  3) 得到强学习器f(x)的表达式$f(x) = f_T(x) =f_0(x) + \sum\limits_{t=1}^{T}\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj}) $

5.二分类,多分类

  二分类

  对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:$L(y, f(x)) = log(1+ exp(-yf(x))) $

  其中$y \in\{-1, +1\}$。则此时的负梯度误差为

  $r_{ti} = -\bigg[\frac{\partial L(y, f(x_i)))}{\partialf(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} = y_i/(1+exp(y_if(x_i))) $

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

  $c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} log(1+exp(-y_i(f_{t-1}(x_i) +c))) $

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

  $c_{tj} =sum\limits_{x_i \in R_{tj}}r_{ti}\bigg /\sum\limits_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|) $

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

  多分类

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

  $L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x) $

  其中如果样本输出类别为k,则$y_k=1$。第k类的概率$p_k(x)$的表达式为:

  $p_k(x) = exp(f_k(x)) \bigg / \sum\limits_{l=1}^{K}exp(f_l(x)) $

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

  $r_{til} =-\bigg[\frac{\partial L(y_i, f(x_i)))}{\partialf(x_i)}\bigg]_{f_k(x) = f_{l, t-1}\;\; (x)} = y_{il} - p_{l, t-1}(x_i) $

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

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

  $c_{tjl} = \underbrace{arg\; min}_{c_{jl}}\sum\limits_{i=0}^{m}\sum\limits_{k=1}^{K}L(y_k, f_{t-1, l}(x) + \sum\limits_{j=0}^{J}c_{jl} I(x_i \in R_{tj})) $

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

  $c_{tjl} = \frac{K-1}{K} \; \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)} $

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

6.正则化

  GBDT的正则化主要有三种方式:

  第一种是和Adaboost类似的正则化项,即步长(learning rate)。定义为$\nu$,对于前面的弱学习器的迭代$f_{k}(x) = f_{k-1}(x) + h_k(x) $

  如果我们加上了正则化项,则有$f_{k}(x) = f_{k-1}(x) + \nu h_k(x) $

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

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

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

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

7.优缺点

  GBDT主要的优点有:

  1) 可以灵活处理各种类型的数据,包括连续值和离散值。

  2) 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。

  3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

  GBDT的主要缺点有:

  由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。

8.sklearn参数

class sklearn.ensemble.GradientBoostingClassifier(

loss=’deviance’, 可选: {‘deviance’, ‘exponential’}, optional (default=’deviance’),优化的损失函数

learning_rate=0.1, float, optional (default=0.1),学习率

n_estimators=100, int (default=100),boosting的数量

subsample=1.0, float, optional (default=1.0),下采样的比率

criterion=’friedman_mse’, string, optional (default=”friedman_mse”),衡量分类质量的标准

min_samples_split=2, int, float, optional (default=2),分支的最少量

min_samples_leaf=1, int, float, optional (default=1),每个分支样本的最少量

min_weight_fraction_leaf=0.0, float, optional (default=0.),最小分支权重

max_depth=3, integer, optional (default=3),树的最大深度

min_impurity_decrease=0.0, float, optional (default=0.),如果该分裂导致杂质的减少大于或等于该值,则将分裂节点。

min_impurity_split=None, float, (default=1e-7),树停止分裂的条件

init=None, estimator, optional,初始化模型方法,fit or predict

random_state=None,  int, RandomState instance or None, optional (default=None),打乱样本时选用的随机种子

max_features=None, int, float, string or None, optional (default=None),在寻找最佳分支时,考虑的

verbose=0,  int, default: 0,启用详细输出

max_leaf_nodes=None,  int or None, optional (default=None),最大叶子节点

warm_start=False,bool, default: False,是否使用已有的模型进行优化

presort=’auto’, bool or ‘auto’, optional (default=’auto’),是否对数据进行排序以加快数据的寻找速度

validation_fraction=0.1, float, optional, default 0.1,验证集的比率

n_iter_no_change=None, int, default None,当验证集分数不在提高时,是否提前停止

tol=0.0001,float, optional, default 1e-4,提前停止优化的标准

)

9.应用场景

进阶:2.GBDT算法梳理的更多相关文章

  1. 转载:GBDT算法梳理

    学习内容: 前向分布算法 负梯度拟合 损失函数 回归 二分类,多分类 正则化 优缺点 sklearn参数 应用场景 转自:https://zhuanlan.zhihu.com/p/58105824 G ...

  2. GBDT算法梳理

    1.GBDT(Gradient Boosting Decision Tree)思想 Boosting : 给定初始训练数据,由此训练出第一个基学习器: 根据基学习器的表现对样本进行调整,在之前学习器做 ...

  3. GBDT算法原理深入解析

    GBDT算法原理深入解析 标签: 机器学习 集成学习 GBM GBDT XGBoost 梯度提升(Gradient boosting)是一种用于回归.分类和排序任务的机器学习技术,属于Boosting ...

  4. 机器学习系列------1. GBDT算法的原理

    GBDT算法是一种监督学习算法.监督学习算法需要解决如下两个问题: 1.损失函数尽可能的小,这样使得目标函数能够尽可能的符合样本 2.正则化函数对训练结果进行惩罚,避免过拟合,这样在预测的时候才能够准 ...

  5. 机器学习技法-GBDT算法

    课程地址:https://class.coursera.org/ntumltwo-002/lecture 之前看过别人的竞赛视频,知道GBDT这个算法应用十分广泛.林在第八讲,简单的介绍了AdaBoo ...

  6. 工业级GBDT算法︱微软开源 的LightGBM(R包正在开发....)

    看完一篇介绍文章后,第一个直觉就是这算法已经配得上工业级属性.日前看到微软已经公开了这一算法,而且已经发开python版本,本人觉得等hadoop+Spark这些平台配齐之后,就可以大规模宣传啦~如果 ...

  7. GBDT 算法:原理篇

    本文由云+社区发表 GBDT 是常用的机器学习算法之一,因其出色的特征自动组合能力和高效的运算大受欢迎. 这里简单介绍一下 GBDT 算法的原理,后续再写一个实战篇. 1.决策树的分类 决策树分为两大 ...

  8. GBDT算法

    GBDT通过多轮迭代,每轮迭代产生一个弱分类器,其中弱分类器通常选择为CART树,每个分类器在上一轮分类器的残差基础上进行训练. 对于GBDT算法,其中重要的知识点为: 1.GBDT是梯度下降法从参数 ...

  9. 梯度提升树GBDT算法

    转自https://zhuanlan.zhihu.com/p/29802325 本文对Boosting家族中一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 简 ...

随机推荐

  1. 【转】 Android xml中 @和?区别,style和attr小结

    引用资源时,使用@还是?的区别,例如在设置style的时候既可以使用@也可以使用? style="?android:attr/progressBarStyleHorizontal" ...

  2. 在yii中使用memcache

    yii中可以很方便的使用memcache 一.配置在main.php的components中加入cache配置 array( 'components'=>array( 'cache'=>a ...

  3. virtualbox+vagrant学习-2(command cli)-3-vagrant destroy命令

    Destroy 格式: vagrant destroy [options] [name|id] 此命令会停止vagrant管理的正在运行的机器,并销毁在机器创建过程中创建的所有资源.在运行这个命令之后 ...

  4. ethers.js-4-Contracts

    Contracts A Contract is an abstraction of an executable program on the Ethereum Blockchain. A Contra ...

  5. Android利用fidller进行网络抓包

    http://www.oschina.net/question/221817_129716?fromerr=z7ZX9oZR http://www.trinea.cn/android/android- ...

  6. Opencv——级联分类器(AdaBoost)

    API说明: cv::CascadeClassifier::detectMultiScale(InputArray image,//输入灰度图像 CV_OUT std::vector<Rect& ...

  7. 论文笔记 Robust face landmark estimation under occlusion

    1. Abstract 现实世界中的人脸很多时候都存在遮挡以及大的形状变化,而目前的人脸关键点检测方法在这种情况下表现欠佳, 因为它们未能提供一种系统的方法来处理异常.因而authors提出一种新的方 ...

  8. Mysql基础知识—索引

    公司最近开始尝试进行改革,如何活跃团队气氛.开发就给我们说了一些算是科普类的数据库知识,下面参杂自己的理解,方便自己后续翻看.   1.什么是索引 索引在MySQL中也叫做“键”,是存储引擎用于快速找 ...

  9. Ext4文件系统架构分析(一)

    本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等 ...

  10. overflow:hidden 影响inline-block元素周围元素下移

    前言: 最近在切页中,我想实现左边一个类似下拉选框,且不允许输入,右边有一段垂直居中的文字描述的效果.我对文字用的是p标签.其实可以用个i/b/em等其他行内标签,同时也具有一定语义,做为强调提示,( ...