ML算法推导细节06—自适应提升AdaBoost

探究算法细节,深入了解算法原理

自适应提升算法AdaBoost

  • 1. Boosting算法原理
    • 1.1 Boosting原理
    • 1.2 Boosting方法的4个问题
  • 2. AdaBoost二分类问题算法流程*
  • 3. AdaBoost多分类问题
  • 4. AdaBoost回归问题算法流程
  • 5. AdaBoost分类问题的损失函数优化
    • 5.1 AdaBoost算法名称由来
    • 5.2 损失函数的定义
    • 5.3 损失函数的优化
  • 6. AdaBoost算法的正则化
  • 7. AdaBoost 总结
    • 7.1 二分类流程
    • 7.2 AdaBoost的优缺点
  • 8. sklearn.ensemble.AdaBoost
    • 8.1 AdaBoostClassifier和AdaBoostRegressor参数
    • 8.2 弱学习器参数

1. Boosting算法原理

ML算法推导细节06—自适应提升AdaBoost_第1张图片

1.1 Boosting原理

  • 首先从训练集用初始权重训练出一个弱学习器1
  • 根据弱学习器1的学习误差率来更新训练样本的权重,使得错误分类的样本权重增加(下一轮更受关注),正确分类的样本权重减小。
  • 基于调整权重后的训练集来训练弱学习器2
  • 重复进行,直到弱学习器个数达到指定数T,将T个弱学习器通过结合策略得到最终的强学习器。

1.2 Boosting方法的4个问题

1)如何计算学习误差率e?

2)如何得到弱学习器权重系数α?

3)如何更新样本权重D?

4)使用何种结合策略

2. AdaBoost二分类问题算法流程*

输入:

  • 训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i = { − 1 , 1 } T=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}, \quad y_i = \{-1,1\} T={(x1,y1),(x2,y2),...,(xm,ym)},yi={1,1}
  • 弱分类器算法
  • 迭代次数 K K K

输出:

  • 最终的强分类器 f ( x ) f(x) f(x)

(1)初始化训练集样本权重

D 1 = ( w 11 , w 12 , . . . , w 1 m ) ; w 1 i = 1 m ; i = 1 , 2 , . . . , m D_1=\left(w_{11}, w_{12}, ... ,w_{1 m}\right) ; \quad w_{1 i}=\frac{1}{m} ; \quad i=1,2,..., m D1=(w11,w12,...,w1m);w1i=m1;i=1,2,...,m

(2)对于 k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K,使用具有权重 D k D_k Dk的训练集来训练模型,得到弱分类器 G k ( x ) G_k(x) Gk(x)

(3)计算 G k ( x ) G_k(x) Gk(x)的分类误差率

e k = P ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i I ( G k ( x i ) ≠ y i ) e_k=P(G_k(x_i) \neq y_i)=\sum_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i) ek=P(Gk(xi)̸=yi)=i=1mwkiI(Gk(xi)̸=yi)

e k = ∑ G k ( x i ) ≠ y i w k i , ∑ i = 1 m w k i = 1 e_k=\sum_{G_k(x_i)\neq y_i}w_{ki} \quad ,\quad \sum_{i=1}^{m}w_{ki}=1 ek=Gk(xi)̸=yiwki,i=1mwki=1

  • G k ( x ) G_k(x) Gk(x) 在加权训练集上的分类误差率是:误分类样本的权重之和

(4)计算弱分类器 G k ( x ) G_k(x) Gk(x)的权重系数

α k = 1 2 l o g 1 − e k e k \alpha_k=\frac{1}{2}log\frac{1-e_k}{e_k} αk=21logek1ek

  • α k \alpha_k αk 表示弱分类器 G k ( x ) G_k(x) Gk(x) 在最终的强分类器 f ( x ) f(x) f(x) 中的重要性。
  • e k ≤ 1 2 e_k \leq \frac{1}{2} ek21 时, α k ≥ 0 \alpha_k \geq 0 αk0,且 α k \alpha_k αk 随着 e k e_k ek的减小而增大。
  • 为什么采用这个权重系数,AdaBoost算法的损失函数优化部分讲。

(5)更新训练集的权重分布

w k + 1 , i = w k i Z k e − α k y i G k ( x i ) i = 1 , 2 , . . . , m w_{k+1,i}=\frac{w_{ki}}{Z_k}e^{-\alpha_ky_iG_k(x_i)} \quad i=1,2,...,m wk+1,i=ZkwkieαkyiGk(xi)i=1,2,...,m

其中 Z k Z_k Zk是规范因子:

Z k = ∑ i = 1 m w k i e − α k y i G k ( x i ) Z_k=\sum_{i=1}^{m}w_{ki}e^{-\alpha_ky_iG_k(x_i)} Zk=i=1mwkieαkyiGk(xi)

即:

