【机器学习】集成学习(Boosting)——梯度提升树(GBDT)算法(理论+图解+公式推导)

本文涉及的产品
语种识别,语种识别 100万字符
文档翻译,文档翻译 1千页
文本翻译,文本翻译 100万字符
简介: 【机器学习】集成学习(Boosting)——梯度提升树(GBDT)算法(理论+图解+公式推导)

2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。


一、引言

之前我们使用Boosting模型讲解了AdaBoost算法模型的原理,采用加法模型和向前分步算法,它是采用了很多个基学习器按照一定权重进行线性组合。

f M ( x ) = ∑ m = 1 M a m f m ( x ) f_M(x)=\sum_{m=1}^Ma_mf_m(x)fM(x)=m=1Mamfm(x)

Boosting算法的思想就是将多个基学习器串行训练,它会改变样本的权重,将每次训练失败的样本的权重增加,使之后的学习器更加关注上次错误分类的样本。

这里说明一下为什么要改变权重,一是上面说到的,为了使后面的学习器更加前面分错的样本,另外就是我们使用集成学习的目的就是能够使内部每个基学习器应该有各自的特点,如果使用同样的数据进行拟合,那么我们获得的基学习器几乎是差不多的,集成参数相似的模型没有什么意思,所以我们希望内部的基学习器应为不同的模型,要达到这样,我们就使用了一种方法就是每轮更改样本的权重,这样基学习器每次学习的样本就会不同。

AdaBoost就是按照这个思想,通过改变样本的权重,Boosting还有一种方式就是不改变样本的权重,采用拟合残差的方式,它的一种典型算法就是提升树。

二、提升树

提升树算法

我们上面说Boosting一般两种方式,一是更改样本权重,另外一种是拟合参数,我们的提升树就是使用了第二种拟合残差的方式,提升树可以理解为是AdaBoost+决策树的模型。

提升树的模型定义如下:

f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f_M(x)=\sum_{m=1}^MT(x;\theta_m)fM(x)=m=1MT(x;θm)

注意这里和AdaBoost不同的地方是这里只是所有树模型最终输出值相加,没有权重。

前向分步算法

由于提升树是AdaBoost的一种特例,所以它的求解也是使用了前向分步算法。

所以我们把上面的定义换一种写法:

f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm)

它的意思就是当前的集成模型等于前m-1个模型+当前训练的模型 T ( x ; θ m ) T(x;\theta_m)T(x;θm) ,为了与上述等式一致,我们设定 f 0 ( x ) = 0 f_0(x)=0f0(x)=0 ,这样当 m = 1 m=1m=1 时,f 1 ( x ) = f 0 ( x ) + T ( x ; θ 1 ) = T ( x ; θ 1 ) f_1(x)=f_0(x)+T(x;\theta_1)=T(x;\theta_1)f1(x)=f0(x)+T(x;θ1)=T(x;θ1) 就等于第一个基学习器。

为了求解模型参数,我们需要构建损失函数:

L ( y , f ( x ) ) = L ( y , f m ( x ) ) = L ( y , y m − 1 ( x ) + T ( x ; θ m ) ) L(y,f(x))=L(y,f_m(x))=L(y,y_{m-1}(x)+T(x;\theta_m))L(y,f(x))=L(y,fm(x))=L(y,ym1(x)+T(x;θm))

上述三种写法都是损失函数,等价,其中 f m ( x ) f_m(x)fm(x) 代表m个基学习器的集成模型,T ( x ; θ m ) T(x;\theta_m)T(x;θm) 代表第m个基学习器,我们的目的就是最小化损失函数,求取每个基学习器的参数 θ m \theta_mθm

为了叙述方便,我们定义我们的损失为回归损失,所以损失函数为:

L ( y , f m ( x ) ) = ( y − f m ( x ) ) 2 L(y,f_m(x))=(y-f_m(x))^2L(y,fm(x))=(yfm(x))2

又因为 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm) ,所以损失函数变为:

L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) = ( y − f m − 1 ( x ) − T ( x ; θ m ) ) 2 = ( r − T ( x ; θ m ) ) 2 L(y,f_{m-1}(x)+T(x;\theta_m))=(y-f_{m-1}(x)-T(x;\theta_m))^2\\=(r-T(x;\theta_m))^2L(y,fm1(x)+T(x;θm))=(yfm1(x)T(x;θm))2=(rT(x;θm))2

其中 r = y − f m − 1 ( x ) r=y-f_{m-1}(x)r=yfm1(x)

为了求解最优模型,所以我们希望损失函数很小,越趋于0越好,所以我们希望 r − T ( x ; θ m ) ∼ 0 r-T(x;\theta_m) \sim 0rT(x;θm)0 ,也就是我们第m个基学习器的预测值越接近残差越好。

