提升树

集成学习

随机森林

AdaBoost 算法

提升树

梯度提升树(GBDT)

XGBoost



一、提升树

提升树是以 CART 回归树为基本分类器的提升方法。

提升方法采用加法模型(即基函数的线性组合)与前向分步算法。



1. 提升树模型

提升树模型可以表示为决策树的加法模型:

(13)fM(x)=m=1MT(x;Θm)

T(x;Θm) 表示决策树,Θm 表示决策树的参数,M 表示树的个数。



2. 提升树算法

提升树算法采用前向分布算法。首先确定初始提升树 f0(x)=0,第 m 步的模型是

(14)fm(x)=fm1(x)+T(x;Θm)

fm1(x) 为当前模型,通过损失函数极小化确定下一颗决策树的参数 Θm

(15)Θ^m=arg minΘmi=1NL(yi,fm1(xi)+T(xi;Θm))=arg minΘmi=1N(rmiT(xi;Θm))2

其中,rmi=yifm1(xi) 表示残差。

使用不同的损失函数,得到不同的提升树算法。比如:平方误差损失函数的回归问题;指数损失函数、交叉熵损失的分类问题。


提升树算法是 AdaBoost 算法的特殊情况

  • 对于二分类问题,提升树只需将 AdaBoost 算法的基本分类器限制为二分类树即可。
  • 基分类器的系数 αm 全为 1

原理:只要损失函数是指数损失函数,就可以用指数损失函数调整样本的权值,从而让每个基分类器学到不同的内容。


1. 回归问题的提升树

训练集 T={(x1,y1),(x2,y2),...,(xN,yN)}, xiRnRn,yiRR,将输入空间 xi 划分为 J 个互不相交的区域 R1,R2,...,RJ,每个区域上确定输出的常量 cj,那么树可表示为

(16)T(x;Θ)=j=1JcjI(xRj)

其中,参数 Θ={(R1,c1),(R2,c2),...,(RJ,cJ)} 表示树的区域划分和各区域上的常数。J 是回归树的复杂度即叶结点个数



回归问题的提升树算法:


输入:训练集 T={(x1,y1),(x2,y2),...,(xN,yN)}, xiRnRn,yiRR

输出:提升树 fM(x)

① 初始化 f0(x)=0

② 对 m=1,2,...,M

​ (a) 对每一个样本 (xi,yi) ,按式 (16) 计算残差:

rmi=yifm1(xi),    i=1,2,...,N

​ (b) 利用 {(xi,rmi)},    i=1,2,...,N 学习一个回归树,得到 T(x;Θm)

​ (c) 更新 fm(x)=fm1(x)+T(x;Θm)

③ 得到回归问题提升树

fM(x)=m=1MT(x;Θm)



2下表是训练集,x[0.5,10.5]y[5.0,10.0],学习这个回归问题的提升树模型,考虑只用树桩作为基函数。

xi 1 2 3 4 5 6 7 8 9 10
yi 5.56 5.70 5.91 6.40 6.80 7.05 8.90 8.70 9.00 9.05

解:

① 求 f1(x) 即回归树 T1(x) 。根据数据,考虑如下切分点:

1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5


s=1.5

R1={x|xs}={1}R2={x|x>s}={2,3,4,5,6,7,8,9,10}c1=1N1xiR1yi=5.56c2=1N2xiR2yi=15.72m(s)=minc1xiR1(yic1)2+minc2xiR2(yic2)2=0+15.72=15.72

N1,N2R1,R2 的样本点数。

现将 sm(s) 结果列表如下。

s 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5
m(s) 15.72 12.07 8.36 5.78 3.91 1.93 8.01 11.73 15.74

s=6.5m(s) 最小,此时 R1={1,2,3,4,5,6}R2={7,8,9,10}c1=6.24c2=8.91

所以回归树 T1(x)

