AdaBoost通过串行的方式迭代训练多个相互依赖的简单模型,最后综合多个简单模型共同作用产生输出,其中核心训练思想:
(1)提高分类错误或回归偏差大的样本权重,增大对困难样本的关注;降低分类正确或回归偏差小的样本权重,减少对容易样本的关注
(2)提高分类错误率低或回归偏差小的模型权重,增大其对最终输出结果的影响;降低分类错误率高或回归偏差大的模型权重,减少其对最终输出结果的影响
AdaBoost分类更新样本权重和组合分类模型的过程如下:
(1)假设给定一个大小为 n n n的数据集:
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . . . , ( x n , y n ) } \boldsymbol{D} = \{ (\pmb{x_1},y_1), (\pmb{x_2}, y_2),.....,(\pmb{x_n}, y_n) \} D={(x1x1x1,y1),(x2x2x2,y2),.....,(xnxnxn,yn)}
其中数据集的初始权重分布为:
W 1 ( i ) = ( w 1 ( 1 ) , w 1 ( 2 ) , . . . , w 1 ( n ) ) = ( 1 N , 1 N , . . . , 1 N ) \boldsymbol{W_1^{(i)}} = (w_1^{(1)}, w_1^{(2)},...,w_1^{(n)})=(\frac{1}{N},\frac{1}{N},...,\frac{1}{N}) W1(i)=(w1(1),w1(2),...,w1(n))=(N1,N1,...,N1)
(2)第t次训练的简单模型分类误差率定义为错误分类样本的权重和:
e t = ∑ i = 1 n w t ( i ) I ( f t ( x i ) ≠ y i ) , t = 1 , 2 , . . . , m e_t = \sum_{i=1}^{n}w_t^{(i)}I(f_t(\pmb{x_i}) \neq y_i),\quad t=1,2,...,m et=i=1∑nwt(i)I(ft(xixixi)=yi),t=1,2,...,m
其中 f t ( x i ) f_t(\pmb{x_i}) ft(xixixi)为第t次训练的简单模型决策函数, m m m为简单模型训练迭代次数
(3)根据第t次训练简单模型的误差率计算该模型在最终输出的权重占比:
α t = 1 2 log ( 1 − e t e t ) \alpha_t = \frac{1}{2} \log (\frac{1-e_t}{e_t}) αt=21log(et1−et)
(4)更新第t+1次训练样本的权重分布:
W t + 1 ( i ) = W t ( i ) e x p ( − α t y i f t ( x i ) ) Z t \boldsymbol{W_{t+1}^{(i)}} = \frac{\boldsymbol{W_{t}^{(i)}}exp(-\alpha_ty_if_t(\pmb{x_i}))}{Z_t} Wt+1(i)=ZtWt(i)exp(−αtyift(xixixi))
其中 Z t Z_t Zt为规一化因子,定义如下:
Z t = ∑ i = 1 n w t ( i ) e x p ( − α t y i f t ( x i ) ) = 2 e t ( 1 − e t ) Z_t= \sum_{i=1}^n w_{t}^{(i)}exp(-\alpha_ty_if_t(\pmb{x_i}))=2\sqrt{e_t(1-e_t)} Zt=i=1∑nwt(i)exp(−αtyift(xixixi))=2et(1−et)
(5)当达到指定误差率或简单模型训练的最大迭代次数,则组合得到最终的AdaBoost模型:
f ( x ) = ∑ t = 1 m α t f t ( x ) f(\pmb{x}) =\sum_{t=1}^{m}\alpha_tf_t(\pmb {x}) f(xxx)=t=1∑mαtft(xxx)
AdaBoost回归更新样本权重和组合回归模型的过程如下:
(1)假设给定一个大小为 n n n的数据集:
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . . . , ( x n , y n ) } \boldsymbol{D} = \{ (\pmb{x_1},y_1), (\pmb{x_2}, y_2),.....,(\pmb{x_n}, y_n) \} D={(x1x1x1,y1),(x2x2x2,y2),.....,(xnxnxn,yn)}
其中数据集的初始权重分布为:
W 1 ( i ) = ( w 1 ( 1 ) , w 1 ( 2 ) , . . . , w 1 ( n ) ) = ( 1 N , 1 N , . . . , 1 N ) \boldsymbol{W_1^{(i)}} = (w_1^{(1)}, w_1^{(2)},...,w_1^{(n)})=(\frac{1}{N},\frac{1}{N},...,\frac{1}{N}) W1(i)=(w1(1),w1(2),...,w1(n))=(N1,N1,...,N1)
(2)第t次训练的简单模型中样本相对误差的定义如下:
线 性 误 差 : e t ( i ) = ∣ y i − f ( x i ) ∣ E t 线性误差:e_t^{(i)} = \frac{|y_i - f(\pmb{x_i})|}{E_t} 线性误差:et(i)=Et∣yi−f(xixixi)∣
平 方 误 差 : e t ( i ) = ( y i − f ( x i ) ) 2 E t 平方误差:e_t^{(i)} = \frac{(y_i - f(\pmb{x_i}))^2}{E_t} 平方误差:et(i)=Et(yi−f(xixixi))2
指 数 误 差 : e t ( i ) = 1 − e x p ( − ∣ y i − f ( x i ) ∣ E t ) \quad \quad \quad \text{ }指数误差:e_t^{(i)} = 1-exp(\frac{-|y_i - f(\pmb{x_i})|}{E_t}) 指数误差:et(i)=1−exp(Et−∣yi−f(xixixi)∣)
其中 f t ( x i ) f_t(\pmb{x_i}) ft(xixixi)为第t次训练的简单模型决策函数, E t E_t Et为所有样本中对应的最大误差
(3)第t次训练的简单模型回归误差率定义如下:
e t = ∑ i = 1 n w t ( i ) e t ( i ) , t = 1 , 2 , . . . , m e_t = \sum_{i=1}^{n}w_t^{(i)}e_t^{(i)},\quad t=1,2,...,m et=i=1∑nwt(i)et(i),t=1,2,...,m
其中 m m m为简单模型训练迭代次数
(4)根据第t次训练简单模型的误差率计算该模型在最终输出的权重占比:
α t = e t 1 − e t \alpha_t =\frac{e_t}{1-e_t} αt=1−etet
(5)更新第t+1次训练样本的权重分布:
W t + 1 ( i ) = W t ( i ) α t 1 − e t i Z t \boldsymbol{W_{t+1}^{(i)}} = \frac{\boldsymbol{W_{t}^{(i)}}\alpha_t^{1-e_t^{i}}}{Z_t} Wt+1(i)=ZtWt(i)αt1−eti
其中 Z t Z_t Zt为规一化因子,定义如下:
Z t = ∑ i = 1 n w t ( i ) α t 1 − e t i Z_t= \sum_{i=1}^nw_{t}^{(i)}\alpha_t^{1-e_t^{i}} Zt=i=1∑nwt(i)αt1−eti
(6)当达到指定误差率或简单模型训练的最大迭代次数,则组合得到最终的AdaBoost模型:
f ( x ) = ∑ t = 1 m ln ( 1 α t ) g ( x ) f(\pmb{x}) =\sum_{t=1}^{m}\ln(\frac{1}{\alpha_t})g(\pmb {x}) f(xxx)=t=1∑mln(αt1)g(xxx)
其中 g ( x ) g(\pmb x) g(xxx)是 α t f t ( x ) , t = 1 , 2 , 3 , . . . , m \alpha_tf_t(\pmb {x}),t=1,2,3,...,m αtft(xxx),t=1,2,3,...,m的中位数分类器 f t ( x ) f_t(\pmb x) ft(xxx)
参考官方文档:点击查看
AdaBoost分类可通过sklearn库中ensemblel下的AdaBoostClassifier类实现
有关参数:
使用案例
>>> import numpy as np
>>> from sklearn.ensemble import AdaBoostClassifier
>>> clf = AdaBoostClassifier() #实例化AdaBoost分类模型对象
>>> X = np.array([[1, 1], [1, 0], [0, 1]]) #数据
>>> y = np.array(['yes', 'no', 'no']) #类别
>>> clf.fit(X, y) #拟合求解
>>> clf.classes_
['no', 'yes']
>>> clf.n_features_in_
2
>>> clf.estimator_weights_
[1., 1.,...,1.]
>>> clf.decision_function(X)
[11.85...,-11.85...,-12.33...]
>>> clf.predict([[1, 0]])
['no']
>>> clf.score(X, y)
1.0
有关AdaBoost回归,点击查看官方文档