那么什么是残差呢?残差就是预测值和真实值的差值,就是 y ∗ − y y^*-yyy ,可以看到我们定义的残差 r = y − f m − 1 ( x ) r=y-f_{m-1}(x)r=yfm1(x) ,其中y就是真实值标签,f m − 1 ( x ) f_{m-1}(x)fm1(x) 就是 m-1个基学习器集成模型的预测值,或者说是训练上个基学习器的时候的预测值。

重点:

我们的AdaBoost的基学习器是希望每个基学习器拟合原数据越精准越好,都是拟合同样的y,然是我们提升树的基学习器不一样,它不拟合数据y,它是拟合参数,什么意思呢?就是每个基学习器学习的数据的标签不是原数据y,而是相对应的残差r,这就是二者不一样的地方,提升树是希望每个基学习器能够更好的拟合残差,这个可以从上面的式子看出:

( r − T ( x ; θ m ) ) ∼ 0 (r-T(x;\theta_m)) \sim 0(rT(x;θm))0

每个基学习器的输出值越接近残差越好,这就是提升树原理,尽可能让每个基学习器拟合上一轮的残差。

提升树算法流程

1.初始化 f 0 ( x ) = 0 f_0(x)=0f0(x)=0 ,这是为了不影响结果,f 1 ( x ) = f 0 ( x ) + T ( x ; θ 1 ) f_1(x)=f_0(x)+T(x;\theta_1)f1(x)=f0(x)+T(x;θ1)

2.迭代训练M个基学习器

(a)更新样本标签,将原标签y换成相应的残差,为什么换成残差上面我们说过了

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

(b)训练新数据 ( x 1 , r m 1 ) , ( x 2 , r m 2 ) , . . . , ( x n , r m n ) (x_1,r_{m1}),(x_2,r_{m2}),...,(x_n,r_{mn})(x1,rm1),(x2,rm2),...,(xn,rmn) ,用第m个基学习器 T ( x ; θ m ) T(x;\theta_m)T(x;θm) 去拟合新数据集

(c)更新集成模型

f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm)

3.获得最终集成模型

f m ( x ) = ∑ m = 1 M T ( x ; θ m ) f_m(x)=\sum_{m=1}^MT(x;\theta_m)fm(x)=m=1MT(x;θm)

三、梯度提升树

提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数为平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不容易,所以为了应对这一问题,Freidman提出了梯度提升算法,将其应用到我们的提升树中就成为了很出名的梯度提升树即GDBT。

损失函数和上面的一样都为:

L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) = ( y − f m − 1 ( x ) − T ( x ; θ m ) ) 2 = ( r − T ( x ; θ m ) ) 2 L(y,f_{m-1}(x)+T(x;\theta_m))=(y-f_{m-1}(x)-T(x;\theta_m))^2\\=(r-T(x;\theta_m))^2L(y,fm1(x)+T(x;θm))=(yfm1(x)T(x;θm))2=(rT(x;θm))2

然后模型也是同样:

f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm)

但是这里我们不用 y − f m − 1 ( x ) y-f_{m-1}(x)yfm1(x) 代替残差,而是换一种方式,采用负梯度的形式,其实梯度提升树和普通提升树就差在残差这里。

普通提升树的残差为:

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

但是我们梯度提升树的残差用下面的式子进行代替:

r m i = − ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) r_{mi}=-\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}rmi=f(xi)L(yi,f(xi))

其中这里 f ( x ) = f m − 1 ( x ) f(x)=f_{m-1}(x)f(x)=fm1(x)

GBDT算法流程

1.初始化

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

2.训练M个基学习器

(a)更新样本数据,将标签换成残差

r m i = − ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) r_{mi}=-\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}rmi=f(xi)L(yi,f(xi))

(b)使用第m个基学习器拟合新的样本数据,得到 T ( x ; θ m ) T(x;\theta_m)T(x;θm) 回归树

(c)更新模型

f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm)

3.获得最终的集成模型

f m ( x ) = ∑ m = 1 M T ( x ; θ m ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x)=\sum_{m=1}^MT(x;\theta_m)=\sum_{m=1}^M\sum_{j=1}^Jc_{mj}I(x\in R_{mj})fm(x)=m=1MT(x;θm)=m=1Mj=1JcmjI(xRmj)

泰勒一阶展开

这里证明一下为什么使用 r m i = − ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) r_{mi}=-\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}rmi=f(xi)L(yi,f(xi)) 代替原来的残差。

我们现在存在两个模型,分别为 f m ( x ) f_m(x)fm(x)f m − 1 ( x ) f_{m-1}(x)fm1(x) ,可以看出 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm) ,可以看出 f m ( x ) f_m(x)fm(x)f m − 1 ( x ) f_{m-1}(x)fm1(x) 的升级版,因为又加入了一个基学习器,我们希望集成学习中没加入一个基学习器,模型的效果越高,那也就是说模型的损失函数降低,即:

