连载|GBDT如何进行回归和分类

article/2025/8/18 22:15:55

GBDT

在前几年的机器学习竞赛以及工作中,人们使用着各种传统算法进行调参取得性能的提升,突然有一天杀出了一种名为GBDT的算法,改变了当前的格局,该算法在不同的场景中总是能够产生很好的效果,本文就让我们来了解一下GBDT。

GBDT(Gradient Boost Decision Tree),中文名称可以直译为“梯度提升决策树”。要想弄明白GBDT具体是什么我们就要弄明白这里面的两个词语DT(Decision Tree)和GB(Gradient Boost)。

DT:CART回归树

这里需要注意的是我们使用的决策树是CART回归树,无论是我们要处理回归问题还是分类问题,我们都需要使用CART回归树,主要是因为我们的GBDT算法每次迭代要拟合的是梯度值,这是一个连续值,因此我们需要使用CART回归树。

对于回归树算法来说最重要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判拟合程度。

关于CART回归树的生成方式具体可以参考我们之前的文章:

GB:梯度提升

我们本文中提到的GBDT其实是提升树(Boosting Tree)的一种改进算法,我们先来看一下BT是怎样进行工作的。

Boosting Tree的流程

(1)初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0

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

​ (a)计算残差

r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . , N r_{mi}=y_i-f_{m-1}(x_i),i=1,2,...,N rmi=yifm1(xi),i=1,2,...,N

​ (b)拟合残差 r m i r_{mi} rmi学习一个回归树,得到 h m ( x ) h_m(x) hm(x)

​ (c)更新 f m ( x ) = f m − 1 + h m ( x ) f_m(x)=f_{m-1}+h_m(x) fm(x)=fm1+hm(x)

(3)得到回归问题提升树

f M ( x ) = ∑ m = 1 M h m ( x ) f_M(x)=\sum_{m=1}^Mh_m(x) fM(x)=m=1Mhm(x)

对于上面的流程中残差又代表着什么呢?

假设我们前一轮迭代得到的强学习器是:

f t − 1 ( x ) f_{t-1}(x) ft1(x)

损失函数是:

L ( y , f t − 1 ( x ) ) L(y,f_{t-1}(x)) L(y,ft1(x))

我们本轮迭代的目标是找到一个弱学习器:

h t ( x ) h_t(x) ht(x)

使得本轮的损失函数最小化:

L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( x ) ) L(y,f_t(x))=L(y,f_{t-1}(x)+h_t(x)) L(y,ft(x))=L(y,ft1(x)+ht(x))

此时的损失采用平方损失函数时:

L ( y , f t − 1 ( x ) + h t ( x ) ) L(y,f_{t-1}(x)+h_t(x)) L(y,ft1(x)+ht(x))

= ( y − f t − 1 ( x ) − h t ( x ) ) 2 =(y-f_{t-1}(x)-h_t(x))^2 =(yft1(x)ht(x))2

= ( r − h t ( x ) ) 2 =(r-h_t(x))^2 =(rht(x))2

此时有残差:

r = y − f t − 1 ( x ) r=y-f_{t-1}(x) r=yft1(x)

举个例子来表示一下残差:

假设小明有100元,第一次我们用80元去拟合,此时的残差就是20元,第二次我们用10元去拟合剩下的残差(损失:即20元),此时的残差是10元,依次类推我们每一次都去拟合剩下的残差,对于提升树来说我们把每一次拟合的钱数加起来就是模型最终的输出结果了。

我们可以发现当我们使用损失函数为平方损失的提升树的时候,每一步的迭代过程是很简单的,但是对于其他的损失函数来说就不能很好的进行每一步的优化了,针对这一问题,Freidman提出了梯度提升(Gradient Boosting)算法,利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

负梯度的表达形式如下:

− [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} [f(xi)L(y,f(xi))]f(x)=fm1(x)

GBDT回归算法的流程

输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)} x i ∈ X ⊆ R n x_i\in X \subseteq R^n xiXRn y i ∈ Y ⊆ R y_i\in Y \subseteq R yiYR;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))

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

(1)初始化弱学习器:

f 0 ( x ) = a r g m i n c ∑ i = 1 N L ( y i , c ) f_0(x)=arg\underset{c}{min}\sum_{i=1}^NL(y_i,c) f0(x)=argcmini=1NL(yi,c)

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

