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. Linux MySql5.6.38安装过程

    1.下载mysql安装包mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz 2.用xftp工具将其上传到Linux服务器上的soft文件夹,没有的话先创建 [root ...

  2. Odoo中的甘特图

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9296922.html  甘特图 用图表来衡量实际与预期生产记录之间关系的方法中所使用的图表,亦称甘特进度表或条 ...

  3. ethers.js-2-wallets and signers

    Application Programming Interface (API) Wallets and Signers A Wallet manages a private/public key pa ...

  4. Jenkins构建Python项目失败

     Console Output 提示:'Python' 不是内部或外部命令,也不是可运行的程序 定位原因:python.exe 不在jenkins执行用户的PATH里面 解决:构建的时候Python命 ...

  5. Solr服务在Linux上的搭建详细教程

    一.系统环境 注:欢迎大家转载,非商业用途请在醒目位置注明本文链接和作者名dijia478即可,商业用途请联系本人dijia478@163.com. CentOS-6.7-i386-bin-DVD1 ...

  6. vs未能正确加载XXX包,编译时停止工作问题

    出现这个问题的原因可能是配置更改或安装了另一个扩展,幸好之前用的不多,重新进行用户配置代价也不高,打开Visual Studio Tools:  选择VS2013 开发人员命令提示:  输入deven ...

  7. iis7中session丢失的解决方法小结

    这篇文章主要介绍了在windows server 2008系统中,session丢失的解决方法,供大家学习参考 问题描述: Windows Server 2008 +IIS +ASP.net +SQL ...

  8. POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 140120 ...

  9. CSDN博客清理缓存

    CSDN博客清理缓存 清着清着 訪问量少了将近2w 积分少了几百 唉 你这是要闹什么呀 说9点结束 如今都几点了

  10. 【LeetCode3】Longest Substring Without Repeating Characters★★

    题目描述: 解题思路: 借用网上大神的思想:the basic idea is, keep a hashmap which stores the characters in string as key ...