基本思路
群体智慧:如果能从所有的科学家中选择一群科学家组成一个团队,并且团队中的每个科学家都略强于随机选择的一个科学家,那么有理由相信这个科学家团队能比单个科学家做出更好的决定。
这样的群体智慧用到机器学习的学习器上也成立,集合多个个体学习器的方法称为集成学习。
目前集成学习主要分成两大流派:
- bagging
- boosting
1 bagging
一棵树是决策树,多棵树是随机森林,解决决策树泛化能力不足的缺点
随机森林:
- 随机选择样本
- 随机选择特征
而且是有放回的随机抽样:自主采样法(bootstap sampling)
分类器并行。
投票法:少数服从多数
2 boosting(提升)
自适应地改变训练样本的分布,使得弱分类器聚焦到那些很难分类的样本上。它的做法是每一个训练样本赋予一个权重,在每一轮训练结束后自动地调整权重。
弱分类器是串行的,因此是个迭代的过程。
- adaboost:boosting + 决策树
- GBDT:梯度提 升树
- XGBoost:
2.1 结合策略
多个学习器并不是简单的拼凑在一起,而是有策略的组合在一起,机器学习是靠数据驱动的,因此通过训练集就能找到能让每个学习器发挥最大效果的策略组合。
常用的组合策略有:
2.1.1 平均法
算术平均
加权平均
H
(
x
)
=
1
/
n
∑
i
=
1
n
w
i
h
i
s
.
t
.
w
I
≥
0
,
∑
i
=
1
n
w
i
=
1
H(x)=1/n\sum_{i=1}^{n}w_ih_i \\ s.t. w_I \geq0,\sum_{i=1}^{n}w_i=1
H(x)=1/ni=1∑nwihis.t.wI≥0,i=1∑nwi=1
2.2.2 投票法
分类常用
- 相对多数投票法:少数服从多数
- 绝对多数投票法:投票数过半数
- 加权投票法:权重
2.2.3 学习法
代表:stacking
对结果再加一层学习器,将训练集弱学习器的学习结果作为输入,训练集的输出作为输出,重新训练一个学习器来得到最终结果。
kaggle中一般用学习法。
2.2 Adaboost (adaptive boosting)
Adaboost 被认为是模型为加法模型,损失函数为指数函数、学习算法为前向分布算法时的二类分类学习方法。
2.2.1 加法模型
加法模型可以看作模型是一系列基函数的线性组合。
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum_{m=1}^{M}\beta_mb(x;\gamma_m)
f(x)=m=1∑Mβmb(x;γm)
b ( x ; γ m ) b(x;\gamma_m) b(x;γm)是基函数, γ m \gamma_m γm是基函数的参数, β m \beta_m βm是基函数的系数。
2.2.2 损失函数
指数函数
L
(
y
,
f
(
x
)
)
=
e
x
p
(
−
y
f
(
x
)
)
L(y,f(x)) = exp(-yf(x))
L(y,f(x))=exp(−yf(x))
我们总是希望损失函数极小化:
m
i
n
β
m
,
γ
m
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
=
m
i
n
β
m
,
γ
m
∑
i
=
1
N
L
(
y
i
,
∑
i
=
1
M
β
m
b
(
x
i
;
γ
m
)
)
\underset{\beta_m,\gamma_m}{min}\quad\sum_{i=1}^{N}L(y_i,f(x_i))\\ =\underset{\beta_m,\gamma_m}{min}\quad \sum_{i=1}^{N}L(y_i,\sum_{i=1}^{M}\beta_mb(x_i;\gamma_m))
βm,γmmini=1∑NL(yi,f(xi))=βm,γmmini=1∑NL(yi,i=1∑Mβmb(xi;γm))
2.2.3 前向分布算法
通常上面的损失函数是一个复杂的优化问题。但因为学习的是加法模型,如果能够从前往后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数项,就可以简化优化的复杂度。
具体每步只需要优化如下的损失函数:
-
初始化模型 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0;
-
对每个样本 f o r m = 1 , 2 , . . . M for\quad m = 1,2,...M form=1,2,...M
-
极小化损失函数
a r g    m i n β m , γ m ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x ; γ ) ) ) \underset{\beta_m,\gamma_m}{arg\;min}\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+\beta b(x_;\gamma))) βm,γmargmini=1∑NL(yi,fm−1(xi)+βb(x;γ))) -
更新加法模型 f m ( x ) f_m(x) fm(x)
f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(x)=f_{m-1}(x)+\beta_mb(x;\gamma_m) fm(x)=fm−1(x)+βmb(x;γm)
-
-
得到加法模型:
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_M(x)=\sum_{m=1}^{M}\beta_mb(x;\gamma_m) f(x)=fM(x)=m=1∑Mβmb(x;γm)
只需把基函数换成弱分类器 G m ( x ) G_m(x) Gm(x),就能得到adaboost算法:
2.2.4 adaboost
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
,
y
∈
{
−
1
,
+
1
}
T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\},y\in\{-1,+1\}
T={(x1,y1),(x2,y2),...,(xN,yN)},y∈{−1,+1}
输出:最终分类器
G
(
x
)
G(x)
G(x)
-
初始化训练数据的权值分布:
赋予训练集中每个样本一个权重,构成权重向量D,并假设每个权重都相等。
D = ( w 11 , . . . , w 1 i , . . . , w i N ) , w 1 i = 1 N D=(w_{11},...,w_{1i},...,w_{iN}),w_{1i}=\dfrac{1}{N} D=(w11,...,w1i,...,wiN),w1i=N1 -
加法模型:叠加模型直到满足条件
f o r m = 1 , 2 , . . . , M : for\quad m=1,2,...,M: form=1,2,...,M:(m为模型个数)
(a). 使用具有权值分布 D m D_m Dm的训练数据集学习,得到基本分类器:
G m ( x ) : χ → { − 1 , + 1 } G_m(x):\chi \to \{-1,+1\} Gm(x):χ→{−1,+1}(b). 计算 G m ( x ) G_m(x) Gm(x)在训练数据集上的分类误差率:
e m = 分 错 的 数 量 样 本 总 数 e_m=\dfrac{分错的数量}{样本总数} em=样本总数分错的数量e m = ∑ i = 1 N w m i I ( y i    ≠ G m ( x i ) ) ∑ i = 1 N w m i = ∑ i = 1 N w m i I ( y i    ≠ G m ( x i ) ) e_m=\dfrac{\sum_{i=1}^{N}w_{mi}I(y_i\;\neq G_m(x_i))}{ \sum_{i=1}^{N}w_{mi} } \\=\sum_{i=1}^{N}w_{mi}I(y_i\;\neq G_m(x_i)) em=∑i=1Nwmi∑i=1NwmiI(yi̸=Gm(xi))=i=1∑NwmiI(yi̸=Gm(xi))
©.计算分类器 G m ( x ) G_m(x) Gm(x)的权重系数
α m = 1 2 l o g 1 − e m e m \alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m} αm=21logem1−em1 − e m \quad \quad 1-e_m 1−em是准确率, 1 − e m e m \dfrac{1-e_m}{e_m} em1−em是相对准确率,可见错误率 e m e_m em上升,分类器所占的权重 α m \alpha_m αm就会降低。
(d). 更新训练数据集的权重分布
D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , . . . . , w m + 1 , N ) D_{m+1}=(w_{m+1,1},w_{m+1,2},....,w_{m+1,N}) Dm+1=(wm+1,1,wm+1,2,....,wm+1,N)
w m + 1 , i = w m i Z m e x p ( − α m y i G m ( x i ) ) w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)) wm+1,i=Zmwmiexp(−αmyiGm(xi))
Z
m
Z_m
Zm是归一化因子,它使
D
m
D_m
Dm成为一个概率分布:
Z
m
=
∑
i
=
1
N
w
m
i
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
Z_m=\sum_{i=1}^{N}w_{mi}exp(-\alpha_my_iG_m(x_i))
Zm=i=1∑Nwmiexp(−αmyiGm(xi))
- 构建基本分类器的线性组合:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M}\alpha_mG_m(x) f(x)=m=1∑MαmGm(x)
得到最终分类器:
G
(
x
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
G(x)=sign(\sum_{m=1}^{M}\alpha_mG_m(x))
G(x)=sign(m=1∑MαmGm(x))
Adaboost的训练误差分析表明,Adaboost的每次迭代可以减少它在训练数据集上的分类误差率,这说明了它作为提升方法的有效性。
Adaboost的优点:
- 易用,需要调节的参数少;
- 弱分类器可以是任何模型,比如逻辑回归, 线性回归等等, 最常用的是决策树桩;
3. 提升树
提升树是以分类树和回归树为基本分类器的提升方法,提升方法采用加法模型与前向分布算法,以决策树为基函数的提升方法称为提升树。
3.1梯度提升树算法
当损失函数是平方损失和 指数损失函数时,每一步的优化是简单的。但对于一般损失函数而言,则利用损失函数的负梯度去近似平方损失中的残差。
代码实现
决策树桩:基于单个特征的单层决策树,相当于在分类平面的一条水平线
每个弱分类器只能选择一个特征。
参考:
- 李航- 统计学习
- https://zhuanlan.zhihu.com/p/38507561
- https://www.bilibili.com/video/av56033745?from=search&seid=17687865746952149587