集成学习
随机森林
AdaBoost 算法
提升树
梯度提升树(GBDT)
XGBoost
一、提升树
提升树是以 CART 回归树为基本分类器的提升方法。
提升方法采用加法模型(即基函数的线性组合)与前向分步算法。
1. 提升树模型
提升树模型可以表示为决策树的加法模型:
fM(x)=M∑m=1T(x;Θm)(13)
T(x;Θm) 表示决策树,Θm 表示决策树的参数,M 表示树的个数。
2. 提升树算法
提升树算法采用前向分布算法。首先确定初始提升树 f0(x)=0,第 m 步的模型是
fm(x)=fm−1(x)+T(x;Θm)(14)
fm−1(x) 为当前模型,通过损失函数极小化确定下一颗决策树的参数 Θm:
^Θm=arg minΘmN∑i=1L(yi,fm−1(xi)+T(xi;Θm))=arg minΘmN∑i=1(rmi−T(xi;Θm))2(15)
其中,rmi=yi−fm−1(xi) 表示残差。
使用不同的损失函数,得到不同的提升树算法。比如:平方误差损失函数的回归问题;指数损失函数、交叉熵损失的分类问题。
提升树算法是 AdaBoost 算法的特殊情况。
- 对于二分类问题,提升树只需将 AdaBoost 算法的基本分类器限制为二分类树即可。
- 基分类器的系数 αm 全为 1。
原理:只要损失函数是指数损失函数,就可以用指数损失函数调整样本的权值,从而让每个基分类器学到不同的内容。
1. 回归问题的提升树
训练集 T={(x1,y1),(x2,y2),...,(xN,yN)}, xi∈RnRn,yi∈RR,将输入空间 xi 划分为 J 个互不相交的区域 R1,R2,...,RJ,每个区域上确定输出的常量 cj,那么树可表示为
T(x;Θ)=J∑j=1cjI(x∈Rj)(16)
其中,参数 Θ={(R1,c1),(R2,c2),...,(RJ,cJ)} 表示树的区域划分和各区域上的常数。J 是回归树的复杂度即叶结点个数。
回归问题的提升树算法:
输入:训练集 T={(x1,y1),(x2,y2),...,(xN,yN)}, xi∈RnRn,yi∈RR;
输出:提升树 fM(x)。
① 初始化 f0(x)=0。
② 对 m=1,2,...,M。
(a) 对每一个样本 (xi,yi) ,按式 (16) 计算残差:
rmi=yi−fm−1(xi), i=1,2,...,N
(b) 利用 {(xi,rmi)}, i=1,2,...,N 学习一个回归树,得到 T(x;Θm)。
(c) 更新 fm(x)=fm−1(x)+T(x;Θm)。
③ 得到回归问题提升树
fM(x)=M∑m=1T(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|x⩽s}={1}R2={x|x>s}={2,3,4,5,6,7,8,9,10}c1=1N1∑xi∈R1yi=5.56c2=1N2∑xi∈R2yi=15.72m(s)=minc1∑xi∈R1(yi−c1)2+minc2∑xi∈R2(yi−c2)2=0+15.72=15.72
N1,N2 是 R1,R2 的样本点数。
现将 s 及 m(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.5 时 m(s) 最小,此时 R1={1,2,3,4,5,6},R2={7,8,9,10},c1=6.24,c2=8.91,
所以回归树 T1(x) 为
T1(x)={6.24,x<6.58.91,x⩾6.5f1(x)=T1(x)
用 f1(x) 拟合训练集,残差列表如下。r2i=yi−f1(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))=10∑i=1(yi−f1(xi))2=1.93
② 求 T2(x)。拟合残差列表。
T2(x)={−0.52,x<3.50.22,x⩾3.5
f2(x)=f1(x)+T2(x)=⎧⎨⎩5.72,x<3.56.46,3.5⩽x<6.59.13,x⩾6.5
用 f2(x) 拟合训练集的平方损失误差:
L(y,f2(x))=10∑i=1(yi−f2(xi))2=0.79
继续求得
T3(x)={0.15,x<6.5−0.22,x⩾6.5L(y,f3(x))=0.47,T4(x)={−0.16,x<4.50.11,x⩾4.5L(y,f4(x))=0.30,T5(x)={0.07,x<6.5−0.11,x⩾6.5L(y,f5(x))=0.23,T6(x)={−0.15,x<2.50.44,x⩾2.5f6(x)=f5(x)+T6(x)=T1(x)+T2(x)+...+T6(x)=⎧⎪
⎪
⎪
⎪
⎪⎨⎪
⎪
⎪
⎪
⎪⎩5.63,x<2.55.82,2.5⩽x<3.56.56,3.5⩽x<4.56.83,4.5⩽x<6.58.95,x⩾6.5
用 f6(x) 拟合训练集的平方损失误差
L(y,f6(x))=10∑i=1(yi−f6(xi))2=0.17
假设此时满足误差要求,那么 f(x)=f6(x) 为所求提升树。
二、梯度提升树
提升树用加法模型与前项分布算法实现学习的优化过程。当损失函数是平方误差损失函数和指数损失函数时,每一步优化很简单的。但对一般损失函数而言,每一步并不容易。
Freidman 提出利用损失函数的负梯度作为残差的近似值,拟合一个回归树。
−[∂L(yi, f(xi))∂f(xi)]f(x)=fm−1 (x)
其中,下标 f(x)=fm−1(x) 表示 f(x) 的取值 fm−1(x)。
梯度提升树回归算法:
输入:训练集 T={(x1,y1),(x2,y2),...,(xN,yN)},xi∈X⊆RRn,yi∈Y⊆RR;
其中,N 表示样本个数,X 表示输入空间,RRn 表示 n 维。
输出:回归树 ^f(x)。
其中,^f(x) 表示训练出来的模型。
(1)初始化
f0(x)=arg mincN∑i=1L(yi,c)
(2)对 m=1,2,...,M
(a)对 i=1,2,...,N,计算残差
rmi=−[∂L(yi, f(xi))∂f(xi)]f(x)=fm−1 (x)
(b)将所有样本 (xi,rmi) 拟合一个回归树,得到第 m 棵树的叶结点区域 Rmj,j=1,2,...,J。
(c)对 j=1,2,...,J,其中 J 为叶结点的个数,计算
cmj=arg minc∑xi∈Rmj L(yi,fm−1+c)
(d)更新 fm(x)=fm−1(x)+∑Jj=1cmjI(x∈Rmj)
(3)得到回归树
^f(x)=fM(x)=M∑m=1J∑j=1cmjI(x∈Rmj)
第 (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=yi−fm−1(xi)=−[∂L(yi, f(xi))∂f(xi)]f(x)=fm−1 (x)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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() 基础