集成学习
本文是笔者西瓜书第八章的学习笔记,如有谬误,请随时指出。
Bagging
在集成学习中,如果我们希望得到泛化性能较强的集成,那么应该尽可能的保证基学习器之间“好而不同”。因此可以使用自助采样法采样,使得每个基学习器有差异(满足“不同”),同时又能保证每个基学习器不会太差(满足“好”)。
自助采样法具体来说就是,给定包含 m m m个样本的数据集,我们从中进行 m m m次有放回的采样,得到一个含有 m m m个样本的数据集。
Bagging具体来说就是,采样出 T T T个包含 m m m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器结合起来。
结合策略
- 平均法:主要用于数值型输出;
h
i
(
x
)
∈
R
h_i(x)\in\mathbb{R}
hi(x)∈R,代表第
i
i
i个基学习器的输出
- 简单平均法:基学习器性能差异较小时使用
H ( x ) = 1 T ∑ i = 1 T h i ( x ) H(x)=\frac{1}{T}\sum_{i=1}^T h_i(x) H(x)=T1i=1∑Thi(x)
其中 H ( x ) H(x) H(x)代表最终的输出。 - 加权平均法:基学习器性能差异较大时使用
H ( x ) = ∑ i = 1 T w i h i ( x ) , s.t. w i ≥ 0 , ∑ i = 1 T w i = 1 H(x)=\sum_{i=1}^Tw_ih_i(x), \quad \text{s.t.} \quad w_i\geq0, \sum_{i=1}^Tw_i=1 H(x)=i=1∑Twihi(x),s.t.wi≥0,i=1∑Twi=1
需要注意权重 w i w_i wi一般是从训练数据中学习得到的,但是现实任务中训练样本不充分或存在噪声,权重很有可能不可靠;当基学习器较多的时候,很容易过拟合。
- 简单平均法:基学习器性能差异较小时使用
- 投票法:主要用于类别型输出;
h
i
(
x
)
=
(
h
i
1
(
x
)
,
…
,
h
i
N
(
x
)
)
h_i(x) = (h_i^1(x), \ldots, h_i^N(x))
hi(x)=(hi1(x),…,hiN(x)),其中
h
i
j
(
x
)
h_i^j(x)
hij(x)代表第
i
i
i个基学习器再类别
c
j
c_j
cj上的输出,这里的输出既可以是类标记(即
h
i
j
(
x
)
∈
{
0
,
1
}
h_i^j(x)\in\{0, 1\}
hij(x)∈{0,1},也称“硬投票”),也可以是类概率(即
h
i
j
∈
[
0
,
1
]
h_i^j\in[0, 1]
hij∈[0,1],相当于
P
(
c
j
∣
x
)
P(c_j|x)
P(cj∣x),也称“软投票”)。
- 绝对多数投票法:
H ( x ) = { c j , if ∑ i = 1 T h i j ( x ) > 0.5 ∑ k = 1 N ∑ i = 1 T h i k ( x ) reject , otherwise H(x) = \left\{ \begin{aligned} &c_j, \quad &\text{if} \sum_{i=1}^Th_i^j(x)>0.5\sum_{k=1}^N\sum_{i=1}^Th_i^k(x)\\ &\text{reject}, \quad &\text{otherwise} \end{aligned} \right. H(x)=⎩ ⎨ ⎧cj,reject,ifi=1∑Thij(x)>0.5k=1∑Ni=1∑Thik(x)otherwise
即若某标记得票超过半数,则预测为该标记;否则拒绝预测 - 相对多数投票法:
H ( x ) = c arg max j ∑ i = 1 T h i j ( x ) H(x)=c_{\underset{j}{\arg\max}\sum_{i=1}^Th_i^j(x)} H(x)=cjargmax∑i=1Thij(x)
即预测为得票最多的标记,若多个标记获得最高票,则从中随机选取 - 加权投票法:
H ( x ) = c arg max j ∑ i = 1 T w i h i j ( x ) , s.t. w i ≥ 0 , ∑ i = 1 T w i = 1 H(x)=c_{\underset{j}{\arg\max}\sum_{i=1}^Tw_ih_i^j(x)}, \quad \text{s.t.} \quad w_i\geq0, \sum_{i=1}^Tw_i=1 H(x)=cjargmax∑i=1Twihij(x),s.t.wi≥0,i=1∑Twi=1
- 绝对多数投票法:
- 学习法:Stacking,利用另一个学习器来结合。我们把基学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器(meta-learner)。即,把初级学习器的输出当作次级学习器的输入,把初始样本的标记当作样例标记。(加权平均法类似于次级学习器为线性模型的学习法)
具体来说,次级训练集是初级学习器产生的,如果直接用初级学习器的训练集来训练次级学习器,那么过拟合的风险会比较大。一般采用 k k k折交叉验证的方法,把 k − 1 k-1 k−1个子集当作初级学习器的训练集,利用剩余的一个子集来产生次级训练集,重复 k k k次即可得到含有 m m m个样本的次级训练集。
当初级学习器的输出为类概率时,次级学习器选择多响应线性回归(Multi-response Linear Regression,简称MLR)效果较好。MLR简而言之就是,对每个类分别做线性回归,将输出最大的类当作最终的输出。
随机森林
随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前结点的集合属性中选择一个最优属性;而在随机森林中,是在当前结点的属性集合中随机 k k k个属性,在从这 k k k个属性中,选择一个用于划分。
在sklearn中的参数如下,注意这里没有给结合方式的参数选择,对于分类问题采用简单投票法,对于回归问题采用简单平均法
sklearn.ensemble.RandomForestClassifier(
n_estimators=10, criterion='gini',
max_depth=None,min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features='auto', max_leaf_nodes=None,
min_impurity_split=1e-07,bootstrap=True,
oob_score=False, n_jobs=1,
random_state=None, verbose=0,
warm_start=False, class_weight=None)
解释一部分重要参数:
max_features
:代表从当前属性集合中随机选取属性的个数。"auto"
代表选择 N \sqrt{N} N个属性;"log2"
代表选择 log 2 N \log_2N log2N个特征;如果是整数,代表选择特征个数的绝对值;如果是浮点数,代表选择特征个数的百分比。n_estimators
:代表基学习器的个数。criterion
:代表决策树属性划分的指标。分别可以选择'gini'
和'entropy'
,其中前者是默认值。max_depth
:代表决策树最大深度。可以不输入,代表不限制决策树的深度。min_impurity_split
:代表信息增益小于设定阈值的分枝不会发生。min_samples_split
:代表当结点中样本个数小于这个值,将不会再划分子树。min_samples_leaf
:代表当结点中样本个数小于这个值,那么这个结点会被剪枝。
Boosting
Boosting的工作机制一般为:从初始训练集中训练出一个基学习器,然后根据基学习器的表现对训练集样本进行调整,使得先前基学习器做错的样本获得更多的关注,然后基于调整后的样本来训练下一个基学习器,如此反复训练 T T T个基学习器,最终结合起来。
从提升树(BDT)到梯度提升树(GBDT)
提升树(BDT)
提升树是以决策树(分类树或者回归树)为基学习器的提升方法,提升树模型可以表示为加法模型:
H
T
(
x
)
=
∑
i
=
1
T
h
i
(
x
)
H_T(x) = \sum_{i=1}^T h_i(x)
HT(x)=i=1∑Thi(x)
给定一个回归问题的训练数据集
D
=
{
(
x
1
,
y
1
)
,
…
,
(
x
m
,
y
m
)
}
D = \{(x_1, y_1), \ldots, (x_m, y_m)\}
D={(x1,y1),…,(xm,ym)},其中
x
i
∈
R
n
,
y
i
∈
R
x_i\in\mathbb{R}^n, y_i\in\mathbb{R}
xi∈Rn,yi∈R,提升树的训练过程为:
- 初始化 h 0 ( x ) = 0 h_0(x) = 0 h0(x)=0
- 对于
i
=
1
,
…
,
T
i=1,\ldots, T
i=1,…,T:
- 计算残差: r i j = y j − H i − 1 ( x j ) , j = 1 , … , m r_{ij} = y_j-H_{i-1}(x_j), \quad j=1,\ldots,m rij=yj−Hi−1(xj),j=1,…,m
- 用数据 { ( x j , r i j ) } j = 1 m \{(x_j, r_{ij})\}_{j=1}^m {(xj,rij)}j=1m训练下一个决策树,得到 h i ( x ) h_i(x) hi(x)
- 更新 H i ( x ) = H i − 1 ( x ) + h i ( x ) H_i(x) = H_{i-1}(x)+h_i(x) Hi(x)=Hi−1(x)+hi(x)
- 得到回归问题的提升树
H T ( x ) = ∑ i = 1 T h i ( x ) H_T(x) = \sum_{i=1}^T h_i(x) HT(x)=i=1∑Thi(x)
我们可以发现提升树中的残差,实际上是当损失函数为平方误差损失函数时的负梯度方向,因此我们可以稍作扩展,使损失函数不局限于均方误差损失函数,于是就得到了梯度提升树。
梯度提升树(GBDT)
给定一个回归问题的训练数据集 D = { ( x 1 , y 1 ) , … , ( x m , y m ) } D = \{(x_1, y_1), \ldots, (x_m, y_m)\} D={(x1,y1),…,(xm,ym)},其中 x i ∈ R n , y i ∈ R x_i\in\mathbb{R}^n, y_i\in\mathbb{R} xi∈Rn,yi∈R;损失函数为 L ( y , y ^ ) L(y, \hat{y}) L(y,y^)。梯度提升树的训练过程为:
- 初始化 h 0 ( x ) = arg min c ∑ i = 1 m L ( y i , c ) h_0(x) = \underset{c}{\arg\min}\sum_{i=1}^mL(y_i, c) h0(x)=cargmin∑i=1mL(yi,c)
- 对于
i
=
1
,
…
,
T
i=1,\ldots, T
i=1,…,T:
- 计算负梯度,即残差:
r i j = − ∂ L ( y j , H i − 1 ( x j ) ) ∂ H i − 1 ( x j ) , j = 1 , … , m r_{ij} = -\frac{\partial L(y_j, H_{i-1}(x_j))}{\partial H_{i-1}(x_j)}, \quad j=1,\ldots,m rij=−∂Hi−1(xj)∂L(yj,Hi−1(xj)),j=1,…,m - 用数据 { ( x j , r i j ) } j = 1 m \{(x_j, r_{ij})\}_{j=1}^m {(xj,rij)}j=1m训练下一个决策树,得到 h i ( x ) h_i(x) hi(x)
- 更新 H i ( x ) = H i − 1 ( x ) + h i ( x ) H_i(x) = H_{i-1}(x)+h_i(x) Hi(x)=Hi−1(x)+hi(x)
- 计算负梯度,即残差:
- 得到回归问题的提升树
H T ( x ) = ∑ i = 1 T h i ( x ) H_T(x) = \sum_{i=1}^T h_i(x) HT(x)=i=1∑Thi(x)
GBDT在sklearn中的参数如下:
sklearn.ensemble.GradientBoostingClassifier(*, loss='deviance', learning_rate=0.1,
n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None,
random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False,
presort='deprecated', validation_fraction=0.1, n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)
解释一部分重要参数(部分参数与随机森林中参数一致):
n_estimators
:基学习器的最大迭代次数,或基学习器的最大个数。调参过程中应该和learning_rate
一起考虑。learning_rate
:默认值为0.1。loss
:损失函数的选取。对于分类问题有:'deviance'
代表对数似然损失函数;'exponential'
代表指数损失函数。对于回归问题有:'ls'
代表均方误差损失;'lad'
代表绝对损失;'huber'
代表Huber损失;'quantile'
代表Quantile损失。'alpha'
:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
Huber损失即:
L
α
(
y
,
f
(
x
)
)
=
{
1
2
(
y
−
f
(
x
)
)
2
,
if
∣
y
−
f
(
x
)
∣
≤
α
α
∣
y
−
f
(
x
)
∣
−
1
2
α
,
if
∣
y
−
f
(
x
)
∣
>
α
L_\alpha(y, f(x)) = \left\{ \begin{aligned} & \frac{1}{2}(y-f(x))^2, & \text{if} \quad|y-f(x)|\leq \alpha \\ & \alpha|y-f(x)|-\frac{1}{2}\alpha, & \text{if} \quad|y-f(x)|>\alpha \end{aligned} \right.
Lα(y,f(x))=⎩
⎨
⎧21(y−f(x))2,α∣y−f(x)∣−21α,if∣y−f(x)∣≤αif∣y−f(x)∣>α
其中
y
y
y为真实值,
f
(
x
)
f(x)
f(x)为预测值,
α
\alpha
α是参数。当预测偏差小于
α
\alpha
α时采用平方误差;当预测偏差大于
α
\alpha
α时采用线性误差。Huber损失函数降低了对异常点的惩罚力度,是一种鲁棒回归的损失函数。
Quantile损失即:
L
α
(
y
,
f
(
x
)
)
=
{
α
(
y
−
f
(
x
)
)
,
if
y
>
f
(
x
)
(
1
−
α
)
(
f
(
x
)
−
y
)
,
if
y
≤
f
(
x
)
L_\alpha(y, f(x)) = \left\{ \begin{aligned} & \alpha(y-f(x)), & \text{if} \quad y>f(x)\\ & (1-\alpha)(f(x)-y), & \text{if} \quad y\leq f(x) \end{aligned} \right.
Lα(y,f(x))={α(y−f(x)),(1−α)(f(x)−y),ify>f(x)ify≤f(x)
可以看出Quantile损失,对大于真实值和小于真实值的区域的关注程度不同。在实际应用中,同一个样本
x
x
x可能有多种取值
y
1
,
y
2
,
…
,
y
d
y_1, y_2, \ldots, y_d
y1,y2,…,yd,如果使用平方误差或者绝对值误差,那么为了使损失最小,我们始终关注的是
y
1
,
…
,
y
d
y_1, \ldots, y_d
y1,…,yd的中位数的取值,因为只有当
x
x
x预测为他们之间的中位数,才能损失最小化。然而Quantile损失可以通过调整
α
\alpha
α的取值,从而使学习器关注到中位数上方或者下方的取值,并将其输出。
从零推导AdaBoost
给定训练集
D
=
{
(
x
i
,
y
i
)
}
i
=
1
m
D = \{(x_i, y_i)\}_{i=1}^m
D={(xi,yi)}i=1m,其中
y
i
∈
{
+
1
,
−
1
}
y_i\in\{+1, -1\}
yi∈{+1,−1}。令
f
(
x
i
)
=
y
i
f(x_i) = y_i
f(xi)=yi,即
f
f
f为真实函数。AdaBoost的(加性)模型为:
H
T
(
x
)
=
∑
t
=
1
T
α
t
h
t
(
x
)
H_T(x) = \sum_{t=1}^T \alpha_th_t(x)
HT(x)=t=1∑Tαtht(x)
损失函数定义为指数损失,即:
l
exp
(
H
∣
D
)
=
E
x
∼
D
[
e
−
f
(
x
)
H
(
x
)
]
l_{\text{exp}}(H|\mathcal{D}) = \mathbb{E}_{x\sim\mathcal{D}}[e^{-f(x)H(x)}]
lexp(H∣D)=Ex∼D[e−f(x)H(x)]
其中
D
\mathcal{D}
D代表初始的样本权值分布(也就是
D
1
\mathcal{D}_1
D1)。
基本的任务描述完了,现在我们明确一下我们的目标:学得 T T T个 h t ( x ) h_t(x) ht(x)和对应的 α t \alpha_t αt,从而得到 H T ( x ) H_T(x) HT(x),使得 l exp ( H ∣ D ) l_{\text{exp}}(H|\mathcal{D}) lexp(H∣D)最小。显然,如果我们想要同时学得 T T T个 h t ( x ) h_t(x) ht(x)和相应的 T T T个 α t \alpha_t αt相当困难,因此我们可以用前向分步算法一步一步来求。
具体来说,集成分类器可以写成
H
t
(
x
)
=
H
t
−
1
(
x
)
+
α
t
h
t
(
x
)
,
H
0
(
x
)
=
0
H_t(x) = H_{t-1}(x)+\alpha_th_t(x), \quad H_0(x) = 0
Ht(x)=Ht−1(x)+αtht(x),H0(x)=0
方便起见,下面将
h
t
(
x
)
h_t(x)
ht(x)简记为
h
t
h_t
ht,将
H
t
(
x
)
H_t(x)
Ht(x)简记为
H
t
H_t
Ht,因此每一步我们只需要求解如下优化问题:
(
α
t
,
h
t
)
=
arg
min
α
,
h
l
exp
(
H
t
−
1
+
α
h
∣
D
)
(\alpha_t, h_t) = \underset{\alpha, h}{\arg\min} l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D})
(αt,ht)=α,hargminlexp(Ht−1+αh∣D)
尝试化简
l
exp
(
H
t
−
1
+
α
h
∣
D
)
l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D})
lexp(Ht−1+αh∣D):
l
exp
(
H
t
−
1
+
α
h
∣
D
)
=
E
x
∼
D
[
e
−
f
(
x
)
(
H
t
−
1
(
x
)
+
α
h
(
x
)
)
]
=
∑
i
=
1
∣
D
∣
D
(
x
i
)
e
−
f
(
x
i
)
(
H
t
−
1
(
x
i
)
+
α
h
(
x
i
)
)
=
∑
i
=
1
∣
D
∣
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
1
(
x
i
)
e
−
f
(
x
i
)
α
h
(
x
i
)
\begin{aligned} l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D}) &= \mathbb{E}_{x\sim\mathcal{D}}[e^{-f(x)(H_{t-1}(x)+\alpha h(x))}]\\ &= \sum_{i=1}^{|D|}\mathcal{D}(x_i)e^{-f(x_i)(H_{t-1}(x_i)+\alpha h(x_i))}\\ &= \sum_{i=1}^{|D|}\mathcal{D}(x_i)e^{-f(x_i)H_{t-1}(x_i)}e^{-f(x_i)\alpha h(x_i)}\\ \end{aligned}
lexp(Ht−1+αh∣D)=Ex∼D[e−f(x)(Ht−1(x)+αh(x))]=i=1∑∣D∣D(xi)e−f(xi)(Ht−1(xi)+αh(xi))=i=1∑∣D∣D(xi)e−f(xi)Ht−1(xi)e−f(xi)αh(xi)
值得注意的是,由于
f
(
x
i
)
f(x_i)
f(xi)和
h
(
x
i
)
h(x_i)
h(xi)只能取
+
1
,
−
1
+1, -1
+1,−1两个值,所以二者相等时,
f
(
x
i
)
h
(
x
i
)
=
1
f(x_i)h(x_i)=1
f(xi)h(xi)=1;二者不相等时,
f
(
x
i
)
h
(
x
i
)
=
−
1
f(x_i)h(x_i)=-1
f(xi)h(xi)=−1,所以有:
e
−
f
(
x
i
)
α
h
(
x
i
)
=
e
−
α
I
(
f
(
x
i
)
=
h
(
x
i
)
)
+
e
α
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
e^{-f(x_i)\alpha h(x_i)} = e^{-\alpha}\mathbb{I}(f(x_i)=h(x_i))+e^\alpha\mathbb{I}(f(x_i)\neq h(x_i))
e−f(xi)αh(xi)=e−αI(f(xi)=h(xi))+eαI(f(xi)=h(xi))
其中
I
(
⋅
)
\mathbb{I}(\cdot)
I(⋅)为指示函数。同时需要注意的是,
f
(
x
i
)
f(x_i)
f(xi)和
h
(
x
i
)
h(x_i)
h(xi)二者要么相等,要么不相等,所以有:
I
(
f
(
x
i
)
=
h
(
x
i
)
)
+
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
1
\mathbb{I}(f(x_i)=h(x_i))+\mathbb{I}(f(x_i)\neq h(x_i)) = 1
I(f(xi)=h(xi))+I(f(xi)=h(xi))=1
结合上述两个式子有:
e
−
α
I
(
f
(
x
i
)
=
h
(
x
i
)
)
+
e
α
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
e
−
α
I
(
f
(
x
i
)
=
h
(
x
i
)
)
+
e
α
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
+
e
−
α
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
−
e
−
α
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
e
−
α
(
I
(
f
(
x
i
)
=
h
(
x
i
)
)
+
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
)
+
(
e
α
−
e
−
α
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
e
−
α
+
(
e
α
−
e
−
α
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
\begin{aligned} &e^{-\alpha}\mathbb{I}(f(x_i)=h(x_i))+e^\alpha\mathbb{I}(f(x_i)\neq h(x_i))\\ =&e^{-\alpha}\mathbb{I}(f(x_i)=h(x_i))+e^\alpha\mathbb{I}(f(x_i)\neq h(x_i))+e^{-\alpha}\mathbb{I}(f(x_i)\neq h(x_i))-e^{-\alpha}\mathbb{I}(f(x_i)\neq h(x_i))\\ =&e^{-\alpha}(\mathbb{I}(f(x_i)=h(x_i))+\mathbb{I}(f(x_i)\neq h(x_i)))+(e^\alpha-e^{-\alpha})\mathbb{I}(f(x_i)\neq h(x_i))\\ =&e^{-\alpha}+(e^\alpha-e^{-\alpha})\mathbb{I}(f(x_i)\neq h(x_i)) \end{aligned}
===e−αI(f(xi)=h(xi))+eαI(f(xi)=h(xi))e−αI(f(xi)=h(xi))+eαI(f(xi)=h(xi))+e−αI(f(xi)=h(xi))−e−αI(f(xi)=h(xi))e−α(I(f(xi)=h(xi))+I(f(xi)=h(xi)))+(eα−e−α)I(f(xi)=h(xi))e−α+(eα−e−α)I(f(xi)=h(xi))
将上式回代到
l
exp
(
H
t
−
1
+
α
h
∣
D
)
l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D})
lexp(Ht−1+αh∣D)中可得:
l
exp
(
H
t
−
1
+
α
h
∣
D
)
=
∑
i
=
1
∣
D
∣
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
1
(
x
i
)
(
e
−
α
+
(
e
α
−
e
−
α
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
)
=
∑
i
=
1
∣
D
∣
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
1
(
x
i
)
e
−
α
+
∑
i
=
1
∣
D
∣
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
1
(
x
i
)
(
e
α
−
e
−
α
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
\begin{aligned} & l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D})\\ = &\sum_{i=1}^{|D|}\mathcal{D}(x_i)e^{-f(x_i)H_{t-1}(x_i)}(e^{-\alpha}+(e^\alpha-e^{-\alpha})\mathbb{I}(f(x_i)\neq h(x_i)))\\ = &\sum_{i=1}^{|D|}\mathcal{D}(x_i)e^{-f(x_i)H_{t-1}(x_i)}e^{-\alpha}+\sum_{i=1}^{|D|}\mathcal{D}(x_i)e^{-f(x_i)H_{t-1}(x_i)}(e^\alpha-e^{-\alpha})\mathbb{I}(f(x_i)\neq h(x_i))\\ \end{aligned}
==lexp(Ht−1+αh∣D)i=1∑∣D∣D(xi)e−f(xi)Ht−1(xi)(e−α+(eα−e−α)I(f(xi)=h(xi)))i=1∑∣D∣D(xi)e−f(xi)Ht−1(xi)e−α+i=1∑∣D∣D(xi)e−f(xi)Ht−1(xi)(eα−e−α)I(f(xi)=h(xi))
令
D
t
′
(
x
i
)
=
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
1
(
x
i
)
\mathcal{D}_t'(x_i)=\mathcal{D}(x_i)e^{-f(x_i)H_{t-1}(x_i)}
Dt′(xi)=D(xi)e−f(xi)Ht−1(xi),有:
l
exp
(
H
t
−
1
+
α
h
∣
D
)
=
e
−
α
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
+
(
e
α
−
e
−
α
)
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D})=e^{-\alpha}\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)+(e^\alpha-e^{-\alpha})\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i))
lexp(Ht−1+αh∣D)=e−αi=1∑∣D∣Dt′(xi)+(eα−e−α)i=1∑∣D∣Dt′(xi)I(f(xi)=h(xi))
去除
h
h
h的无关项,进而有:
h
t
=
arg
min
h
l
exp
(
H
t
−
1
+
α
h
∣
D
)
=
arg
min
h
e
−
α
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
+
(
e
α
−
e
−
α
)
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
arg
min
h
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
\begin{aligned} h_t &= \underset{h}{\arg\min}l_{\text{exp}}(H_{t-1}+\alpha h|\mathcal{D})\\ &= \underset{h}{\arg\min}e^{-\alpha}\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)+(e^\alpha-e^{-\alpha})\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i))\\ &= \underset{h}{\arg\min}\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i)) \end{aligned}
ht=hargminlexp(Ht−1+αh∣D)=hargmine−αi=1∑∣D∣Dt′(xi)+(eα−e−α)i=1∑∣D∣Dt′(xi)I(f(xi)=h(xi))=hargmini=1∑∣D∣Dt′(xi)I(f(xi)=h(xi))
为了使
D
t
′
(
x
i
)
\mathcal{D}_t'(x_i)
Dt′(xi)为一个合法的分布,令
D
t
(
x
i
)
=
D
t
′
(
x
i
)
/
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
\mathcal{D}_t(x_i) = \mathcal{D}_t'(x_i)/\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)
Dt(xi)=Dt′(xi)/∑i=1∣D∣Dt′(xi),进而有
h
t
=
arg
min
h
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
arg
min
h
∑
i
=
1
∣
D
∣
D
t
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
arg
min
h
E
x
∼
D
t
[
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
]
\begin{aligned} h_t &= \underset{h}{\arg\min} \sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i))\\ &= \underset{h}{\arg\min} \sum_{i=1}^{|D|}\mathcal{D}_t(x_i)\mathbb{I}(f(x_i)\neq h(x_i))\\ &= \underset{h}{\arg\min} \mathbb{E}_{x\sim\mathcal{D_t}}[\mathbb{I}(f(x_i)\neq h(x_i))] \end{aligned}
ht=hargmini=1∑∣D∣Dt′(xi)I(f(xi)=h(xi))=hargmini=1∑∣D∣Dt(xi)I(f(xi)=h(xi))=hargminEx∼Dt[I(f(xi)=h(xi))]
可以看出,最优的
h
t
h_t
ht实际上就是在权重分布为
D
t
\mathcal{D}_t
Dt的数据集上,分类误差最小的
h
h
h。因此我们只需要在第
t
t
t次迭代的时,调整权重分布为
D
t
\mathcal{D}_t
Dt即可。为了方便迭代,我们可以求出
D
t
′
\mathcal{D}_t'
Dt′的递推公式(每次求出
D
t
′
\mathcal{D}_t'
Dt′之后,经过标准化就可以得到
D
\mathcal{D}
D):
D
t
′
=
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
1
(
x
i
)
=
D
(
x
i
)
e
−
f
(
x
i
)
H
t
−
2
(
x
i
)
−
f
(
x
i
)
α
t
−
1
h
t
−
1
(
x
i
)
=
D
t
−
1
′
(
x
i
)
e
−
f
(
x
i
)
α
t
−
1
h
t
−
1
(
x
i
)
\begin{aligned} \mathcal{D}_t' &= \mathcal{D}(x_i)e^{-f(x_i)H_{t-1}(x_i)}\\ &= \mathcal{D}(x_i)e^{-f(x_i)H_{t-2}(x_i)-f(x_i)\alpha_{t-1}h_{t-1}(x_i)}\\ &= \mathcal{D}_{t-1}'(x_i)e^{-f(x_i)\alpha_{t-1}h_{t-1}(x_i)} \end{aligned}
Dt′=D(xi)e−f(xi)Ht−1(xi)=D(xi)e−f(xi)Ht−2(xi)−f(xi)αt−1ht−1(xi)=Dt−1′(xi)e−f(xi)αt−1ht−1(xi)
现在来求
α
t
\alpha_t
αt的表达式,首先对
l
exp
(
H
t
−
1
+
α
h
t
∣
D
)
l_{\text{exp}}(H_{t-1}+\alpha h_t|\mathcal{D})
lexp(Ht−1+αht∣D)求偏导,可得:
∂
l
exp
(
H
t
−
1
+
α
h
t
∣
D
)
∂
α
=
∂
e
−
α
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
+
(
e
α
−
e
−
α
)
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
∂
α
=
−
e
−
α
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
+
(
e
α
+
e
−
α
)
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
\begin{aligned} \frac{\partial l_{\text{exp}(H_{t-1}+\alpha h_t|\mathcal{D})}}{\partial \alpha} =&\frac{\partial e^{-\alpha}\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)+(e^\alpha-e^{-\alpha})\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i)) }{\partial \alpha}\\ =& -e^{-\alpha}\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)+(e^\alpha+e^{-\alpha})\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i)) \end{aligned}
∂α∂lexp(Ht−1+αht∣D)==∂α∂e−α∑i=1∣D∣Dt′(xi)+(eα−e−α)∑i=1∣D∣Dt′(xi)I(f(xi)=h(xi))−e−αi=1∑∣D∣Dt′(xi)+(eα+e−α)i=1∑∣D∣Dt′(xi)I(f(xi)=h(xi))
令偏导数为零可得:
e
−
α
e
α
+
e
−
α
=
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
∑
i
=
1
∣
D
∣
D
t
′
(
x
i
)
=
∑
i
=
1
∣
D
∣
D
t
(
x
i
)
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
=
E
x
∼
D
t
[
I
(
f
(
x
i
)
≠
h
(
x
i
)
)
]
=
ϵ
t
\begin{aligned} \frac{e^{-\alpha}}{e^\alpha+e^{-\alpha}} &= \frac{\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)\mathbb{I}(f(x_i)\neq h(x_i))}{\sum_{i=1}^{|D|}\mathcal{D}_t'(x_i)}\\ &= \sum_{i=1}^{|D|} \mathcal{D}_t(x_i)\mathbb{I}(f(x_i)\neq h(x_i))\\ &= \mathbb{E}_{x\sim\mathcal{D}_t}[\mathbb{I}(f(x_i)\neq h(x_i))]\\ &= \epsilon_t \end{aligned}
eα+e−αe−α=∑i=1∣D∣Dt′(xi)∑i=1∣D∣Dt′(xi)I(f(xi)=h(xi))=i=1∑∣D∣Dt(xi)I(f(xi)=h(xi))=Ex∼Dt[I(f(xi)=h(xi))]=ϵt
化简后可得:
α
t
=
1
2
ln
(
1
−
ϵ
t
ϵ
t
)
\alpha_t = \frac{1}{2}\ln\left(\frac{1-\epsilon_t}{\epsilon_t}\right)
αt=21ln(ϵt1−ϵt)
于是可以给出AdaBoost的训练流程:
- 初始化权重分布: D 1 ( x ) = 1 / m \mathcal{D}_1(x) = 1/m D1(x)=1/m
- 对
t
=
1
,
…
,
T
t=1,\ldots, T
t=1,…,T:
- 在权重分布为 D t \mathcal{D}_t Dt的数据集 D D D上训练,得到 h t h_t ht。
- 计算误差: ϵ t = E x ∼ D t [ I ( f ( x ) ≠ h ( x ) ) ] \epsilon_t=\mathbb{E}_{x\sim \mathcal{D}_t}[\mathbb{I}(f(x)\neq h(x))] ϵt=Ex∼Dt[I(f(x)=h(x))]
- 如果 ϵ t > 0.5 \epsilon_t>0.5 ϵt>0.5,说明训练器失效,舍弃
- 计算: α t = 1 2 ln ( 1 − ϵ t ϵ t ) \alpha_t=\frac{1}{2}\ln\left(\frac{1-\epsilon_t}{\epsilon_t}\right) αt=21ln(ϵt1−ϵt)
- 更新权重分布: D t + 1 ( x ) = D t ( x ) ( − α t f ( x ) h t ( x ) ) Z t \mathcal{D}_{t+1}(x) = \frac{\mathcal{D}_t(x)(-\alpha_t f(x)h_t(x))}{Z_t} Dt+1(x)=ZtDt(x)(−αtf(x)ht(x))
- 输出: F ( x ) = sign ( ∑ t = 1 T α t h t ( x ) ) F(x) = \text{sign}\left(\sum_{t=1}^T\alpha_t h_t(x)\right) F(x)=sign(∑t=1Tαtht(x))
AdaBoost在sklearn中的参数如下
sklearn.ensemble.AdaBoostClassifier(estimator=None, *, n_estimators=50,
learning_rate=1.0, algorithm='SAMME.R', random_state=None)
解释一部分重要参数(模型参数取决于基学习器的选择,这里只解释公共参数):
estimator
:输入字符串或者None
。如果为None
,则分类器默认为决策树桩。learning_rate
:浮点数,默认为 1 1 1。代表每个弱学习器的权重缩减系数。n_estimators
:整数,默认为 50 50 50。代表弱学习器的最大迭代次数。
实验部分
数据集介绍
数据集使用威斯康辛州乳腺癌数据集(Wisconsin Diagnostic Breast Cancer (WDBC):诊断版本,发布于1996年,包含了569个样本,每个样本有1个id,1个类别标签和30个特征。类别标签是M或B,分别表示恶性或良性。数据集没有缺失值。
实验过程
我们分别调整随机森林、AdaBoost和GBDT的模型超参数,来观察超参数变化对模型的准确率有什么影响;然后从每个模型中选择最优的超参数设置,比较这三种集成模型的性能。
具体调整超参数的方式如下:
- 随机森林:
n_estimators
:我们依次调整基学习器个数为20至500,每隔20取一次值。max_depth
:我们依次调整决策树的最大深度为 2 至 9,每隔 1 取一次值。
- AdaBoost:
n_estimators
:我们依次调整基学习器个数为20至500,每隔20取一次值。learning_rate
:我们依次调整学习率为0.001至0.01,每隔0.001取一次值。
- GBDT:
n_estimators
:我们依次调整基学习器个数为20至500,每隔20取一次值。max_depth
:我们依次调整决策树的最大深度为 2 至 9,每隔 1 取一次值。
实验结果![左图为随机森林,中间为AdaBoost,右边为GBDT](https://i-blog.csdnimg.cn/blog_migrate/e78eef59176f37d0287457f3cb941232.jpeg#pic_center)
实验结果如图所示,对于随机森林模型和AdaBoost模型,我们发现随着最大深度的增加和基处理器数量的增加,模型的准确率总体上呈增长趋势,其中AdaBoost模型表现的尤为明显。这是由于AdaBoost主要降低的是模型的偏差,随着基学习器的增加,模型的拟合能力会增强;随机森林则是通过降低方差,随着基学习器增加,模型受样本扰动影响降低。
对于GBDT模型,我们可以明显的看出,当最大深度增加后,模型的准确率反而降低,我们猜测这是由于过拟合导致的,当最大深度为4时,模型的准确率基本维持在较高水平。
其中随机森林模型超参数取最优值时,准确率为98.24%;AdaBoost模型的超参数取最优值时,准确率为97.07%;GBDT模型的超参数取最优值时,准确率为97.66%。