w k + 1 , i = w k i e − α k y i G k ( x i ) ∑ i = 1 m w k i e − α k y i G k ( x i ) i = 1 , 2 , . . . , m w_{k+1,i}=\frac{w_{ki}e^{-\alpha_ky_iG_k(x_i)}}{\sum_{i=1}^{m}w_{ki}e^{-\alpha_ky_iG_k(x_i)}} \quad i=1,2,...,m wk+1,i=i=1mwkieαkyiGk(xi)wkieαkyiGk(xi)i=1,2,...,m

  • 如果第 i i i 个样本分类错误,则 y i G k ( x i ) < 0 y_iG_k(x_i)<0 yiGk(xi)<0,导致样本权重在第 k + 1 k+1 k+1 个弱分类器中增大。
  • 为什么采用样本权重更新方式,AdaBoost算法的损失函数优化部分讲

(6)构建最终的强分类器

f ( x ) = s i g n ( ∑ k = 1 K α k G k ( x ) ) f(x)=sign(\sum_{k=1}^{K}\alpha_kG_k(x)) f(x)=sign(k=1KαkGk(x))

  • α k \alpha_k αk 之和并不为1
  • f ( x ) f(x) f(x) 的符号决定实例 x x x 的分类

3. AdaBoost多分类问题

多分类与二分类相似,主要区别在于弱分类器的系数 α k \alpha_k αk

AdaBoost SAMME算法,弱分类器的系数为:

α k = 1 2 l o g 1 − e k e k + l o g ( R − 1 ) \alpha_k=\frac{1}{2}log\frac{1-e_k}{e_k}+log(R-1) αk=21logek1ek+log(R1)

其中 R 为类别数,如果是二分类,R=2,与前面一致。

4. AdaBoost回归问题算法流程

AdaBoost回归问题有很多变种,这里以 AdaBoost R2 算法为准。

(1)初始化训练集样本权重

D 1 = ( w 11 , w 12 , . . . , w 1 m ) ; w 1 i = 1 m ; i = 1 , 2 , . . . , m D_1=\left(w_{11}, w_{12}, ... ,w_{1 m}\right) ; \quad w_{1 i}=\frac{1}{m} ; \quad i=1,2,..., m D1=(w11,w12,...,w1m);w1i=m1;i=1,2,...,m

(2)对于 k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K,使用具有权重 D k D_k Dk的训练集来训练模型,得到弱学习器 G k ( x ) G_k(x) Gk(x)

(3)计算训练集上的最大误差

E k = m a x ∣ y i − G k ( x i ) ∣ E_k=max|y_i-G_k(x_i)| Ek=maxyiGk(xi)

(4)计算每个训练集样本的相对误差

  • 如果是线性误差, e k i = ∣ y i − G k ( x i ) ∣ E k e_{ki}=\frac{|y_i-G_k(x_i)|}{E_k} eki=EkyiGk(xi)
  • 如果是平方误差, e k i = ( y i − G k ( x i ) ) 2 E k 2 e_{ki}=\frac{(y_i-G_k(x_i))^2}{E_k^2} eki=Ek2(yiGk(xi))2
  • 如果是指数误差, e k i = 1 − e − ∣ y i − G k ( x i ) ∣ E k e_{ki}=1-e^{\frac{-|y_i-G_k(x_i)|}{E_k}} eki=1eEkyiGk(xi)

(5)计算回归误差率

e k = ∑ i = 1 m w k i e k i e_k=\sum_{i=1}^{m}w_{ki}e_{ki} ek=i=1mwkieki

(6)计算弱学习器系数

α k = e k 1 − e k \alpha_k=\frac{e_k}{1-e_k} αk=1ekek

(7)更新训练集样本权重

w k + 1 , i = w k i Z k α k 1 − e k i w_{k+1,i}=\frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}} wk+1,i=Zkwkiαk1eki

这里 Z k Z_k Zk 是规范因子

Z k = ∑ i = 1 m w k i α k 1 − e k i Z_k=\sum_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}} Zk=i=1mwkiαk1eki

w k + 1 , i = w k i α k 1 − e k i ∑ i = 1 m w k i α k 1 − e k i w_{k+1,i}=\frac{w_{ki}\alpha_k^{1-e_{ki}}}{\sum_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}}} wk+1,i=i=1mwkiαk1ekiwkiαk1eki

(8)构建最终的强学习器

f ( x ) = G k ∗ ( x ) f(x)=G_k^*(x) f(x)=Gk(x)

其中, G k ∗ ( x ) G_k^*(x) Gk(x) l n 1 α k , k = 1 , 2 , . . . , K ln \frac{1}{\alpha_k},k=1,2,...,K lnαk1k=1,2,...,K 中位数对应序号 k ∗ k^* k对应的弱学习器。

结合策略与分类问题不同,取权重中位数对应的弱学习器,作为最终的强学习器