T1(x)={6.24,x<6.58.91,x6.5f1(x)=T1(x)

f1(x) 拟合训练集,残差列表如下。r2i=yif1(xi), i=1,2,...,10

xi 1 2 3 4 5 6 7 8 9 10
r2i -0.68 -0.54 -0.33 0.16 0.56 0.81 -0.01 -0.21 0.09 0.14

f1(x) 拟合训练集的平方损失误差:

L(y,f1(x))=i=110(yif1(xi))2=1.93


② 求 T2(x)。拟合残差列表。

T2(x)={0.52,x<3.50.22,x3.5

f2(x)=f1(x)+T2(x)={5.72,x<3.56.46,3.5x<6.59.13,x6.5

f2(x) 拟合训练集的平方损失误差:

L(y,f2(x))=i=110(yif2(xi))2=0.79

继续求得

T3(x)={0.15,x<6.50.22,x6.5L(y,f3(x))=0.47,T4(x)={0.16,x<4.50.11,x4.5L(y,f4(x))=0.30,T5(x)={0.07,x<6.50.11,x6.5L(y,f5(x))=0.23,T6(x)={0.15,x<2.50.44,x2.5f6(x)=f5(x)+T6(x)=T1(x)+T2(x)+...+T6(x)={5.63,x<2.55.82,2.5x<3.56.56,3.5x<4.56.83,4.5x<6.58.95,x6.5

f6(x) 拟合训练集的平方损失误差

L(y,f6(x))=i=110(yif6(xi))2=0.17

假设此时满足误差要求,那么 f(x)=f6(x) 为所求提升树。



二、梯度提升树

提升树用加法模型与前项分布算法实现学习的优化过程。当损失函数是平方误差损失函数和指数损失函数时,每一步优化很简单的。但对一般损失函数而言,每一步并不容易。

Freidman 提出利用损失函数的负梯度作为残差的近似值,拟合一个回归树。

[L(yi, f(xi))f(xi)]f(x)=fm1   (x)

其中,下标 f(x)=fm1(x) 表示 f(x) 的取值 fm1(x)


梯度提升树回归算法:

输入:训练集 T={(x1,y1),(x2,y2),...,(xN,yN)}xiXRRnyiYRR

其中,N 表示样本个数,X 表示输入空间,RRn 表示 n 维。

输出:回归树 f^(x)

其中,f^(x) 表示训练出来的模型。

(1)初始化

f0(x)=arg minci=1NL(yi,c)

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

​ (a)对 i=1,2,...,N,计算残差

rmi=[L(yi, f(xi))f(xi)]f(x)=fm1   (x)

​ (b)将所有样本 (xi,rmi) 拟合一个回归树,得到第 m 棵树的叶结点区域 Rmjj=1,2,...,J

​ (c)对 j=1,2,...,J,其中 J 为叶结点的个数,计算

cmj=arg mincxiRmj L(yi,fm1+c)

​ (d)更新 fm(x)=fm1(x)+j=1JcmjI(xRmj)

(3)得到回归树

f^(x)=fM(x)=m=1Mj=1JcmjI(xRmj)


(1) 步初始化,估计使损失函数极小化的常数值,它只有一个根节点。

(2a)计算损失函数的负梯度在当前模型的值,作为残差的估计。对平方误差损失函数,它就是通常所说的残差;对于一般的损失函数,就是残差的近似值。

(2b)对残差拟合一个回归树,得到回归树叶结点区域

(2c)利用线性搜索估计叶节点区域的值。使损失函数极小化

(2d) 步更新回归树。

(3) 步得到最终模型 f^(x)


求证:平方损失函数的负梯度是残差。

证明:为求导方便,在损失函数前乘以 12

L(yi,f(xi))=12(yi,f(xi))2

f(xi) 求导,则有:

L(yi, f(xi))f(xi)=f(xi)yi

残差是梯度相反数,即:

rmi=yifm1(xi)=[L(yi, f(xi))f(xi)]f(x)=fm1   (x)



posted @   做梦当财神  阅读(766)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2018-07-02 Python format() 基础
点击右上角即可分享
微信分享提示