​ (a)对i=1,2,…,N,计算负梯度(残差):

r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=[f(xi)L(y,f(xi))]f(x)=fm1(x)

​ (b)将a中得到的残差作为新样本的真实值,拟合一个回归树,得到第m棵树的叶子结点区域 R m j R_{mj} Rmj j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J。其中 J J J为回归树的叶子结点的个数。

​ (c)对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算最佳拟合值:

c m j = a r g m i n c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=arg\underset{c}{min}\sum_{x_i\in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=argcminxiRmjL(yi,fm1(xi)+c)

​ (d)更新强学习器

f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x)=f_{m-1}(x)+\sum_{j=1}^Jc_{mj}I(x\in R_{mj}) fm(x)=fm1(x)+j=1JcmjI(xRmj)(I为指示函数)

(3)得到最终的学习器

f ^ ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat{f}(x)=f_M(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}c_{mj}I(x\in R_{mj}) f^(x)=fM(x)=m=1Mj=1JcmjI(xRmj)

GBDT分类算法

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

解决这个问题的办法主要有两种,一种是利用指数损失函数,此时的GBDT也就退化成了Adaboost算法;另一种就是使用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失,下面就让我们看一下在对数似然损失函数下的二分类和多分类的GBDT算法。

GBDT二分类算法

我们使用类似于逻辑回归的对数似然函数时,损失函数为:

L ( y , f ( x ) ) = l o g ( 1 + e x p ( − y f ( x ) ) ) L(y,f(x))=log(1+exp(-yf(x))) L(y,f(x))=log(1+exp(yf(x))) y ∈ { − 1 , + 1 } y\in\{-1,+1\} y{1,+1}

则此时的负梯度误差为:

r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) = y i ( 1 + e x p ( y i f ( x i ) ) ) r_{mi}=-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}=\frac{y_i}{(1+exp(y_if(x_i)))} rmi=[f(xi)L(y,f(xi))]f(x)=fm1(x)=(1+exp(yif(xi)))yi

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

c m j = a r g m i n c ∑ x i ∈ R m j l o g ( 1 + e x p ( − y i ( f m − 1 ( x i ) + c ) ) ) c_{mj}=arg\underset{c}{min}\sum_{x_i\in R_{mj}}log(1+exp(-y_i(f_{m-1}(x_i)+c))) cmj=argcminxiRmjlog(1+exp(yi(fm1(xi)+c)))

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

c m j = ∑ x i ∈ R m j r m i ∑ x i ∈ R m j ∣ r m i ∣ ( 1 − ∣ r m i ∣ ) c_{mj}=\frac{\sum_{x_i\in R_{mj}}r_{mi}}{\sum_{x_i\in R_{mj}}|r_{mi}|(1-|r_{mi}|)} cmj=xiRmjrmi(1rmi)xiRmjrmi

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

GBDT多分类算法

假设类别为K,则此时我们的对数似然损失函数为:

L ( y , f ( x ) ) = − ∑ k = 1 k y k l o g ( p k ( x ) ) L(y,f(x))=-\sum_{k=1}^ky_klog(p_k(x)) L(y,f(x))=k=1kyklog(pk(x))

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

p k ( x ) = e x p ( f k ( x ) ) ∑ l = 1 k e x p ( f l ( x ) ) p_k(x)=\frac{exp(f_k(x))}{\sum_{l=1}^kexp(f_l(x))} pk(x)=l=1kexp(fl(x))exp(fk(x))

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

r m i l = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f l , m − 1 ( x ) = y i l − p l , m − 1 ( x i ) r_{mil}=-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{l,m-1}(x)}=y_{il}-p_{l,m-1}(x_i) rmil=[f(xi)L(y,f(xi))]f(x)=fl,m1(x)=yilpl,m1(xi)

根据上式我们就能够知道,这里得到的负梯度的误差其实就是真实概率和t-1轮预测概率的差值。

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