5. AdaBoost分类问题的损失函数优化

5.1 AdaBoost算法名称由来

【李航,统计机器学习 8.2节】
推论:如果存在 γ > 0 \gamma >0 γ>0,对所有 γ k ≥ γ \gamma_k \geq \gamma γkγ γ k = 1 2 − e k \gamma_k=\frac{1}{2}-e_k γk=21ek),则
1 m ∑ i = 1 m I ( G ( x i ) ≠ y i ) ≤ e − 2 K γ 2 \frac{1}{m}\sum_{i=1}^{m}I(G(x_i)\neq y_i) \leq e^{-2K\gamma^2} m1i=1mI(G(xi)̸=yi)e2Kγ2

AdaBoost 算法不需要知道下界 γ \gamma γ,AdaBoost具有适应性,它能适应弱分类器各自的训练误差率,这是它的名称由来(适应的提升)

5.2 损失函数的定义

AdaBoost算法是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。

k − 1 k-1 k1轮强学习器

f k − 1 ( x ) = ∑ i = 1 k − 1 α i G i ( x ) f_{k-1}(x)=\sum_{i=1}^{k-1}\alpha_iG_i(x) fk1(x)=i=1k1αiGi(x)

k k k轮强学习器

f k ( x ) = ∑ i = 1 k α i G i ( x ) f_{k}(x)=\sum_{i=1}^{k}\alpha_iG_i(x) fk(x)=i=1kαiGi(x)

f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_k(x)=f_{k-1}(x)+\alpha_kG_k(x) fk(x)=fk1(x)+αkGk(x)

损失函数为指数函数

arg ⁡ min ⁡ ⎵ α , G ∑ i = 1 m exp ⁡ ( − y i f k ( x ) ) \underbrace{\arg \min }_{\alpha, G} \sum_{i=1}^{m} \exp \left(-y_{i} f_{k}(x)\right) α,G argmini=1mexp(yifk(x))

  • 使用指数函数作为损失函数的原因:可微性,代替0-1损失函数作为优化目标

5.3 损失函数的优化

( α k , G k ( x ) ) = arg ⁡ min ⁡ ⎵ α , G ∑ i = 1 m exp ⁡ [ ( − y i ) ( f k − 1 ( x ) + α G ( x ) ) ] \left(\alpha_{k}, G_{k}(x)\right)=\underbrace{\arg \min }_{\alpha, G} \sum_{i=1}^{m} \exp \left[\left(-y_{i}\right)\left(f_{k-1}(x)+\alpha G(x)\right)\right] (αk,Gk(x))=α,G argmini=1mexp[(yi)(fk1(x)+αG(x))]

w k i ′ = exp ⁡ ( − y i f k − 1 ( x ) ) w_{k i}^{\prime}=\exp \left(-y_{i} f_{k-1}(x)\right) wki=exp(yifk1(x)),它的值不依赖于 α , G \alpha, G α,G,因此与最小化无关,仅仅依赖于 f k − 1 ( x ) f_{k-1}(x) fk1(x),随着每一轮的迭代而改变。

损失函数转化为:

( α k , G k ( x ) ) = arg ⁡ min ⁡ ⎵ α , G ∑ i = 1 m w k i ′ exp ⁡ [ − y i α G ( x ) ] \left(\alpha_{k}, G_{k}(x)\right)=\underbrace{\arg \min }_{\alpha, G} \sum_{i=1}^{m} w_{k i}^{\prime} \exp \left[-y_{i} \alpha G(x)\right] (αk,Gk(x))=α,G argmini=1mwkiexp[yiαG(x)]

(1)首先求 G k ( x ) G_k(x) Gk(x),可以得到:

G k ( x ) = arg ⁡ min ⁡ ⎵ G ∑ i = 1 m w k i ′ I ( y i ≠ G ( x i ) ) G_{k}(x)=\underbrace{\arg \min }_{G} \sum_{i=1}^{m} w_{k i}^{\prime} I\left(y_{i} \neq G\left(x_{i}\right)\right) Gk(x)=G argmini=1mwkiI(yi̸=G(xi))

(2)将 G k ( x ) G_k(x) Gk(x) 带入损失函数,并对 α \alpha α 求导,使其等于0,可以得到

α k = 1 2 log ⁡ 1 − e k e k \alpha_{k}=\frac{1}{2} \log \frac{1-e_{k}}{e_{k}} αk=21logek1ek

(3)其中, e k e_k ek 为前面的分类误差率

e k = ∑ i = 1 m w k i ′ I ( y i ≠ G ( x i ) ) ∑ i = 1 m w k i ′ = ∑ i = 1 m w k i I ( y i ≠ G ( x i ) ) e_{k}=\frac{\sum_{i=1}^{m} w_{k i}^{\prime} I\left(y_{i} \neq G\left(x_{i}\right)\right)}{\sum_{i=1}^{m} w_{k i}^{\prime}}=\sum_{i=1}^{m} w_{k i} I\left(y_{i} \neq G\left(x_{i}\right)\right) ek=i=1mwkii=1mwkiI(yi̸=G(xi))=i=1mwkiI(yi̸=G(xi))

