【机器学习基础01】Blending、Bagging与AdaBoost
作者:互联网
去年的学习笔记,最近复习拿出来整理一下。
Aggregation Model
假设有 T T T个模型 g 1 , ⋯ , g T g_{1}, \cdots, g_{T} g1,⋯,gT,常见的聚合方法有:
- 在一个验证集上选出最佳的:
G ( x ) = g t ∗ ( x ) with t ∗ = argmin t ∈ { 1 , 2 , … , T } E val ( g t − ) G(\mathbf{x})=g_{t_{*}}(\mathbf{x}) \text { with } t_{*}=\operatorname{argmin}_{t \in\{1,2, \ldots, T\}} E_{\text {val }}\left(g_{t}^{-}\right) G(x)=gt∗(x) with t∗=argmint∈{1,2,…,T}Eval (gt−)
- 将所有模型取平均值:
G ( x ) = sign ( ∑ t = 1 T 1 ⋅ g t ( x ) ) G(\mathbf{x})=\operatorname{sign}\left(\sum_{t=1}^{T} 1 \cdot g_{t}(\mathbf{x})\right) G(x)=sign(t=1∑T1⋅gt(x))
- 将所有模型加权平均:
G ( x ) = sign ( ∑ t = 1 T α t ⋅ g t ( x ) ) with α t ≥ 0 G(\mathbf{x})=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} \cdot g_{t}(\mathbf{x})\right) \text { with } \alpha_{t} \geq 0 G(x)=sign(t=1∑Tαt⋅gt(x)) with αt≥0
- 根据当前状态确定:
G ( x ) = sign ( ∑ t = 1 T q t ( x ) ⋅ g t ( x ) ) with q t ( x ) ≥ 0 G(\mathbf{x})=\operatorname{sign}\left(\sum_{t=1}^{T} q_{t}(\mathbf{x}) \cdot g_{t}(\mathbf{x})\right) \text { with } q_{t}(\mathbf{x}) \geq 0 G(x)=sign(t=1∑Tqt(x)⋅gt(x)) with qt(x)≥0
以上都是直观上的想法,下面进一步研究。
Blending
均值融合(Uniform Blending)
在分类问题中:
G
(
x
)
=
sign
(
∑
t
=
1
T
g
t
(
x
)
)
G(\mathbf{x})=\operatorname{sign}\left(\sum_{t=1}^{T} g_{t}(\mathbf{x})\right)
G(x)=sign(t=1∑Tgt(x))
在多分类任务中少数服从多数:
在回归时就是取所有模型输出的均值。
当 g t g_{t} gt预测值相近,那么性能不变。当 g t g_{t} gt多样民主时,一些分类结果 g t ( x ) > f ( x ) g_{t}(\mathbf{x})>f(\mathbf{x}) gt(x)>f(x),另一些分类结果$ g_{t}(\mathbf{x})<f(\mathbf{x})$,那么理想状态取平均可以获得最佳解。综合上述两种需求,多样性的hypotheses更容易使得融合模型性能更佳。
可以通过理论推导得出,均值融合可以降低误差:
avg
(
E
out
(
g
t
)
)
=
avg
(
E
(
g
t
−
G
)
2
)
+
E
out
(
G
)
\operatorname{avg}\left(E_{\text {out }}\left(g_{t}\right)\right)=\operatorname{avg}\left(\mathcal{E}\left(g_{t}-G\right)^{2}\right)+E_{\text {out }}(G)
avg(Eout (gt))=avg(E(gt−G)2)+Eout (G)
从上式可以得出除非所有的
g
t
g_t
gt相等,否则融合后的模型
G
G
G的误差是要比所有子模型误差的平均小的(相差了一个方差)。
线性融合(Linear Blending)
分类问题:
G
(
x
)
=
sign
(
∑
t
=
1
T
α
t
⋅
g
t
(
x
)
)
with
α
t
≥
0
G(\mathbf{x})=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} \cdot g_{t}(\mathbf{x})\right) \text { with } \alpha_{t} \geq 0
G(x)=sign(t=1∑Tαt⋅gt(x)) with αt≥0
回归问题:
min
α
t
≥
0
1
N
∑
n
=
1
N
(
y
n
−
∑
t
=
1
T
α
t
g
t
(
x
n
)
)
2
\min _{\alpha_{t} \geq 0} \frac{1}{N} \sum_{n=1}^{N}\left(y_{n}-\sum_{t=1}^{T} \alpha_{t} g_{t}\left(\mathbf{x}_{n}\right)\right)^{2}
αt≥0minN1n=1∑N(yn−t=1∑Tαtgt(xn))2
那么最优化问题就可以写为:
min
α
t
≥
0
1
N
∑
n
=
1
N
err
(
y
n
,
∑
t
=
1
T
α
t
g
t
(
x
n
)
)
\min _{\alpha t \geq 0} \frac{1}{N} \sum_{n=1}^{N} \operatorname{err}\left(y_{n}, \sum_{t=1}^{T} \alpha_{t} g_{t}\left(\mathbf{x}_{n}\right)\right)
αt≥0minN1n=1∑Nerr(yn,t=1∑Tαtgt(xn))
使用训练集获取
g
t
g_t
gt,但是最好使用验证集获取
α
t
\alpha_t
αt。
Stacking
如上图所示,第一部分是用 N N N个基础模型如xgb1、lgb1进行 n n n折交叉验证,那么就得到了一个 N ∗ n N *n N∗n的特征矩阵,用这个特征矩阵作为第二层模型的输入。测试时也要把原数据集通过 N N N个基模型映射到 N N N维的空间上去。
Bagging
Blending是学到不同的 g t g_t gt后把他们聚合起来,那能不能边学 g t g_t gt边聚合。
获得多样性 g t g_t gt的方法有:
- diversity by different models
- diversity by different parameters: 例如优化方法GD的步长变化多样
- diversity by algorithmic randomness:例如模型算法中自带随机性
- diversity by data randomness
Bootstrap Aggregation
从数据出发,如果能得到很多多样性的数据集 D t D_t Dt来训练一个 g t g_t gt就好了。可以用数据重采样获得仿真的 D t D_t Dt:
- 在原有的大小为 N N N 的数据集 D \mathcal{D} D 上, 有放回的采样 N ′ N^{\prime} N′ 次获得仿真数据集 D t → \mathcal{D}_{t} \rightarrow Dt→ 这一步便是 Bootstrap 操作
- 通过 A ( D ~ t ) \mathcal{A}\left(\tilde{\mathcal{D}}_{t}\right) A(D~t) 获取 g t g_{t} gt, 再使用均值融合获得: G = Uniform ( { g t } ) G=\operatorname{Uniform}\left(\left\{g_{t}\right\}\right) G=Uniform({gt}) 。
Boostrap方法合理前提是:数据集的多样性和基算法 A \mathcal A A对于随机数据敏感。
Adaptive Boosting (AdaBoost )实际上是从 Bagging 的核心 bootstrap 出发实现的一种融合算法,下面具体介绍。
AdaBoost
AdaBoost的核心思想是当前所有模型错分类的数据会被强化,训练下个弱分类器。最终所有弱分类器投票。一个经典的示意图:
简单图示算法流程:
算法流程
对二元分类问题总结一下:
输入为样本集 D = { ( x , y 1 ) , ( x 2 , y 2 ) , … ( x n , y n ) } D=\left\{\left(x, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots\left(x_{n}, y_{n}\right)\right\} D={(x,y1),(x2,y2),…(xn,yn)},,弱学习器算法, 弱学习器迭代次数 T T T。
输出为最终的强学习器 G ( x ) G(x) G(x)。
- 初始化样本集权重为
u ( 1 ) = [ 1 N , 1 N , ⋯ , 1 N ] \mathbf{u}^{(1)}=\left[\frac{1}{N}, \frac{1}{N}, \cdots, \frac{1}{N}\right] u(1)=[N1,N1,⋯,N1]
-
对于 t = 1 , 2 , . . . , T t = 1, 2,...,T t=1,2,...,T:
(a) 使用具有权重 u ( t ) \mathbf{u}^{(t)} u(t)的样本集来训练数据,得到弱学习器 g t ( x ) g_t(x) gt(x)
(b) 计算 g t ( x ) g_t(x) gt(x)的分类误差率
ϵ t = ∑ n = 1 N u n ( t ) [ y n ≠ g t ( x n ) ] ∑ n = 1 N u n ( t ) \epsilon_{t}=\frac{\sum_{n=1}^{N} u_{n}^{(t)} [ y_{n} \neq g_{t}\left(\mathbf{x}_{n}\right) ]}{\sum_{n=1}^{N} u_{n}^{(t)}} ϵt=∑n=1Nun(t)∑n=1Nun(t)[yn=gt(xn)]
© 更新样本集的权重分布:分类对的样本,权重 u n ( t + 1 ) ← u n ( t ) ⋅ 1 − ϵ t ϵ t u_{n}^{(t+1)} \leftarrow u_{n}^{(t)} \cdot \sqrt{\frac{1-\epsilon_{t}}{\epsilon_{t}}} un(t+1)←un(t)⋅ϵt1−ϵt ;分类错的样本,权重 u n ( t + 1 ) ← u n ( t ) / 1 − ϵ t ϵ t u_{n}^{(t+1)} \leftarrow u_{n}^{(t)} / \sqrt{\frac{1-\epsilon_{t}}{\epsilon_{t}}} un(t+1)←un(t)/ϵt1−ϵt (d) 计算弱分类器的系数:
α t = ln ( 1 − ϵ t ϵ t ) \alpha_{t}=\ln \left( \sqrt{\frac{1-\epsilon_{t}}{\epsilon_{t}}} \right) αt=ln(ϵt1−ϵt ) -
最终构建的分类器为:
G ( x ) = sign ( ∑ t = 1 T α t g t ( x ) ) G(\mathbf{x})=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} g_{t}(\mathbf{x})\right) G(x)=sign(t=1∑Tαtgt(x))
这里最弱的分类器可以是一个decision stump(单层决策树),只有三个参数:选择一个特征 i i i,设定一个阈值 θ \theta θ,判定阈值左右是什么类 s s s。
标签:Bagging,01,mathbf,sum,gt,right,AdaBoost,sign,left 来源: https://blog.csdn.net/yanguang1470/article/details/122621059