c m j l = a r g m i n c j l ∑ i = 0 m ∑ k = 1 k L ( y k , f m − 1 , l ( x ) + ∑ j = 1 J c j l I ( x i ∈ R m j l ) ) c_{mjl}=arg\underset{c_{jl}}{min}\sum_{i=0}^{m}\sum_{k=1}^kL(y_k,f_{m-1,l}(x)+\sum_{j=1}^{J}c_{jl}I(x_i\in R_{mjl})) cmjl=argcjlmini=0mk=1kL(yk,fm1,l(x)+j=1JcjlI(xiRmjl))

同理我们使用近似值代替:

c m j l = K − 1 K ∑ x i ∈ R m j l r m i l ∑ x i ∈ R m j l ∣ r m i l ∣ ( 1 − ∣ r m i l ∣ ) c_{mjl}=\frac{K-1}{K}\frac{\sum_{x_i\in R_{mjl}}r_{mil}}{\sum_{x_i\in R_{mjl}}|r_{mil}|(1-|r_{mil}|)} cmjl=KK1xiRmjlrmil(1rmil)xiRmjlrmil

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

GBDT的过拟合

为了防止过拟合问题的产生,我们也需要对GBDT采取一些措施,主要的方式有以下的三种:

  • 剪枝

剪枝是树模型中常用的防止过拟合的方法,在GBDT中同样适用。

  • 定义步长

我们把步长定义为v,对于前面的弱学习器的迭代:

f k ( x ) = f k − 1 ( x ) + h k ( x ) f_k(x)=f_{k-1}(x)+h_k(x) fk(x)=fk1(x)+hk(x)

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

f k ( x ) = f k − 1 ( x ) + v h k ( x ) f_k(x)=f_{k-1}(x)+vh_k(x) fk(x)=fk1(x)+vhk(x)

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

  • 子采样比例

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

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

GBDT的优缺点

优点

  • 预测精度高;
  • 适合低维数据;
  • 能处理非线性数据;
  • 可以灵活处理各种类型的数据,包括连续值和离散值;
  • 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的;
  • 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数;

缺点

  • 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行;
  • 如果数据维度较高时会加大算法的计算复杂度。
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/LkqXAeER.shtml

相关文章

最小二乘法多项式曲线拟合数学原理及其C++实现

目录 0 前言1 最小二乘法概述2 最小二乘法求解多项式曲线系数向量的数学推导2.1 代数法2.2 矩阵法 3 代码实现4 总结参考 0 前言 自动驾驶开发中经常涉及到多项式曲线拟合,本文详细描述了使用最小二乘法进行多项式曲线拟合的数学原理,通过样本集构造范德…

GB和GBDT 算法流程及分析

1、优化模型的两种策略: 1)基于残差的方法 残差其实就是真实值和预测值之间的差值,在学习的过程中,首先学习一颗回归树,然后将“真实值-预测值”得到残差,再把残差作为一个学习目标,学习下一棵回…

机器学习和深度学习性能指标

这里写目录标题 1、声明2、机器学习评估性能指标2.1、回归(Regression)算法指标2.1.1、平均绝对误差 MAE2.1.2、均方误差 MSE2.1.3、均方根误差 RMSE2.1.4、决定系数R^22.1.5、解决评估指标鲁棒性问题 2.2、分类(Classification)算…

多模态信息融合研究

1、主要研究方向 多模态学习可以划分为以下五个研究方向: 多模态表示学习 Multimodal Representation:主要研究如何将多模态的数据所蕴含的语义信息通过embedding的方式实现向量化,便于后续的计算; 模态转化 Translation&#…

【时序】DeepGLO:可以学习全局依赖和局部信息的多时间序列预测模型

论文名称:Think Globally, Act Locally: A Deep Neural Network Approach to High-Dimensional Time Series Forecasting 论文下载:https://arxiv.org/abs/1905.03806 论文年份:NeurIPS 2019 论文被引:134(2022/04/21&…

独立性检验(卡方检验)

独立性检验(Test for Independence)是根据频数来判断两类因子是彼此独立还是彼此相关的一种假设检验。假如对某一个数据集有X(值域为x1, x2)跟Y(值域为y1, y2)变量,下面是他们的频数表: x1 x2 汇总 y1 …

列联表分析——独立性检验(卡方检验)

第一步:建立原假设和备择假设 H0:两变量相不立;H1:u两变量相互b独立 第二步:计算自由度和理论频数 第三步:计算卡方统计量 实际观察次数与理论次数之差的平方再除以理论次数得到的统计量近似服从卡方分布…