(4)样本权重更新

f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_{k}(x)=f_{k-1}(x)+\alpha_{k} G_{k}(x) fk(x)=fk1(x)+αkGk(x) w k i ′ = exp ⁡ ( − y i f k − 1 ( x ) ) \mathbb{w}_{k i}^{\prime}=\exp \left(-y_{i} f_{k-1}(x)\right) wki=exp(yifk1(x)) 可得

w k + 1 , i ′ = w k i ′ exp ⁡ [ − y i α k G k ( x ) ] w_{k+1, i}^{\prime}=w_{k i}^{\prime} \exp \left[-y_{i} \alpha_{k} G_{k}(x)\right] wk+1,i=wkiexp[yiαkGk(x)]

6. AdaBoost算法的正则化

为了防止过拟合,加入正则化,称为步长(learning rate),定义为 v v v

f k ( x ) = f k − 1 ( x ) + ν α k G k ( x ) f_{k}(x)=f_{k-1}(x)+\nu \alpha_{k} G_{k}(x) fk(x)=fk1(x)+ναkGk(x)

  • 其中 0 < v ≤ 1 0<v\leq 1 0<v1,同样的训练集,较小的 v v v意味着需要更多的弱学习器迭代次数。
  • 通常用步长和最大迭代次数一起来决定算法的拟合效果。

7. AdaBoost 总结

7.1 二分类流程

w 1 i = 1 m w_{1 i}=\frac{1}{m} w1i=m1

e k = ∑ i = 1 m w k i I ( G k ( x i ) ≠ y i ) e_k=\sum_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i) ek=i=1mwkiI(Gk(xi)̸=yi)

α k = 1 2 l o g 1 − e k e k \alpha_k=\frac{1}{2}log\frac{1-e_k}{e_k} αk=21logek1ek

w k + 1 , i = w k i Z k e − α k y i G k ( x i ) , Z k = ∑ i = 1 m w k i e − α k y i G k ( x i ) w_{k+1,i}=\frac{w_{ki}}{Z_k}e^{-\alpha_ky_iG_k(x_i)} ,\quad Z_k=\sum_{i=1}^{m}w_{ki}e^{-\alpha_ky_iG_k(x_i)} wk+1,i=ZkwkieαkyiGk(xi),Zk=i=1mwkieαkyiGk(xi)

f k ( x ) = f k − 1 ( x ) + ν α k G k ( x ) f_{k}(x)=f_{k-1}(x)+\nu \alpha_{k} G_{k}(x) fk(x)=fk1(x)+ναkGk(x)

f ( x ) = s i g n ( ∑ k = 1 K α k G k ( x ) ) f(x)=sign(\sum_{k=1}^{K}\alpha_kG_k(x)) f(x)=sign(k=1KαkGk(x))

7.2 AdaBoost的优缺点

使用最广泛的Adaboost弱学习器是决策树和神经网络。
对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。

Adaboost的主要优点有:

  • 分类精度很高
  • 可以使用各种模型来构建弱学习器,非常灵活
  • 二元分类时,构造简单,结果可理解
  • 不容易发生过拟合

Adaboost的主要缺点有:

  • 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终强学习器的预测准确性。

8. sklearn.ensemble.AdaBoost

class sklearn.ensemble.AdaBoostClassifier(base_estimator=None,
n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)

class sklearn.ensemble.AdaBoostRegressor(base_estimator=None,
n_estimators=50, learning_rate=1.0, loss=’linear’, random_state=None)

8.1 AdaBoostClassifier和AdaBoostRegressor参数

  • base_estimator:弱学习器,默认CART树
  • n_estimators:弱学习器个数,太小容易欠拟合,太大容易过拟合,默认50
  • learning_rate:步长,正则化参数,与n_estimators一起调参
  • algorithm:可选SAMME和SAMME.R,前者用样本集分类效果作为弱学习器权重,后者用样本集分类的预测概率作为弱学习器权重。SAMME.R速度快。
  • loss:可选 linear、square、exponential

8.2 弱学习器参数

bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2, 
min_samples_split=20, min_samples_leaf=5),
                         algorithm="SAMME",
                         n_estimators=200, learning_rate=0.8)
bdt.fit(X, y)

弱学习器为决策树时,可调 max_features,max_depth,min_sample_splits等

参考博客:
1. 李航. 统计学习方法 第8章 提升方法
2. 集成学习之Adaboost算法原理小结
3. sklearn adaboost文档
4. sklearn adaboost源码

你可能感兴趣的:(机器学习总结)