Boosting
(提升学习)随机森林
在随机森林的构建过程中,由于各棵树之间是没有关系的,相对独立的;在构建的过程中,构建第m个子树的时候,不会考虑前面的m-1棵子树。
那么:
对于 Bagging
思想集成的随机森林,是可以并行训练的,正是因为每个弱分类器之间不相互影响;而 Boosting
是通过串行训练而获得的,每个分类器要根据以前训练出的分类器的性能来进行训练。
Boosting
分类的结果是基于所有弱分类器的加权求和结果的,所以Boosting
中的每个弱分类器的权重不一样,每个权重代表的是其对应的弱分类器在上一轮迭代中的成功度;- 而
Bagging
中的弱分类器的权重是一样的。
Boosting
常用模型:
AdaBoost
Gradient Boosting(GBT/GBDT/GBRT)
XGBoost
AdaBoost
AdaBoost
执行过程AdaBoost
是一种迭代算法,整个迭代过程直到错误率足够小或者达到一定的迭代次数为止;每轮迭代中会在修改后的训练集上产生一个新的弱学习器,然后使用该弱学习器对所有样本进行预测,以评估每个样本的重要性。
AdaBoost
算法会为每个样本赋予一个权重,其做法是:
这样一来,在那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注,也就是说 越难区分 的样本在训练过程中会变得越重要。于是,分类问题被一系列的弱分类器“分而治之”。
AdaBoost
采取加权多数表决的方法:
- 如图1,训练一个弱分类器,由中间虚线决策;
- 如图2,将分类错误的样本加权,图中由大小区分,再训练一个弱分类器,由左侧虚线决策;
- 如图3,再将分类错误的样本权重加大,再训练弱分类器;
- 如图4,将之前学习的弱学习器决策线组合,形成最终的分类器
AdaBoost
算法推导Adaboost
算法将基分类器的线性组合作为强分类器,同时给分类误差率较小的基本分类器以大的权重值,给分类误差率较大的基分类器以小的权重值;
重点(仔细推导):
(1)构建的线性组合为:
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)
(2)最强学习器是在线性组合的基础上进行Sign函数转换:
G ( x ) = s i g n ( f ( x ) ) = s i g n [ ∑ m = 1 M α m G m ( x ) ] G(x) = sign(f(x)) = sign\Big[\sum_{m=1}^M\alpha_mG_m(x)\Big] G(x)=sign(f(x))=sign[m=1∑MαmGm(x)]
(3)损失函数:
l o s s = 1 n ∑ i = 1 n I ( G ( x i ) = ̸ y i ) ⩽ 1 n ∑ i = 1 n e − y i f ( x i ) loss=\frac{1}{n}\sum_{i=1}^nI(G(x_i) =\not y_i) \leqslant \frac{1}{n}\sum_{i=1}^n e^{-y_if(x_i)} loss=n1i=1∑nI(G(xi)≠yi)⩽n1i=1∑ne−yif(xi)
(4)假设第k-1轮的强学习器为:
f k − 1 ( x ) = ∑ j = 1 k − 1 α j G j ( x ) f_{k-1}(x)=\sum_{j=1}^{k-1}\alpha_jG_j(x) fk−1(x)=j=1∑k−1αjGj(x)
(5)第k轮的强学习器为:
f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_k(x) = f_{k-1}(x) + \alpha_kG_k(x) fk(x)=fk−1(x)+αkGk(x)
(6)损失函数为:
l o s s = 1 n ∑ i = 1 n e − y i ( f k − 1 ( x i ) + α k G k ( x i ) ) loss = \frac{1}{n}\sum_{i=1}^ne^{-y_i( f_{k-1}(x_i) + \alpha_kG_k(x_i))} loss=n1i=1∑ne−yi(fk−1(xi)+αkGk(xi))
= 1 n ∑ i = 1 n e − y i f k − 1 ( x i ) e − y i α k G k ( x i ) = \frac{1}{n}\sum_{i=1}^ne^{-y_i f_{k-1}(x_i)}e^{-y_i\alpha_kG_k(x_i)} =n1i=1∑ne−yifk−1(xi)e−yiαkGk(xi)
由于在训练第k轮的时候,前一轮损失是一个已知值,所以可令 w ‾ k i = e − y i f k − 1 ( x i ) \overline{w}_{ki} = e^{-y_i f_{k-1}(x_i)} wki=e−yifk−1(xi),第k轮的损失函数为:
l o s s = 1 n ∑ i = 1 n w ‾ k i e − y i α k G k ( x i ) loss= \frac{1}{n}\sum_{i=1}^n\overline{w}_{ki}e^{-y_i\alpha_kG_k(x_i)} loss=n1i=1∑nwkie−yiαkGk(xi)
(7)是上面损失函数达到最小值的 α k , G k \alpha_k,G_k αk,Gk 就是AdaBoost
算法的最终解
求解过程分为两步:
AdaBoost
算法的基本分类器(弱分类器),它是使第k轮加权训练数据分类误差率最小的基本分类器。以上就是算法的推导过程,下面我们就用上面得到的解,来构建 AdaBoost
算法:
AdaBoost
算法的构建过程:其中, w ( m i ) w_{(mi)} w(mi)为第m次迭代第i个样本的权重, I ( G m ( x ) = ̸ y i ) I(G_m(x) =\not y_i) I(Gm(x)≠yi)为指示函数,决策正确为0,决策错位为1;
其中: Z m = ∑ i = 1 n w ( m i ) e − y i α m G m ( x i ) Z_m = \sum_{i=1}^n w_{(mi)}e^{-y_i\alpha_mG_m(x_i)} Zm=i=1∑nw(mi)e−yiαmGm(xi)
AdaBoost
算法通过具体数据了解 AdaBoost
算法
训练数据集如下表:
(1)初始化数据权值分布
D 1 = ( w 11 , w 12 , . . . , w 110 ) w 1 i = 0.1 , i = 1 , 2 , . . . , 10 D_1 = (w_{11},w_{12},...,w_{110}) \\ w_{1i} = 0.1, i = 1,2,...,10 D1=(w11,w12,...,w110)w1i=0.1,i=1,2,...,10
(2)对 m = 1 m = 1 m=1:
(a)在权值分布为 D 1 D_1 D1的训练数据集上,阀值 v v v取2.5时分类误差率最低,故基本分类器为:
G 1 ( x ) = { 1 , x < 2.5 − 1 , x > 2.5 G_1(x) = \begin{cases} 1, \quad x < 2.5 \\ \\ -1, \quad x>2.5 \end{cases} G1(x)=⎩⎪⎨⎪⎧1,x<2.5−1,x>2.5
(b) G 1 ( x ) G_1(x) G1(x)在训练数据集上的误差率
e 1 = P ( G 1 ( x ) = ̸ y i ) = 0.3 e_1 = P(G_1(x) =\not y_i) = 0.3 e1=P(G1(x)≠yi)=0.3
(c)计算 G 1 ( x ) G_1(x) G1(x)的系数:
α 1 = 1 2 l o g 1 − e 1 e 1 = 0.4236 \alpha_1 = \frac{1}{2}log\frac{1- e_1}{e_1} = 0.4236 α1=21loge11−e1=0.4236
(d)更新训练数据集的权值分布
D 2 = ( w 21 , w 22 , . . . , w 210 ) w w i = w 1 i Z 1 e x p ( − α 1 y i G 1 ( x ) ) , i = 1 , 2 , . . . , 10 D 2 = ( 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.07143 , 0.16667 , 0.16667 , 0.16667 , 0.07143 ) f 1 ( x ) = 0.4236 G 1 ( x ) D_2 = (w_{21},w_{22},...,w_{210}) \\ w_{wi} = \frac{w_{1i}}{Z_1}exp(-\alpha_1 y_iG_1(x)), i = 1, 2,...,10 \\ D_2 = (0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143) \\ f_1(x) = 0.4236G_1(x) D2=(w21,w22,...,w210)wwi=Z1w1iexp(−α1yiG1(x)),i=1,2,...,10D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143)f1(x)=0.4236G1(x)
分类器 s i n g [ f 1 ( x ) ] sing[f_1(x)] sing[f1(x)]在训练数据集上有3个误分类点。
对 m = 2 m = 2 m=2:
(a)在权值分布为 D 2 D_2 D2的训练数据集上,阀值 v v v取8.5时分类误差率最低,故基本分类器为:
G 2 ( x ) = { 1 , x < 8.5 − 1 , x > 8.5 G_2(x) = \begin{cases} 1, \quad x < 8.5 \\ \\ -1, \quad x>8.5 \end{cases} G2(x)=⎩⎪⎨⎪⎧1,x<8.5−1,x>8.5
此时,序号为4,5,6的分类错误
(b) G 2 ( x ) G_2(x) G2(x)在训练数据集上的误差率(将序号为4,5,6对应的w相加):
e 2 = 0.07143 + 0.07143 + 0.07143 = 0.2143 e_2 =0.07143 + 0.07143+0.07143 = 0.2143 e2=0.07143+0.07143+0.07143=0.2143
(c)计算 G 2 ( x ) G_2(x) G2(x)的系数: α 2 = 0.6496 \alpha_2 = 0.6496 α2=0.6496
(d)更新训练数据集的权值分布
D 3 = ( 0.0455 , 0.0455 , 0.0455 , 0.1667 , 0.1667 , 0.1667 , 0.1667 , 0.1667 , 0.1667 , 0.0455 ) f 2 ( x ) = 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) D_3 = (0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,\\ 0.1667,0.1667,0.1667,0.0455) \\ f_2(x) = 0.4236G_1(x) + 0.6496G_2(x) D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1667,0.1667,0.1667,0.0455)f2(x)=0.4236G1(x)+0.6496G2(x)
分类器 s i n g [ f 2 ( x ) ] sing[f_2(x)] sing[f2(x)]在训练数据集上有3个误分类点。
对 m = 3 m = 3 m=3:
(a)在权值分布为 D 3 D_3 D3的训练数据集上,阀值 v v v取8.5时分类误差率最低,故基本分类器为:
G 3 ( x ) = { 1 , x < 5.5 − 1 , x > 5.5 G_3(x) = \begin{cases} 1, \quad x < 5.5 \\ \\ -1, \quad x>5.5 \end{cases} G3(x)=⎩⎪⎨⎪⎧1,x<5.5−1,x>5.5
(b) G 3 ( x ) G_3(x) G3(x)在训练数据集上的误差率: e 3 = 0.1820 e_3 = 0.1820 e3=0.1820
(c)计算 G 3 ( x ) G_3(x) G3(x)的系数: α 3 = 0.7514 \alpha_3 = 0.7514 α3=0.7514
(d)更新训练数据集的权值分布
D 3 = ( 0.125 , 0.125 , 0.125 , 0.125 , 0.102 , 0.102 , 0.102 , 0.065 , 0.065 , 0.125 ) f 3 ( x ) = 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) + 0.7514 G 3 ( x ) D_3 = (0.125,0.125,0.125,0.125,0.102,0.102,\\ 0.102,0.065,0.065,0.125) \\ f_3(x) = 0.4236G_1(x) + 0.6496G_2(x)+0.7514G_3(x) D3=(0.125,0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.125)f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x)
分类器 s i n g [ f 3 ( x ) ] sing[f_3(x)] sing[f3(x)]在训练数据集上有0个误分类点。
最终分类器为:
G ( x ) = s i g n [ f 3 ( x ) ] = s i g n [ 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) + 0.7514 G 3 ( x ) ] G(x) = sign[f_3(x)] = sign[0.4236G_1(x) + 0.6496G_2(x)+0.7514G_3(x)] G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]
AdaBoost
案例代码可见:Github
sklearn
库中 ensemble.AdaBoostClassifier
以及 ensemble.AdaBoostRegressor
API:
分类:
sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50,
learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)
回归:
sklearn.ensemble.AdaBoostRegressor(base_estimator=None, n_estimators=50,
learning_rate=1.0, loss=’linear’, random_state=None)
常用参数比较:
参数 | AdaBoostClassifier | AdaBoostRegressor |
base_estimator | 弱分类器对象,默认为CART分类树,DecisionTreeClassifier; | 弱回归器对象,默认为CART回归树,DecisionTreeRegressor; |
algorithm | SAMME和SAMME.R;SAMME表示构建过程中使用样本集分类效果作为弱分类器的权重;SAMME.R使用对样本集分类的预测概率大小作为弱分类器的权重。由于SAMME.R使用了连续的概率度量值,所以一般迭代比SAMME快,默认参数为SAMME.R;强调:使用SAMME.R必须要求base_estimator指定的弱分类器模型必须支持概率预测,即具有predict_proba方法。 | 不支持 |
loss | 不支持 | 指定误差的计算方式,可选参数”linear”, “square”,“exponential”, 默认为”linear”;一般不用改动 |
n_estimators | 最大迭代次数,值过小可能会导致欠拟合,值过大可能会导致过拟合,一般50~100比较适合,默认50 | |
learning_rate | 指定每个弱分类器的权重缩减系数v,默认为1;一般从一个比较小的值开始进行调参;该值越小表示需要更 多的弱分类器 |
max_depth
,一般范围在10-100之间n_estimators
较小迭代次数或者最大弱分类器数:200次Adaboost
分类算法本案例将 AdaBoosted
决策树桩拟合到由两个“高斯分位数” 聚类组成的非线性可分类分类数据集,并绘制决策边界和决策分数
代码可见:05_Adaboost分类算法.py
Adaboost
参数algorithm
取值比较本案例通过更改参数algorithm
的取值比较"ASMME"
和"SAMME.R"
的收敛速度,错误率
可以看出,
SAMME.R
的收敛速度明显比SAMME
快,错误率也比SAMME
低,所以一般推荐使用SAMME.R
代码可见:06_Adaboost参数algorithm取值比较.py
AdaBoost
的优点如下:
AdaBoost
的缺点如下: