集成学习
随机森林
AdaBoost 算法
提升树
梯度提升树(GBDT)
XGBoost
在 Boosting 系列算法中,最具代表的是 AdaBoost 算法。该算法即可用于分类,也可用于回归。
一、AdaBoost 分类算法
假设二分类训练集
T={(x1,y1),(x2,y2),...,(xN,yN)}
xi∈X⊆RnRn(n 维),yi∈Y={−1,1},
1. 算法流程
输入:T={(x1,y1),(x2,y2),...,(xN,yN)},xi∈RnRn(n 维),yi∈{−1,1},弱学习器算法;
输出:最终分类器 G(x)。
① 初始化权值
D1=(ω11,...ω1i,...ω1N), ω1i=1N, i=1,2,...,M
② 对 m=1,2,...M
(a) 使用权值分布 Dm 的训练集学习,得到基本分类器
Gm(x)→{−1,1}
(b) 计算 Gm(x) 的分类误差率
em=M∑i=1P(Gm(xi)≠yi)=N∑i=1ωmiI(Gm(xi)≠yi)(1)
(c) 计算 Gm(x) 的系数
αm=12log1−emem(2)
这里的对数为自然对数。
(d) 更新权值分布
Dm+1=(ωm+1,1,...,ωm+1,i,...,ωm+1,N)ωm+1,i=ωmie(−αm yi Gm (xi))ZmZm=N∑i=1ωmie(−αm yi Gm (xi))(3)(4)(5)
Zm 是规范化因子。
③ 构建基本分类器的线性组合
f(x)=M∑m=1αmGm(x)(6)
最终分类器
G(x)=sign(f(x))(7)
以上是 AdaBoost 二分类问题的算法流程,对于 AdaBoost 多分类问题,原理与二分类类似,最主要区别在基分类器的系数上。比如 AdaBoost SAMME 算法,它的基分类器系数
αm=12log1−emem+log(R−1)
其中 R 为类别数。如果是二分类,R=2。
2. 算法分析
① I(Gm(xi)≠yi) 中,当 Gm(xi)=yi 时为 0,Gm(xi)≠yi 时为 1。
② 0⩽em⩽0.5
因为当 em⩾0.5 会自动转换为 em⩽0.5。
x |
0 |
1 |
2 |
3 |
y |
1 |
1 |
1 |
1 |
Gm(x) |
-1 |
-1 |
-1 |
1 |
|
错误 |
错误 |
错误 |
正确 |
自动转换为:
x |
0 |
1 |
2 |
3 |
y |
1 |
1 |
1 |
1 |
−Gm(x) |
1 |
1 |
1 |
-1 |
|
正确 |
正确 |
正确 |
错误 |
③ 由下图可得,αm 随 em 减小而增大。