列联表分析-独立性检验

用SPSS分析甲乙丙三名推销员的对ABC三类产品的销售数据是否独立 原假设:他们之间相互独立 数据如下: 导入数据 将销量进行加权 点击分析-描述统计–交叉表; 结果 当表格是2X2的时候得到结果如下:

第15章卡方检验:拟合优度和独立性检验

第1章统计学入门 第2章频数分布略 第3章集中趋势的测量 第4章变异性 第5章分数的位置及标准化分布 第6章概率和正态分布 第7章概率和样本:样本均值的分布 第8章假设检验介绍 第9章t检验介绍 第10章两个独立样本的t检验 第11章两个相关样本的t检验…

独立样本t检验、方差齐性检验

什么是独立样本t检验? t检验是比较两组数据之间的差异,有无统计学意义;t检验的前提是,两组数据来自正态分布的群体,数据的方差齐,满足独立性。 独立样本t检验(各实验处理组之间毫无相关存在&am…

卡方列联表的独立性检验

1.列联表是按两个或多个特征分类的频数数据,一般以表格形式组成。 2.判断两个或多个属性之间有无关联,即判别属性之间是否独立。 3.检验步骤 建立原假设 H0: 两属性相互独立 H1: 两属性之间不独立 计算自由度 计算卡方统计量 拒绝域 对照卡方分布…

SPSS学习(五)独立样本t检验

参考书籍:《SPSS其实很简单》 应用场景:当对两个独立分组中感兴趣的一个连续因变量的均值进行比较时使用。 目标:检验两个组别中关于某些感兴趣的因变量的均值是否存在显著差异 数据要求:具有两个不同组别的一个自变量&#xf…

统计之 - 独立性检验

独立性检验(Testfor Independence)是根据频数来判断两类因子是彼此独立还是彼此相关的一种假设检验。假如对某一个数据集有X(值域为x1,x2)跟Y(值域为y1,y2)变量,下面是他们的频数表: x1x2汇总y1ababy2cdcd汇…

SAS学习第9章:卡方检验之适合性检验与独立性检验

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时&#xf…

入门必学 | R语言数据的独立性,正态性及方差齐性检验

参数分析的三大前提检验 检验数据独立性的方法Chisq检验Fisher检验Cochran-Mantel-Haenszel检验 检验数据正态性的方法shapiro.test函数qqnorm函数ksnormTest函数lillie.test函数ks.test函数 方差齐性检验的方法bartlett.test()检验leveneTest ()检验 完整代码 参数检验-显著性…

基于卡方的独立性检验

本文给出基于两种统计量的假设检验,来检验变量间是否独立--χ2与秩和。χ2越小说明越独立 假设检验 假设检验(Test of Hypothesis)又称为显著性检验(Test of Ststistical Significance)。 在抽样研究中,由于…

SPSS之双独立样本的T检验

双独立样本的T检验 是指在两个样本相互独立的前提下,检验两个样本的总体均数(两个样本各自归属的总体的平均数,如果两样本均数不存在显著差异,那么可以认为两个样本来自同一个总体)是否存在了显著性差异。它的零假设&…

概率论:相关性与独立性

文章目录 (一) X与Z是相关还是独立?(二) 相关性与独立性的关系1.相关性 (线性关系)相关系数 ρ X Y ρ_{XY} ρXY​ 2.独立性 (无任何关系)3.相关性与独立性的关系 (三) 独立可加性 (XY独立且同类型分布) (一) X与Z是相关还是独立? 1.二维正态分布&…

spss中有关独立样本T检验的详细介绍(包含操作过程和结果分析)

SPSS学习记录day2 写在前面: 在上一篇里我们介绍了SPSS软件中平均值和单样本T检验两种比较平均值的方法,今天来介绍剩下的几个比较平均值的检验操作 分析>比较平均值 3.独立样本T检验 独立样本T检验类似于单样本T检验,不过独立样本T检验…

R语言:独立性检验

R语言中的独立性检验包括&#xff1a;卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 原假设H0——没有发生 备择假设H1——发生了 p-value是在原假设为真 的情况下&#xff0c;得到的最大或超出所得到的检验统计量的概率 一般将p值定位到0.05。当p<0.05时&#xff0c;…