AdaBoost是Adaptive Boosting(自适应增强)的缩写,它的自适应在于:被前一个基本分类器误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或预先指定的最大迭代次数再确定最后的强分类器。
1.算法步骤
首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都会被赋予相同的权值:w1 = 1/N。
训练弱分类器Ci。具体训练过程:如果某个训练样本点,被弱分类器Ci准确地分类,那么再构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值的更新过的样本被用于训练下一个弱分类器,整个过程如此迭代下去。
最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
2.算法过程
(1).首先,初始化训练集的权值分布。每个训练样本最开始都被赋予相同的权值:
w
i
=
1
N
w_{i}=\frac{1}{N}
wi?=N1?这样样本集的权值初始分布为
D
1
(
i
)
=
(
w
1
,
w
2
,
?
w
N
)
=
(
1
N
,
1
N
,
?
1
N
)
D_{1}(i)=(w_{1},w_{2},\cdots w_{N})=\left(\frac{1}{N},\frac{1}{N},\cdots\frac{1}{N}\right)
D1?(i)=(w1?,w2?,?wN?)=(N1?,N1?,?N1?)
(2).进行迭代
t
=
1
,
2
,
?
?
,
T
t=1,2,\cdots,T
t=1,2,?,T
(a).选取一个当前误差率最低的分类器h作为第t个基分类器H_t,并计算弱分类器h_t在训练集上的分类误差率:
e
t
=
∑
i
=
1
m
w
t
,
i
I
(
h
t
(
x
i
)
≠
f
(
x
i
)
)
e_{t}=\sum_{i=1}^{m}w_{t,i}I\big(h_{t}(x_{i})\neq f(x_{i})\big)
et?=i=1∑m?wt,i?I(ht?(xi?)=f(xi?))
(b).计算该分类器在最终分类器中所占的权重:
?
t
=
1
2
ln
?
1
?
e
t
e
t
\partial_t=\frac{1}{2}\ln\frac{1-e_t}{e_t}
?t?=21?lnet?1?et??
?.更新样本的权重分布:
D
t
+
1
=
D
t
e
x
p
(
?
?
t
f
(
x
)
h
t
(
x
)
)
Z
t
D_{t+1}=\frac{D_texp(-\partial_tf(x)h_t(x))}{Z_t}
Dt+1?=Zt?Dt?exp(??t?f(x)ht?(x))?
其中:
Z
t
=
∑
i
=
1
m
w
t
,
i
e
x
p
(
?
?
t
f
(
x
i
)
h
t
(
x
i
)
)
Z_t=\sum_{i=1}^mw_{t,i}exp\bigl(-\partial_tf(x_i)h_t(x_i)\bigr)
Zt?=i=1∑m?wt,i?exp(??t?f(xi?)ht?(xi?))
(3).最后按照弱分类器权重\partial_t组成各个弱分类器:
f
(
x
)
=
∑
i
=
1
T
?
i
H
i
(
x
)
\mathrm{f(x)=\sum_{i=1}^T\partial_iH_i(x)}
f(x)=i=1∑T??i?Hi?(x)
通过符号函数sign最终得到一个强分类器:
H
f
i
n
a
l
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
i
=
1
T
?
i
H
i
(
x
)
?
)
H_{final}=sign\big(\mathrm{f(x)}\big)=sign\bigg(\sum_{\mathrm{i}=1}^{\mathrm{T}}\partial_i\operatorname{H_i(x)}\bigg)
Hfinal?=sign(f(x))=sign(i=1∑T??i?Hi?(x))
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建AdaBoost分类器
clf = AdaBoostClassifier(n_estimators=50, learning_rate=1.0)
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 打印预测结果
print(y_pred)
我们使用了鸢尾花数据集,这是一个常用的多类别分类数据集。我们首先加载数据,然后划分为训练集和测试集。然后,我们创建一个AdaBoost分类器,并使用训练集对其进行训练。最后,我们使用训练好的模型对测试集进行预测,并打印出预测结果。
AdaBoostClassifier的参数n_estimators表示弱学习器的最大数量,learning_rate表示学习率,这两个参数都可以根据需要进行调整。在scikit-learn的AdaBoostClassifier中,默认的弱学习器是一个最大深度为1的决策树桩。你也可以通过base_estimator参数来指定其他类型的弱学习器。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn import svm
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建朴素贝叶斯分类器作为弱学习器的AdaBoost分类器
clf_nb = AdaBoostClassifier(base_estimator=GaussianNB(), n_estimators=50, learning_rate=1.0)
clf_nb.fit(X_train, y_train)
y_pred_nb = clf_nb.predict(X_test)
print(y_pred_nb)
# 创建SVM作为弱学习器的AdaBoost分类器
clf_svm = AdaBoostClassifier(base_estimator=svm.SVC(probability=True, kernel='linear'), n_estimators=50, learning_rate=1.0)
clf_svm.fit(X_train, y_train)
y_pred_svm = clf_svm.predict(X_test)
print(y_pred_svm)
我们首先创建了一个使用朴素贝叶斯分类器作为弱学习器的AdaBoost分类器,然后创建了一个使用SVM作为弱学习器的AdaBoost分类器。注意,对于SVM,我们需要设置probability=True,因为AdaBoost需要使用类别概率。