L ( y , f m ( x ) ) < L ( y , f m − 1 ( x ) ) L(y,f_m(x))<L(y,f_{m-1}(x))L(y,fm(x))<L(y,fm1(x))

因为 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)fm(x)=fm1(x)+T(x;θm) ,所以上式可写为:

L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) < L ( y , f m − 1 ( x ) ) L(y,f_{m-1}(x)+T(x;\theta_m))<L(y,f_{m-1}(x))L(y,fm1(x)+T(x;θm))<L(y,fm1(x))

这里我们使用了泰勒一阶展开进行函数逼近,我们将 L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) L(y,f_{m-1}(x)+T(x;\theta_m))L(y,fm1(x)+T(x;θm)) 在点 f m − 1 ( x ) f_{m-1}(x)fm1(x) 处进行泰勒一阶展开。

泰勒展开式一般为:

f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x)=f(x_0)+f'(x_0)(x-x_0)f(x)=f(x0)+f(x0)(xx0)

所以上式的展开式为:

L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) = L ( y , f m − 1 ( x ) ) + ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) T ( x ; θ m ) L(y,f_{m-1}(x)+T(x;\theta_m))=L(y,f_{m-1}(x))+\frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)}T(x;\theta_m)L(y,fm1(x)+T(x;θm))=L(y,fm1(x))+fm1(x)L(y,fm1(x))T(x;θm)

这里有些人可能没看明白,解释一下:

  • f ( x 0 ) f(x_0)f(x0)L ( y , f m − 1 ( x ) ) L(y,f_{m-1}(x))L(y,fm1(x))
  • f ′ ( x 0 ) f'(x_0)f(x0)∂ L ( y , f ( x ) ) ∂ f ( x ) \frac{\partial L(y,f(x))}{\partial f(x)}f(x)L(y,f(x))
  • x − x 0 x-x_0xx0T ( x ; θ m ) T(x;\theta_m)T(x;θm)
  • x 0 x_0x0f m − 1 ( x ) f_{m-1}(x)fm1(x)

为了方便观看计算,我们另 f m − 1 ( x ) + T ( x ; θ m ) = x f_{m-1}(x)+T(x;\theta_m)=xfm1(x)+T(x;θm)=x ,所以原式就变为了:

L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) = L ( y , x ) L(y,f_{m-1}(x)+T(x;\theta_m))=L(y,x)L(y,fm1(x)+T(x;θm))=L(y,x)

所以当 x = x 0 x=x_0x=x0 时,f ( x 0 ) = L ( y , f m − 1 ( x ) ) f(x_0)=L(y,f_{m-1}(x))f(x0)=L(y,fm1(x)) ,其它同理。

L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) < L ( y , f m − 1 ( x ) ) L(y,f_{m-1}(x)+T(x;\theta_m))<L(y,f_{m-1}(x))L(y,fm1(x)+T(x;θm))<L(y,fm1(x))

所以这个式子就变成了:

L ( y , f m − 1 ( x ) ) + ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) T ( x ; θ m ) < L ( y , f m − 1 ( x ) ) L(y,f_{m-1}(x))+\frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)}T(x;\theta_m)<L(y,f_{m-1}(x))L(y,fm1(x))+fm1(x)L(y,fm1(x))T(x;θm)<L(y,fm1(x))

化简后得:

∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) T ( x ; θ m ) < 0 \frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)}T(x;\theta_m)<0fm1(x)L(y,fm1(x))T(x;θm)<0

所以 T ( x ; θ m ) T(x;\theta_m)T(x;θm)∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) \frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)}fm1(x)L(y,fm1(x)) 异号,所以我们另:

T ( x ; θ m ) = − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) T(x;\theta_m)=-\frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)}T(x;θm)=fm1(x)L(y,fm1(x))

这样就可以保证两者乘积异号,我们希望当前模型 T ( x ; θ m ) T(x;\theta_m)T(x;θm) 的值为负梯度方向,这样我们的模型的损失函数才能够下降,所以我们每次更新模型就变成了:

f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) = f m − 1 ( x ) − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) f_m(x)=f_{m-1}(x)+T(x;\theta_m)=f_{m-1}(x)-\frac{\partial L(y,f_{m-1}(x))}{\partial f_{m-1}(x)}fm(x)=fm1(x)+T(x;θm)=fm1(x)fm1(x)L(y,fm1(x))

其实这个就和普通提升树差不多了,普通提升树是用每轮的残差代替 T ( x ; θ m ) T(x;\theta_m)T(x;θm) ,而我们的梯度提升树就是使用了负梯度进行近似拟合。


目录
相关文章
|
15天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
51 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
2月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
63 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
25天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
2月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
35 0
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
12天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
20天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
21天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
22天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。