1. AdaBoost概述
提升方法的基本思想是从弱分类器入手,通过数据训练,我们比较容易的到一系列弱分类器,然后组合我们得到的弱分类器,将其进行组合。构成一个强分类器。AdaBoost在每一轮训练中改变数据的权值或者概率分布,提高前一轮弱分类器错误分类的权值,降低那些被正确分类样本的权值。
提升(Boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。
提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。
提升方法通过改变每轮训练数据的权值或概率,提高被弱分类器误分类样本的权值,降低被正确分类样本的权值。加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
这就好比,如何评估一个班级的学习状况。更关注的是,这个班级里成绩落后的一部分同学,那么我们就找到教课好的老师,来把精力多多的放在这些成绩落后的同学身上。对于那些成绩好的同学,即便是老师的精力没有那么多放在他们身上,他们的成绩也不会很差。这样,经过优秀的老师对成绩较差的这部分同学的训练,班级的成绩就会得到提升。
2. 原理
对于给定的训练数据集:
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
,
(
x
N
,
y
N
)
}
T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{N}, y_{N}\right)\right\}
T={(x1,y1),(x2,y2),…,(xN,yN)}
1.首先初始化训练数据的权值分布:
D
1
=
(
ω
11
,
…
,
ω
1
i
,
…
ω
1
N
)
,
ω
1
i
=
1
N
D_{1}=\left(\omega_{11}, \ldots, \omega_{1 i}, \ldots \omega_{1 N}\right), \omega_{1 i}=\frac{1}{N}
D1=(ω11,…,ω1i,…ω1N),ω1i=N1
2.对于m=1,2,…M
1)使用具有权值分布
D
m
D_{m}
Dm的训练数据集学习,得到基本分类器
G
m
(
x
)
:
X
→
{
−
1
,
+
1
}
G_{m}(x): X \rightarrow\{-1,+1\}
Gm(x):X→{−1,+1}
2)计算
G
m
(
x
)
G_{m}(x)
Gm(x)在训练数据集上的分类误差率:
e
m
=
∑
i
=
1
N
P
(
G
m
(
x
i
)
≠
y
i
)
=
∑
i
=
1
N
ω
m
i
I
(
G
m
(
x
)
≠
y
i
)
e_{m}=\sum_{i=1}^{N} P\left(G_{m}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{N} \omega_{m i} I\left(G_{m}(x) \neq y_{i}\right)
em=i=1∑NP(Gm(xi)=yi)=i=1∑NωmiI(Gm(x)=yi)
3)计算
G
m
(
x
)
G_{m}(x)
Gm(x)的系数:
∂
m
=
1
2
log
1
−
e
m
e
m
\partial_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}}
∂m=21logem1−em
4)更新训练数据集的权值分布:
D
m
+
1
=
(
ω
m
+
1
,
1
,
…
,
ω
m
+
1
,
i
,
…
,
ω
m
+
1
,
N
)
D_{m+1}=\left(\omega_{m+1,1}, \ldots, \omega_{m+1, i}, \ldots, \omega_{m+1, N}\right)
Dm+1=(ωm+1,1,…,ωm+1,i,…,ωm+1,N)
ω
m
+
1
,
i
=
ω
m
i
Z
m
exp
(
−
∂
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
…
N
\omega_{m+1, i}=\frac{\omega_{m i}}{Z_{m}} \exp \left(-\partial_{m y_{i}} G_{m}\left(x_{i}\right)\right), i=1,2, \ldots N
ωm+1,i=Zmωmiexp(−∂myiGm(xi)),i=1,2,…N
这里
Z
m
Z_{m}
Zm是一个规范化因子
Z
m
=
∑
i
=
1
N
ω
m
i
exp
(
−
∂
m
y
i
G
m
(
x
i
)
)
Z_{m}=\sum_{i=1}^{N} \omega_{m i} \exp \left(-\partial_{m} y_{i} G_{m}\left(x_{i}\right)\right)
Zm=i=1∑Nωmiexp(−∂myiGm(xi))
它使
D
m
+
1
D_{m+1}
Dm+1成为一个概率分布
3.3.构建基本分类器的线性组合:
f
(
x
)
=
∑
m
=
1
M
∂
m
G
m
(
x
)
f(x)=\sum_{m=1}^{M} \partial_{m} G_{m}(x)
f(x)=m=1∑M∂mGm(x)
得到最终的分类器:
G
(
x
)
=
sign
(
f
(
x
)
)
=
sign
(
∑
m
=
1
M
∂
m
G
m
(
x
)
)
G(x)=\operatorname{sign}(f(x))=\operatorname{sign}\left(\sum_{m=1}^{M} \partial_{m} G_{m}(x)\right)
G(x)=sign(f(x))=sign(m=1∑M∂mGm(x))
最终的分类器是多个弱分类器的加权,体现了AdaBoost算法的基本思想,分类效果好的分类器权值高,分类精度次的分类器权值低,保证了分类器的分类准确度。
3. python实现
3.1 数据集
采用breast cancer二分类数据集,在sklearn.ensemble库中调用AdaBoostClassifier分类器。
3.2 python代码
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
#导入乳腺癌数据集
cancer = datasets.load_breast_cancer()
cancer_x = cancer.data
cancer_y = cancer.target
X_train,X_test,y_train, y_test=train_test_split(
cancer_x,cancer_y,test_size=0.2)#按照比例划分数据集为训练集与测试集
# 创建一个SVM分类器并进行预测
clf =AdaBoostClassifier(n_estimators=50, learning_rate=1)
'''
n_estimators基分类器提升(循环)次数,默认是50次,这个值过大,模型容易过拟合;值过小,
模型容易欠拟合。
learning_rate学习率,表示梯度收敛速度,默认为1,如果过大,容易错过最优值,如果过小
,则收敛速度会很慢;该值需要和n_estimators进行一个权衡,当分类器迭代次数较少时,
学习率可以小一些,当迭代次数较多时,学习率可以适当放大。
'''
clf.fit(X_train,y_train)
clf_y_predict=clf.predict(X_test)#通过测试数据,得到测试标签
scores = clf.score(X_test,y_test)#测试结果打分
# 打印
print('预测准确率:',scores)
4. 总结
AdaBoost的训练误差是以指数速率下降的,且AdaBoost具有适应性,即它能适应弱分类器各自的训练误差率。AdaBoost的训练误差分析表明,AdaBoost每次迭代可以减少它在训练数据集上的分类误差率。
在AdaBoost训练过程中,AdaBoost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致AdaBoost算法易受噪声干扰。且该算法耗时较长。