【机器学习】集成学习(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) ,而我们的梯度提升树就是使用了负梯度进行近似拟合。


目录
相关文章
|
4天前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
8天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
15 2
|
25天前
|
机器学习/深度学习 人工智能 搜索推荐
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
34 1
|
1月前
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
32 4
|
2月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
33 1
|
2月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
57 0
|
2月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
39 0
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
全面解析TensorFlow Lite:从模型转换到Android应用集成,教你如何在移动设备上轻松部署轻量级机器学习模型,实现高效本地推理
【8月更文挑战第31天】本文通过技术综述介绍了如何使用TensorFlow Lite将机器学习模型部署至移动设备。从创建、训练模型开始,详细演示了模型向TensorFlow Lite格式的转换过程,并指导如何在Android应用中集成该模型以实现预测功能,突显了TensorFlow Lite在资源受限环境中的优势及灵活性。
65 0
|
13天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
43 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 算法 数据挖掘
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
下一篇
无影云桌面