机器学习:决策树与集成学习 2
集成学习
Bagging
Boosting aggregating, 基于基学习器进行投票,并行。
Boosting
对基学习器的预测结果进行加权,串行。
Stacking
每个基模型,对每个样本进行预测,将预测值作为特征,形成新的训练集。
集成学习的偏差与方差
偏差
基模型输出均值与真实值之间的差异,主要体现在Boosting方法中。
方差
基模型输出的方差,主要体现在在Bagging方法中。
设
m
m
m个基模型的期望为
μ
\mu
μ,方差为
σ
2
\sigma^2
σ2,模型权重
r
r
r,两两模型之间的相关系数为
ρ
\rho
ρ相等。
Bagging和Boosting的基模型都是线性组成的。
基模型的总体期望为:
E
(
F
)
=
E
(
∑
i
m
r
i
f
i
)
=
∑
i
m
r
i
E
(
f
i
)
E(F)=E(\sum_{i}^{m}r_if_i)=\sum_{i}^{m}r_iE(f_i)
E(F)=E(∑imrifi)=∑imriE(fi)
注:
随机变量x, y的相关系数为
ρ
\rho
ρ, 协方差为
c
o
v
(
x
,
y
)
=
1
n
∑
i
n
(
x
i
−
μ
x
)
(
y
i
−
μ
y
)
cov(x,y)=\frac{1}{n}\sum_i^n(x_i-\mu_x)(y_i-\mu_y)
cov(x,y)=n1∑in(xi−μx)(yi−μy), 标准差为
s
t
d
(
x
)
=
v
a
r
(
x
)
std(x)=\sqrt{var(x)}
std(x)=var(x),则x, y的相关系数就是归一化之后的协方差,即:
ρ
=
c
o
v
(
x
,
y
)
v
a
r
(
x
)
v
a
r
(
y
)
\rho=\frac{cov(x,y)}{\sqrt{var(x)}\sqrt{var(y)}}
ρ=var(x)var(y)cov(x,y), 该关系式在下面的公式推导中会使用到。
模型总体的方差(m个基模型输出的方差)为:
预测结果
y
i
=
∑
i
m
r
i
f
i
y_i=\sum_{i}^{m}r_if_i
yi=∑imrifi为随机变量,模型总体的方差就是随机变量
y
i
y_i
yi的方差。
V
a
r
(
F
)
Var(F)
Var(F)
=
V
a
r
(
y
i
)
=Var(y_i)
=Var(yi)
=
V
a
r
(
∑
i
m
r
i
f
i
)
=Var(\sum_{i}^{m}r_if_i)
=Var(∑imrifi)
=
∑
i
m
V
a
r
(
r
i
f
i
)
+
∑
i
≠
j
m
C
o
v
(
r
i
f
i
,
r
j
f
j
)
=\sum_{i}^{m}Var(r_if_i)+\sum_{i\neq j}^{m}Cov(r_if_i, r_jf_j)
=∑imVar(rifi)+∑i=jmCov(rifi,rjfj)
=
∑
i
m
r
i
2
V
a
r
(
f
i
)
+
∑
i
≠
j
m
ρ
i
r
i
r
j
V
a
r
(
f
i
)
V
a
r
(
f
j
)
=\sum_i^mr_i^2Var(f_i)+\sum_{i\neq j}^{m}\rho_ir_ir_j\sqrt{Var(f_i)}\sqrt{Var(f_j)}
=∑imri2Var(fi)+∑i=jmρirirjVar(fi)Var(fj)
=
m
r
2
σ
2
+
m
(
m
−
1
)
r
2
σ
2
ρ
=mr^2\sigma^2+m(m-1) r^2\sigma^2\rho
=mr2σ2+m(m−1)r2σ2ρ
=
m
r
2
σ
2
+
m
2
r
2
σ
2
ρ
−
m
r
2
σ
2
ρ
=mr^2\sigma^2+m^2 r^2\sigma^2\rho-m r^2\sigma^2\rho
=mr2σ2+m2r2σ2ρ−mr2σ2ρ
=
m
r
2
σ
2
(
1
−
ρ
)
+
m
2
r
2
σ
2
ρ
=mr^2\sigma^2(1-\rho)+m^2r^2\sigma^2\rho
=mr2σ2(1−ρ)+m2r2σ2ρ
模型的准确度:
E
r
r
o
r
=
b
i
a
s
2
+
v
a
r
+
ζ
Error=bias^2+var+\zeta
Error=bias2+var+ζ
Bagging的偏差与方差
Bagging是有放回的重复采样,每一个基模型使用的数据子集是从同一个数据集中采样得到的。
在Bagging算法中,m个基模型,设均值为
E
(
f
)
=
μ
E(f)=\mu
E(f)=μ, 方差为
σ
2
\sigma^2
σ2,每个基模型的权重为
r
i
=
1
m
r_i=\frac{1}{m}
ri=m1,
此时,模型总体的期望为:
E
(
F
)
=
E
(
∑
i
m
r
i
f
i
)
=
∑
i
m
E
(
r
i
f
i
)
=
∑
i
m
r
i
E
(
f
i
)
=
∑
i
m
1
m
μ
=
m
∗
1
m
μ
=
μ
E(F)=E(\sum_{i}^{m}r_if_i) = \sum_{i}^{m}E(r_if_i)=\sum_{i}^{m}r_iE(f_i)=\sum_{i}^{m}\frac{1}{m}\mu=m*\frac{1}{m}\mu=\mu
E(F)=E(∑imrifi)=∑imE(rifi)=∑imriE(fi)=∑imm1μ=m∗m1μ=μ
因此,模型整体的期望等于基模型的期望,在实际使用中,更倾向于选择强基模型。bagging中模型整体的期望可以写成强基模型的期望,但是在boosting算法中,模型整体的期望并不能写成弱基模型的期望,下面再次提到。
此时,模型的方差为:
V
a
r
(
F
)
Var(F)
Var(F)
=
m
r
2
σ
2
(
1
−
ρ
)
+
m
2
r
2
σ
2
ρ
=m r^2 \sigma^2 (1-\rho)+m^2 r^2 \sigma^2 \rho
=mr2σ2(1−ρ)+m2r2σ2ρ
=
m
∗
(
1
m
)
2
σ
2
(
1
−
ρ
)
+
m
2
(
1
m
)
2
σ
2
ρ
=m*{(\frac{1}{m})}^2 \sigma^2 (1-\rho)+m^2 {(\frac{1}{m})}^2 \sigma^2 \rho
=m∗(m1)2σ2(1−ρ)+m2(m1)2σ2ρ
=
1
m
σ
2
(
1
−
ρ
)
+
σ
2
ρ
=\frac{1}{m} \sigma^2 (1-\rho)+ \sigma^2\rho
=m1σ2(1−ρ)+σ2ρ
因此,模型数量m增加时,模型整体的方差在减小,因此说,Bagging算法减小的是模型的方差。并且,基模型之前尽量呈现弱相关性,即
ρ
\rho
ρ的取值要尽量小。
从偏差-方差分解的角度,bagging主要关注降低模型的方差。
Boosting的偏差与方差
Boosting的每一个基模型使用的是同一个训练数据集,并且基模型之间的训练顺序是串行的,基模型之间具有强相关性,因此,我们将基模型之间的相关系数设置为
ρ
=
1
\rho=1
ρ=1,设每个基模型权重为:$r_i=\frac{1}{m}$1
模型总体的期望为:
E
(
F
)
=
∑
i
m
r
i
E
(
f
i
)
E(F)=\sum_{i}^{m} r_i E(f_i)
E(F)=∑imriE(fi)
模型总体的方差为:
V
a
r
(
F
)
Var(F)
Var(F)
=
m
r
2
σ
2
(
1
−
ρ
)
+
m
2
r
2
σ
2
ρ
=m r^2 \sigma^2 (1-\rho)+m^2 r^2 \sigma^2 \rho
=mr2σ2(1−ρ)+m2r2σ2ρ
$=\frac{1}{m} \sigma^2 (1-\rho)+ \sigma^2\rho$1
$=\sigma^2$1
观察公式,我们可以看到,此时模型整体的方差等于基模型的方差,因此
boosting中基模型为弱模型就可以了。由于模型最终整体的输出结果是由弱基模型的输出累加得到的,boosting算法常采用前向加性模型,可以理解为残差逼近思想。
从偏差-方差分解的角度,boosting主要关注降低偏差。
随机森林 Random Forest
随机森林是bagging的一个扩展和变体,bagging算法中,每一个基学习器的训练集是从数据集中随机采样获得的数据子集,随机森林在该基础之上,当基模型为决策树时,在决策树的生成过程中,节点属性的选择并不是直接选择最优属性进行节点划分,而是先随机选择一个属性子集(特征子集),再在该属性子集中选择一个最优属性进行节点的分裂。即随机森林中同时引入了样本扰动和属性扰动。
优点
- 在数据集上的表现一般由于bagging方法。
- 易于并行化,在大数据集上有很大的优势。
- 能够处理高维数据集。
AdaBoost
Adaptive Boosting
boosting类算法中最经典的一个算法,最初标准的AdaBoost算法只能用于二分类任务。
Adaboost的核心是加法模型(即基学习器的线性组合),是一个前向分步学习算法。
第k轮训练的强基学习器为:
F
k
(
x
)
=
F
k
−
1
(
x
)
+
α
k
f
k
(
x
)
F_k(x)=F_{k-1}(x)+ \alpha_k f_k(x)
Fk(x)=Fk−1(x)+αkfk(x)
标准adaboost的损失函数定义为N个样本的指数损失函数:
L
(
y
,
F
)
=
∑
i
=
1
N
e
x
p
(
−
y
i
F
k
(
x
i
)
)
L(y,F)=\sum_{i=1}^{N}exp(-y_i F_k(x_i))
L(y,F)=∑i=1Nexp(−yiFk(xi)),这是所有样本在第k个基学习器上的损失函数
指数损失函数的二阶泰勒展开与交叉熵损失函数是等价的。
第k轮训练时,所有k个基学习器的损失函数为:
L
(
y
,
F
)
=
∑
i
=
1
N
e
x
p
[
(
−
y
i
)
(
F
k
−
1
(
x
i
)
+
α
k
f
k
(
x
i
)
)
]
L(y,F)=\sum_{i=1}^{N} exp[(-y_i) (F_{k-1}(x_i) + \alpha_k f_k(x_i))]
L(y,F)=∑i=1Nexp[(−yi)(Fk−1(xi)+αkfk(xi))]
=
∑
i
=
1
N
e
x
p
[
−
y
i
F
k
−
1
(
x
i
)
−
y
i
α
k
f
k
(
x
i
)
]
=\sum_{i=1}^{N} exp[-y_i F_{k-1}(x_i) -y_i \alpha_k f_k(x_i)]
=∑i=1Nexp[−yiFk−1(xi)−yiαkfk(xi)]
=
∑
i
=
1
N
[
e
x
p
(
−
y
i
F
k
−
1
(
x
i
)
)
∗
e
x
p
(
−
y
i
α
k
f
k
(
x
i
)
)
]
=\sum_{i=1}^{N} [exp(-y_i F_{k-1}(x_i)) *exp(-y_i \alpha_k f_k(x_i))]
=∑i=1N[exp(−yiFk−1(xi))∗exp(−yiαkfk(xi))]
在训练第k个基学习器
f
k
f_k
fk时,前k-1个基学习器
F
k
−
1
=
∑
i
=
1
k
−
1
α
i
f
i
F_{k-1}=\sum_{i=1}^{k-1} \alpha_i f_i
Fk−1=∑i=1k−1αifi是固定的,因此这部分的损失函数
∑
i
=
1
N
e
x
p
(
−
y
i
F
k
−
1
(
x
i
)
)
\sum_{i=1}^{N}exp(-y_i F_{k-1}(x_i))
∑i=1Nexp(−yiFk−1(xi))也是固定的,我们将其看作一个系数
w
k
,
i
w_{k,i}
wk,i,这样,前面的损失函数可以进一步写成:
L
(
y
,
F
)
=
∑
i
=
1
N
w
k
,
i
e
x
p
(
−
y
i
α
k
f
k
(
x
i
)
)
L(y,F)=\sum_{i=1}^{N} w_{k,i} exp(-y_i \alpha_k f_k(x_i))
L(y,F)=∑i=1Nwk,iexp(−yiαkfk(xi))
第k步需要优化的是基学习器
f
k
f_k
fk,具体的,我们通过优化分类器的权重系数
α
k
\alpha_k
αk来最小化损失函数。
我们先将损失函数写成下面的形式,忽略掉常系数
w
k
,
i
w_{k,i}
wk,i,并对所有样本的损失计算均值:
L
(
y
,
F
)
=
E
x
∼
D
[
e
x
p
(
−
y
i
α
k
f
k
(
x
i
)
)
]
L(y,F)=E_{x\sim D} [exp(-y_i \alpha_k f_k(x_i))]
L(y,F)=Ex∼D[exp(−yiαkfk(xi))]
=
E
x
∼
D
[
e
x
p
(
−
α
k
I
(
y
i
=
f
k
(
x
i
)
)
+
e
x
p
(
α
k
I
(
y
i
≠
f
k
(
x
i
)
)
]
=E_{x\sim D}[exp(-\alpha_k \mathbb{I} (y_i=f_k(x_i)) + exp(\alpha_k \mathbb{I} (y_i \neq f_k(x_i)) ]
=Ex∼D[exp(−αkI(yi=fk(xi))+exp(αkI(yi=fk(xi))]
=
e
x
p
(
−
α
k
)
P
x
∼
D
(
y
i
=
f
k
(
x
i
)
)
+
e
x
p
(
α
k
)
P
x
∼
D
(
y
i
≠
f
k
(
x
i
)
)
=exp(-\alpha_k)P_{x\sim D}(y_i=f_k(x_i)) +exp(\alpha_k)P_{x\sim D}(y_i \neq f_k(x_i))
=exp(−αk)Px∼D(yi=fk(xi))+exp(αk)Px∼D(yi=fk(xi))
其中,
P
x
∼
D
(
y
i
≠
f
k
(
x
i
)
)
P_{x\sim D}(y_i \neq f_k(x_i))
Px∼D(yi=fk(xi))表示错误率,我们将其写为
ϵ
k
\epsilon_k
ϵk,上面的公式可以进一步写成:
L
(
y
,
F
)
=
e
x
p
(
−
α
k
)
∗
(
1
−
ϵ
k
)
+
e
x
p
(
α
k
)
∗
ϵ
k
=
L
(
y
,
α
k
f
k
)
L(y,F)=exp(-\alpha_{k})*(1-\epsilon_{k})+exp(\alpha_{k})*\epsilon_k=L(y,\alpha_kf_k)
L(y,F)=exp(−αk)∗(1−ϵk)+exp(αk)∗ϵk=L(y,αkfk)
于是,理想的基学习器为:
f
k
(
x
)
=
a
i
g
m
i
n
α
k
L
(
y
,
F
)
=
a
i
g
m
i
n
α
k
L
(
y
,
α
k
f
k
)
f_k(x)=aigmin_{\alpha_k}L(y,F)=aigmin_{\alpha_k}L(y,\alpha_kf_k)
fk(x)=aigminαkL(y,F)=aigminαkL(y,αkfk)
然后,我们将损失函数对
α
k
\alpha_k
αk求偏导数:
L
(
y
,
α
k
f
k
)
=
e
x
p
(
−
α
k
)
∗
(
1
−
ϵ
k
)
+
e
x
p
(
α
k
)
∗
ϵ
k
L(y,\alpha_kf_k)=exp(-\alpha_{k})*(1-\epsilon_{k})+exp(\alpha_{k})*\epsilon_k
L(y,αkfk)=exp(−αk)∗(1−ϵk)+exp(αk)∗ϵk
∂
L
(
y
,
α
k
f
k
)
α
k
=
−
e
x
p
(
−
α
k
)
∗
(
1
−
ϵ
k
)
+
e
x
p
(
α
k
)
∗
ϵ
k
=
0
\frac{\partial L(y,\alpha_kf_k)}{\alpha_k}=-exp(-\alpha_{k})*(1-\epsilon_{k})+exp(\alpha_{k})*\epsilon_k=0
αk∂L(y,αkfk)=−exp(−αk)∗(1−ϵk)+exp(αk)∗ϵk=0
e
x
p
(
−
α
k
)
∗
(
1
−
ϵ
k
)
=
e
x
p
(
α
k
)
∗
ϵ
k
exp(-\alpha_{k})*(1-\epsilon_{k})=exp(\alpha_{k})*\epsilon_k
exp(−αk)∗(1−ϵk)=exp(αk)∗ϵk
1
−
ϵ
k
ϵ
k
=
e
x
p
(
α
k
)
e
x
p
(
−
α
k
)
\frac{1-\epsilon_{k}}{\epsilon_k}=\frac{exp(\alpha_{k})}{exp(-\alpha_{k})}
ϵk1−ϵk=exp(−αk)exp(αk)
取对数可得:
l
n
(
1
−
ϵ
k
ϵ
k
)
=
l
n
(
e
x
p
(
α
k
)
e
x
p
(
−
α
k
)
)
=
l
n
(
e
x
p
(
α
k
)
)
−
l
n
(
e
x
p
(
−
α
k
)
)
=
2
α
k
ln(\frac{1-\epsilon_{k}}{\epsilon_k})=ln(\frac{exp(\alpha_k)}{exp(-\alpha_k)})=ln(exp(\alpha_k))-ln(exp(-\alpha_k))=2\alpha_k
ln(ϵk1−ϵk)=ln(exp(−αk)exp(αk))=ln(exp(αk))−ln(exp(−αk))=2αk
即:
α
k
=
1
2
l
n
(
1
−
ϵ
k
ϵ
k
)
\alpha_k=\frac{1}{2} ln(\frac{1-\epsilon_k}{\epsilon_k})
αk=21ln(ϵk1−ϵk)
这样,我们就得到了第k个基学习器的权重
α
k
\alpha_k
αk,也是样本权重更新公式中的
α
k
\alpha_k
αk。
为了避免adaboost出现过拟合现象,可以在学习的过程中引入正则化项,称为步长
μ
\mu
μ,或者学习率。
F
k
=
F
k
−
1
+
μ
α
k
f
k
(
x
)
F_k=F_{k-1}+\mu\alpha_kf_k(x)
Fk=Fk−1+μαkfk(x),
0
<
μ
<
1
0<\mu<1
0<μ<1
若
μ
\mu
μ较小,则需要较多的迭代次数,用步长
μ
\mu
μ和最大迭代次数k来确定拟合效果。
Adaboost优点:
- 精度高。
- 可以利用各种回归/分类基学习器,非常灵活。
- 不易过拟合。
Adaboost 缺点:对异常点敏感,异常点往往会有较高的权重。
GBDT
Gradient Boosting Decision Tree
梯度提升决策树,其核心思想是基于决策树预测的残差进行迭代的学习。是boosting中的一大类算法,泛化能力较强的算法。
GBDT是回归树,所有树的结果累加作为最终结果。回归树在进行节点分裂时,穷举每个特征的每一个阈值,从而找到最好的分割点。
衡量标准:最小化均方误差
模型预测值:
F
k
(
x
)
=
∑
i
=
1
K
α
i
f
i
(
x
)
F_k(x)=\sum_{i=1}^{K} \alpha_i f_i(x)
Fk(x)=∑i=1Kαifi(x),通过残差逼近的思想对训练数据进行拟合。
每次只训练一个基模型:
F
k
(
x
)
=
F
k
−
1
(
x
)
+
α
k
f
k
(
x
)
F_k(x)=F_{k-1}(x)+ \alpha_k f_k(x)
Fk(x)=Fk−1(x)+αkfk(x)
Gradient体现在哪里呢?残差是最小均方损失函数关于预测值的反向梯度,即:
−
∂
(
1
2
(
y
−
F
k
(
x
)
)
2
)
∂
F
k
(
x
)
=
y
−
F
k
(
x
)
-\frac{\partial(\frac{1}{2}(y-F_k(x))^2)}{\partial F_k(x)}=y-F_k(x)
−∂Fk(x)∂(21(y−Fk(x))2)=y−Fk(x)
上面等式的左边是损失函数的负梯度信息,右边则表示残差,该残差是基于当前预测值得到的。
由于GBDT是boosting算法中的一种,同其他boosting算法一样,GBDT容易对异常点敏感,从减小异常点的损失函数大小的角度出发,我们可以使用绝对损失或者Huber损失代替均方损失。
在GBDT中,分错样本会带来较大的损失信息,即较大的损失函数负梯度信息,所以,GBDT的每一步残差计算会变相增大被分错样本的权重,而对正确样本的权重趋于0,这也是为什么GBDT属于boosting算法的原因之一。
GBDT的优点:
- 自动进行特征组合,拟合非线性数据。
- 可以灵活处理各种类型的数据。
GBDT的缺点:对异常点敏感。
GBDT与Adaboost的对比:
- 相同点:
(1)都是boosting家族的算法,基分类器都是选用弱分类器。
(2)都是前向分步算法,或者说可以使用前向分步算法解释。 - 不同点:
(1)迭代思想不同,
adaboost在每一轮迭代过程中,直接提升错分样本的权重,
GBDT则是基于损失函数的负梯度信息进行迭代训练和优化,每一步优化的损失函数的负梯度信息,基于残差进行计算,实际上每一轮优化基于残差进行优化时,变相的增大了错分样本的权重。
(2)损失函数不同,
标准adaboost适用于二分类问题,基于指数损失函数进行优化,
GBDT是基于残差进行优化的,残差的计算是基于均方损失函数进行的,为了减小异常点对模型的影响,可以使用绝对损失或者Huber损失代替均方损失,多分类问题中,可以使用交叉熵损失函数。