GBDT算法总结

GBDT算法总结前向分布算法负梯度拟合在上一节中,我们介绍了GBDT的基本思路,但是没有解决损失函数拟合方法的问题。针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为    利用(xi,rti)(i=1…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 

前向分布算法

GBDT算法总结

 

GBDT算法总结

负梯度拟合

在上一节中,我们介绍了GBDT的基本思路,但是没有解决损失函数拟合方法的问题。针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为

                                      GBDT算法总结

    利用(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算法总结

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

                                              GBDT算法总结

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

                                          GBDT算法总结

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

 

损失函数

 

在GBDT算法中,损失函数的选择十分重要。针对不同的问题,损失函数有不同的选择。

1.对于分类算法,其损失函数一般由对数损失函数和指数损失函数两种。

(1)指数损失函数表达式:

L(y,f(x))=e^{(-yf(x))}

(2)对数损失函数可分为二分类和多分类两种。

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

(1)平方损失函数

L(y,f(x))=(y-f(x))^{2}

(2)绝对损失函数

L(y,f(x))=|y-f(x)|

对应负梯度误差为:

sign(y_{i}-f(x_{i}))

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

GBDT算法总结

对应的负梯度误差为:

GBDT算法总结

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

L(y,f(x))=\sum_{y\geq f(x)}^{}{\theta|y-f(x)|}+\sum_{y<f(x)}^{}{(1-\theta)|y-f(x)|}

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

GBDT算法总结

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

 

回归问题

梯度提升算法(回归问题):

输入:训练数据集T={ (x_{1},y_{1}),(x_{2},y_{2}),...,(x_{N},y_{N}) }, x_{i}\in\chi\subseteq R^{n},y_{i}\in\gamma\subseteq R;损失函数L(y,f(x));

输出:回归树 \tilde{f}(x)

(1)初始化

f_{0}=arg min_{c}\sum_{i=1}^{N}{L(y_{i},c}) 注:估计使损失函数极小化的常数值,它是只有一个根结点的树

(2)对m=1,2,…,M

(a)对i=1,2,…N,计算

r_{mi}=-[\frac{\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}]_{f(x)=f_{m-1}(x)}  计算损失函数在当前模型的值,作为残差的估计

(b)对 r_{mi} 拟合一个回归树,得到第m棵树的叶结点区域 R_{mj} ,j=1,2,…,J

(c)对j=1,2,…,J,计算

c_{mj}=arg min_{c}\sum_{x_{j}\in R_{mj}}^{}{L(y_{i},f_{m-1}(x_{i})+c)} 注:在损失函数极小化条件下,估计出相应叶结点区域的值

(d)更新

f_{m}(x)=f_{m-1}(x)+\sum_{j=1}^{J}{c_{mj}I(x\in R_{mj})}

(3)得到回归树

\tilde{f}(x)=f_{M}(x)=\sum_{m=1}^{M}{}\sum_{j=1}^{J}{c_{mj}I(x\in R_{mj})}

 

分类问题(二分类与多分类)

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

为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法用类似逻辑回归的对数似然函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。此处仅讨论用对数似然函数的GBDT分类。对于对数似然损失函数,我们有又有二元分类和的多元分类的区别。

1.二分类GBDT算法

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

L(y,f(x))=log(1+exp(-yf(x)))

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

r_{ti}=-[\frac{\partial L(y,f(x_{i}))}{\partial f(x_{i})}_{f(x)=f_{t-1}(x)}=\frac{y_{i}}{1+exp(y_{i}f(x_{i}))}

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

c_{tj}=arg min_{c}\sum_{x_{i}\in R_{tj}}^{}{log(1+exp(-y_{i}(f_{t-1}(x_{i})+c})))

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

c_{tj}=\frac{\sum_{x_{i}\in R_{tj}}^{}{r_{tj}}}{\sum_{x_{i}\in R_{tj}}^{}{|r_{tj}|(1-|r_{tj}|)}}

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

2.多分类GBDT算法

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

L(y,f(x))=-\sum_{k=1}^{K}{y_{k}log(p_{k}(x))}

其中如果样本输出类别为k,则 y_{k} =1.第k类的概率 p_{k}(x) 的表达式为:

p_{k}(x)=\frac{exp(f_{k}(x))}{\sum_{l=1}^{K}{exp(f_{l}(x))}}

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

t_{til}=-[\frac{\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}]_{f_{k}(x)=f_{l,t-1}(x)}=y_{il}-p_{l,t-1}(x_{i})

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

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

c_{tjl}=arg min_{c_{jl}}\sum_{i=0}^{m}{}\sum_{k=1}^{K}{L(y_{k},f_{t-1,l}(x)+\sum_{j=0}^{J}{c_{jl}I(x_{i}\in R_{tj})}})

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

c_{tjl}=\frac{K-1}{K}\frac{\sum_{x_{i}\in R_{tjl}}^{}{r_{til}}}{\sum_{x_{i}\in R_{til}}^{}{|r_{til}|(1-|r_{til}|)}}

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

 

正则化

  • 对GBDT进行正则化来防止过拟合,主要有三种形式。

1.给每棵数的输出结果乘上一个步长a(learning rate)

对于前面的弱学习器的迭代:

f_{m}(x)=f_{m-1}(x)+T(x;\gamma_{m})

加上正则化项,则有

f_{m}(x)=f_{m-1}(x)+aT(x;\gamma_{m})

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

2.第二种正则化的方式就是通过子采样比例(subsample)。取值范围为(0,1]。

GBDT这里的做法是在每一轮建树时,样本是从原始训练集中采用无放回随机抽样的方式产生,与随机森立的有放回抽样产生采样集的方式不同。若取值为1,则采用全部样本进行训练,若取值小于1,则不选取全部样本进行训练。选择小于1的比例可以减少方差,防止过拟合,但可能会增加样本拟合的偏差。取值要适中,推荐[0.5,0.8]

3.第三种是对弱学习器即CART回归树进行正则化剪枝。(如控制树的最大深度、节点的最少样本数、最大叶子节点数、节点分支的最小样本数等)

 

GBDT优缺点

1.GBDT优点

  • 可以灵活处理各种类型的数据,包括连续值和离散值。
  • 在相对较少的调参时间情况下,预测的准确率也比较高,相对SVM而言。
  • 在使用一些健壮的损失函数,对异常值得鲁棒性非常强。比如Huber损失函数和Quantile损失函数。

2.GBDT缺点

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

sklearn参数

在scikit-learning中,GradientBoostingClassifier对应GBDT的分类算法,GradientBoostingRegressor对应GBDT的回归算法。

具体算法参数情况如下:

GradientBoostingRegressor(loss=’ls’, learning_rate=0.1, n_estimators=100, 
                subsample=1.0, criterion=’friedman_mse’, min_samples_split=2,
                min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3,
                min_impurity_decrease=0.0, min_impurity_split=None, init=None, 
                random_state=None, max_features=None, alpha=0.9, verbose=0, 
                max_leaf_nodes=None, warm_start=False, presort=’auto’, 
                validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)

参数说明:

  • n_estimators:弱学习器的最大迭代次数,也就是最大弱学习器的个数。
  • learning_rate:步长,即每个学习器的权重缩减系数a,属于GBDT正则化方化手段之一。
  • subsample:子采样,取值(0,1]。决定是否对原始数据集进行采样以及采样的比例,也是GBDT正则化手段之一。
  • init:我们初始化的时候的弱学习器。若不设置,则使用默认的。
  • loss:损失函数,可选{‘ls’-平方损失函数,’lad’绝对损失函数-,’huber’-huber损失函数,’quantile’-分位数损失函数},默认’ls’。
  • alpha:当我们在使用Huber损失”Huber”和分位数损失”quantile”时,需要指定相应的值。默认是0.9,若噪声点比较多,可适当降低这个分位数值。
  • criterion:决策树节搜索最优分割点的准则,默认是”friedman_mse”,可选”mse”-均方误差与’mae”-绝对误差。
  • max_features:划分时考虑的最大特征数,就是特征抽样的意思,默认考虑全部特征。
  • max_depth:树的最大深度。
  • min_samples_split:内部节点再划分所需最小样本数。
  • min_samples_leaf:叶子节点最少样本数。
  • max_leaf_nodes:最大叶子节点数。
  • min_impurity_split:节点划分最小不纯度。
  • presort:是否预先对数据进行排序以加快最优分割点搜索的速度。默认是预先排序,若是稀疏数据,则不会预先排序,另外,稀疏数据不能设置为True。
  • validationfraction:为提前停止而预留的验证数据比例。当n_iter_no_change设置时才能用。
  • n_iter_no_change:当验证分数没有提高时,用于决定是否使用早期停止来终止训练。

GBDT应用场景

GBDT几乎可以用于所有回归问题(线性/非线性),相对loigstic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于分类问题。

 

参考资料:

梯度提升树(GBDT)原理–刘建平Pinard – 博客园
GBDT算法梳理– End小fa–知乎专栏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182845.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • rpc协议详解

    rpc协议详解RPC是一种远程过程调用的协议,使用这种协议向另一台计算机上的程序请求服务,不需要了解底层网络技术的协议。HTTP是一种超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议。TCP协议:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。https://mp.weixin.qq.com/s?src=11&timestamp=1611734678&ver=2853&signature=igsdPz20ZUht*1IskaU0LxnFKvD6tD.

  • Python数字/字符串补零操作[通俗易懂]

    Python数字/字符串补零操作[通俗易懂]字符串补零可以使用zfill()函数来给字符串补零>>>str=”123″>>>print(str.zfill(8))00000123还能把整数转化成字符来使用zfill()补零>>>num=123>>>print(str(num).zfill(8))00000123数字补零对于数字可以使用格式化的方式来进行补零:>>>number=123>>&

    2022年10月12日
  • Hook(钩子技术)基本知识讲解,原理

    一、什么是HOOK(钩子)      对于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能,如屏幕取词,监视日志,截获键盘、鼠标输入等等。     钩子…

  • 十分钟带你理解Kubernetes核心概念

    十分钟带你理解Kubernetes核心概念

  • ubuntu镜像下载教程_Ubuntu镜像

    ubuntu镜像下载教程_Ubuntu镜像在众多的linux操作系统中,Ubuntu(乌班图)是目前主流的linux操作系统。而绝大部分新手网友要接触linux或使用linux操作系统,当然是首选Ubuntu(乌班图)linux操作系统。因为Ubuntu系统绝大部分是图形化操作,很少会使用到命令,同时在linux操作系统中支持Ubuntu系统的软件、游戏也最多。Ubuntu官方网站:http://www.ubuntu.com/downl

    2022年10月30日
  • Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号