0⩽em⩽0.5⟹2⩽1em⟹1⩽1em−1⟹0⩽log1−emem⟹0⩽αm
3. 算法实例
例 1:给定训练集,用 AdaBoost 算法学习一个强分类器。
序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
x |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
解:① 初始化权值
D1=(ω11,ω12,...ω110)ω1i=0.1, i=1,2,...,M
② 对 m=1
(a) 使用权值分布 D1 的训练集学习,阈值 v=2.5 时分类误差率最大,得到基本分类器
G1(x)={1,x<2.5−1,x>2.5
(b) G1(x) 的分类误差率 e1=P(G1(xi)≠yi)=0.3。
(c) G1(x) 的系数:α1=12log1−e1e1=0.4236
(d) 更新权值分布:
D2=(ω21,...,ω2i,...ω210)ω2i=ω1ie(−α1yiG1(xi))Z1D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143)f1(x)=0.4236G1(x)
分类正确的样本权重更新计算:w1ie(−α1yiG1(xi))=0.1×e(−0.4263×1×1)=0.065469
分类错误的样本权重更新计算:w1ie(−α1yiG1(xi))=0.1×e(0.4263×1×1)=0.152745
Z1=0.065469×7+0.152748×3=0.916515
分类正确的样本更新后的权重:ω2i=0.0654690.916515=0.071432
分类错误的样本更新后的权重:ω2i=0.1527450.916515=0.166659
分类器 sign[f1(x)] 有三个误分类点。
对 m=2
(a) 使用权值分布 D2 的训练集学习,阈值 v=8.5 时分类误差率最大,得到基本分类器
G2(x)={1,x<8.5−1,x>8.5
(b) G2(x) 的分类误差率 e2=P(G2(xi)≠yi)=0.2143。
(c) G2(x) 的系数:α2=12log1−e2e2=0.6496
(d) 更新权值分布:
D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455)f2(x)=0.4236G1(x)+0.6496G2(x)
分类器 sign[f2(x)] 有三个误分类点。
对 m=3
(a) 使用权值分布 D3 的训练集学习,阈值 v=5.5 时分类误差率最大,得到基本分类器
G3(x)={1,x<5.5−1,x>5.5
(b) G3(x) 的分类误差率 e3=P(G3(xi)≠yi)=0.1820。
(c) G3(x) 的系数:α3=12log1−e3e3=0.7514
(d) 更新权值分布:
D3=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x)
分类器 sign[f2(x)] 的误分类点为0。
于是最终分类器
G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]
二、AdaBoost 分类算法误差分析
AdaBoost 能在学习过程中不断减少训练误差,即训练集上的分类误差率。
定理 1: AdaBoost 算法最终分类器的训练误差界为
1NN∑i=1I(G(xi)≠yi)⩽1N∑ie(−yif(xi))=∏mZm(8)
G(x)、f(x)、Zm 分别由式 (7)、(6)、(5) 给出。
证明:当 G(xi)≠yi 时,yif(xi)<0,因而 e(−yif(xi))⩾1。推到出前半部分。
后半部分推到用到 Zm 的定义式 (5)、(4) 的变形:
ωmie(−αm yi Gm (xi))=Zmωm+1,i
1N∑iexp(−yif(xi))=1N∑iexp(−M∑m=1αmyiGm(xi))=∑iw1iM∏m=1exp(−αmyiGm(xi))=Z1∑iw2iM∏m=2exp(−αmyiGm(xi))=Z1Z2∑iw3iM∏m=3exp(−αmyiGm(xi))=⋯=Z1Z2⋯ZM−1∑iwMiexp(−αMyiGM(xi))=M∏m=1Zm
这说明,每一轮选取适当的 Gm 使 Zm 最小,从而使训练误差下降最快。
定理 2: 二分类问题 AdaBoost 的训练误差界
M∏m=1Zm=M∏m=1[2√em(1−em)]=M∏m=1√(1−4γ2m)⩽exp(−2M∑m=1γ2m)
推论 1:如果存在 γ>0,对所有 m 有 γm⩾γ,则
1NN∑i=1I(G(xi)≠yi)⩾e(e−2Mγ2 )
表明此条件下 AdaBoost 的训练误差是以指数速率下降。
注意:AdaBoost 不需要知道下界 γ。该算法具有适应性,即能适应弱分类器各自的训练误差。这是它名称的由来,Ada 是 Adaptive 的简写。
三、AdaBoost 分类算法解释
AdaBoost 分类算法还有另一种解释,可认为 AdaBoost 分类算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法的二分类学习算法。
1. 前项分布算法
加法模型
f(x)=M∑m=1βmb(x;γm)(9)
b(x;γm) 为基函数,γm 为基函数的参数,βm 为基函数的系数。显然,式 (6) 是加法模型。
在给定训练集及损失函数 L(y,f(x)) 的条件下,学习加法模型 f(x) 成为经验风险极小化即损失函数极小化问题:
minβm ,γm N∑m=1L(yi,M∑m=1βmb(xi;γm))(10)
前向分步算法思想:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,那么就可以简化优化的复杂度。具体地,每步只需优化如下损失函数:
minβ,γN∑i=1L(yi,βb(xi;γ))(11)
给定训练集 T={(x1,y1),(x2,y2),...,(xN,yN)},xi∈X⊆RnRn(n 维),yi∈Y={−1,1}。损失函数 L(y,f(x)) 和基函数的集合 {b(x;γ)},学习加法模型 f(x) 的前向分步算法如下。
前向分布算法:
输入:训练集 T={(x1,y1),(x2,y2),...,(xN,yN)},损失函数 L(y,f(x)) 和基函数集 {b(x;γ)};
输出:加法模型 f(x)。
① 初始化 f0(x)=0;
② 对 m=1,2,...,M
(a) 极小化损失函数
(βm,γm)=argminβ,γN∑i=1L(yi,fm−1(xi)+βb(xi;γ))
得到参数 βm,γm。
(b) 更新
fm(x)=fm−1(x)+βmb(x;γm)
③ 得到加法模型
f(x)=fM(x)=M∑m=1βmb(x;γm)
这样,前向分步算法将同时求解从 m=1 到 M 所有参数 βm,γm 的优化问题简化为逐次求解各个 βm,γm 的优化问题。
2. 前向分步算法与 AdaBoost 分类算法
定理 3:AdaBoost 分类算法是前向分布算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。
求证:AdaBoost 算法基分类器的系数为 αm=12log1−emem。
证明:假设经过 m−1 轮迭代,得到弱分类器 fm−1(x),根据前向分布算法,有:
fm=fm−1(x)+αmGm(x)
AdaBoost 的损失函数是指数损失,则有:
L=N∑i=1e(−yi fm (xi))=N∑i=1e(−yi (fm−1 (xi)+αm Gm))
因为 fm−1(x) 已知,所以将其移到前面:
L=N∑i=1¯wm,i e(−yi αm Gm (xi))
其中,¯wm,i=e(−yi (fm−1 (x))) 是每轮迭代的样本权重,证明化简如下:
¯wm,i=e(−yi (fm−1 (xi)+αm−1 Gm−1 (xi)))=¯wm−1,i e(−yi αm−1 Gm−1 (xi))
继续化简 L:
L=N∑i=1¯wm,i e(−yi αi Gm (xi))=∑yi=Gm (xi)¯wm,i e−αm+∑yi≠Gm (xi)¯wm,i eαm=N∑i=1¯wm,i(∑yi=Gm (xi) ¯wm,i∑Ni=1 ¯wm,i e−αm+∑yi≠Gm (xi) ¯wm,i∑Ni=1 ¯wm,i eαm)
重写 L:
L=i=1∑Nwm,i((1−em)e(−αm )+eme(αm ))
对 αm 求偏导,令其为 0,则有:
αm=12log1−emem
四、AdaBoost 回归算法
AdaBoost 回归算法。
五、AdaBoost 算法正则化
为防止 AdaBoost 过拟合,通常加入正则化项,这个正则化通常称为步长(learning rate)。定义为 ν。
对于弱学习器的迭代,
fm(x)=fm−1(x)+αmGm(x)
加上正则化项,
fm(x)=fm−1(x)+ναmGm(x)
其中 0<ν⩽1。
对于同样的训练集,较小的 ν 意味需要更多的弱学习器、迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
六、AdaBoost 小结
AdaBoost 算法弱学习器通常是决策树和神经网络。对于决策树,AdaBoost 分类用 CART 分类树,AdaBoost 回归用 CART 回归树。
AdaBoost 优点:
- 作为分类器时,分类精度高。
- 可以使用各种回归分类模型构建弱学习器。
- 不容易过拟合。
AdaBoost 缺点:
- 对异常数据敏感,异常数据在迭代中会获得较高的权重。影响最终强学习器的预测准确性。
【推荐】国内首个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)