1. AdaBoost
1.1 原理
AdaBoost通过串行的方式迭代训练多个相互依赖的简单模型,最后综合多个简单模型共同作用产生输出,其中核心训练思想:
(1)提高分类错误或回归偏差大的样本权重,增大对困难样本的关注;降低分类正确或回归偏差小的样本权重,减少对容易样本的关注
(2)提高分类错误率低或回归偏差小的模型权重,增大其对最终输出结果的影响;降低分类错误率高或回归偏差大的模型权重,减少其对最终输出结果的影响
1.1.1 AdaBoost分类
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)
1.1.2 AdaBoost回归
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)
1.2 sklearn实现
参考官方文档:点击查看
AdaBoost分类可通过sklearn库中ensemblel下的AdaBoostClassifier类实现
有关参数:
- base_estimator:简单模型的类型,默认为决策树分类模型
- n_estimators:AdaBoost迭代训练中简单模型的数量
- learning_rate:每次迭代过程中各简单模型的附加权重(正则化方法)
- algorithm:选择迭代训练的算法
- random_state:控制简单模型中存在的随机性
有关属性:
- base_estimateor_:AdaBoost分类中最原始的简单模型
- estimators_:各迭代训练过程中简单模型列表集合
- classes_:各类别标签
- n_classes_:类别数量
- estimator_weights_:各简单模型的权重
- estimator_errors_:各简单模型的分类误差率
- feature_importances_:基于特征计算准则的各特征重要程度
- n_features_in_:特征的个数
- feature_names_in_:特征的名称,仅当输入特征有(字符)名称时可用
有关方法:
- decision_function:计算输入数据在最终AdaBoost模型的预测值
- fit:拟合AdaBoost模型
- get_params:获取对应模型参数
- predict:预测类别
- predict_log_proba:预测l类别概率的对数
- predict_proba:预测类别概率
- score:获取给定数据集的平均准确度
- set_params:设置对应模型参数
- staged_decision_function:返回每一步迭代过程中简单模型函数值的生成器
- staged_predict:返回每一步迭代过程中简单模型预测类别的生成器
- staged_predict_proba:返回每一步迭代过程中简单模型预测类别概率的生成器
- staged_score:返回每一步迭代过程中简单模型平均准确度的生成器
使用案例
>>> 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回归,点击查看官方文档