0. 引言
前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》
《NLP深入学习(七):词向量》
《NLP深入学习(八):感知机学习》
《NLP深入学习(九):KNN 算法及分类用法》
《NLP深入学习(十):决策树(ID3、C4.5以及CART)》
《NLP深入学习(十一):逻辑回归(logistic regression)》
《NLP深入学习(十二):支持向量机(SVM)》
1. 什么是 AdaBoost
AdaBoost(Adaptive Boosting)是一种集成学习(ensemble learning)方法,用于提高弱分类器的性能。它是由 Yoav Freund 和Robert Schapire 在1996年提出的。AdaBoost 主要关注于组合多个弱分类器(弱学习器),通过加权组合它们的结果来构建一个强分类器。
在 AdaBoost 中,每个训练样本都被赋予一个权重,初始时所有样本权重均等。然后,算法在每一轮迭代中训练一个新的弱分类器,并根据其在训练集上的表现调整样本权重:正确分类的样本权重降低,而错误分类的样本权重增加。这样,在后续的迭代中,算法会更加关注那些被先前弱分类器难处理的样本。
最后,AdaBoost 将所有弱分类器以加权多数投票的方式结合起来,其中每个弱分类器的权重与其在整体分类效果中的重要性成正比。经过多轮迭代后得到的最终模型是一个综合了多个弱分类器意见的强分类器,通常能够显著提高预测性能并具有良好的泛化能力。
AdaBoost 的核心思想是通过适应性地改变数据分布来强调难以分错类别的实例,从而逐步提升整体的学习效果。
2. 具体算法过程
AdaBoost 的推导涉及到加权投票和样本权重的动态调整,以下是AdaBoost 的基本推导过程:
假设我们有一个二分类问题,类别标签为 y i ∈ { − 1 , 1 } y_i \in \{-1, 1\} yi∈{−1,1},训练集为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} {(x1,y1),(x2,y2),...,(xn,yn)}。
-
初始化样本权重: 对于每个样本,初始化权重为 w i ( 1 ) = 1 n w_i^{(1)} = \frac{1}{n} wi(1)=n1,其中 i = 1 , 2 , . . . , n i = 1, 2, ..., n i=1,2,...,n,表示第一轮迭代时所有样本的权重相等。
-
迭代训练: 对于每轮 t = 1 , 2 , . . . , T t = 1, 2, ..., T t=1,2,...,T,训练一个弱分类器 h t h_t ht。训练时,使用带有权重的数据集,得到分类器 h t ( x ) h_t(x) ht(x)。
-
计算分类错误率: 计算第 t t t 个分类器在加权样本上的错误率:
ϵ t = ∑ i = 1 n w i ( t ) ⋅ I ( h t ( x i ) ≠ y i ) \epsilon_t = \sum_{i=1}^{n} w_i^{(t)} \cdot \mathbb{I}(h_t(x_i) \neq y_i) ϵt=i=1∑nwi(t)⋅I(ht(xi)=yi)
其中, I ( ⋅ ) \mathbb{I}(\cdot) I(⋅) 是指示函数,即满足要求为1,不满足要求为0。 -
计算分类器权重: 计算分类器的权重(弱学习器的权重):
α t = 1 2 log ( 1 − ϵ t ϵ t ) \alpha_t = \frac{1}{2} \log\left(\frac{1 - \epsilon_t}{\epsilon_t}\right) αt=21log(ϵt1−ϵt)
这里, α t \alpha_t αt 与错误率相关,错误率低的分类器会得到较高的权重。 -
更新样本权重: 更新下一轮迭代的样本权重:
w i ( t + 1 ) = w i ( t ) ⋅ exp ( − α t ⋅ y i ⋅ h t ( x i ) ) w_i^{(t+1)} = w_i^{(t)} \cdot \exp\left(-\alpha_t \cdot y_i \cdot h_t(x_i)\right) wi(t+1)=wi(t)⋅exp(−αt⋅yi⋅ht(xi))
这里,样本被正确分类的权重降低,被错误分类的权重提高。 -
归一化样本权重: 对样本权重进行归一化,确保它们的和为1:
w i ( t + 1 ) = w i ( t + 1 ) ∑ i = 1 n w i ( t + 1 ) w_i^{(t+1)} = \frac{w_i^{(t+1)}}{\sum_{i=1}^{n} w_i^{(t+1)}} wi(t+1)=∑i=1nwi(t+1)wi(t+1) -
构建强分类器: 最终分类器表示为弱分类器的线性组合:
H ( x ) = sign ( ∑ t = 1 T α t ⋅ h t ( x ) ) H(x) = \text{sign}\left(\sum_{t=1}^{T} \alpha_t \cdot h_t(x)\right) H(x)=sign(t=1∑Tαt⋅ht(x))
这就是 AdaBoost 的基本推导过程。通过迭代训练、动态调整样本权重以及对弱分类器进行加权组合,AdaBoost 能够逐步提升对数据的拟合能力。
3. 例子
让我们考虑一个简单的分类问题,其中我们有两个特征 x 1 x_1 x1 和 x 2 x_2 x2,以及两个类别(+1 和 -1)。我们使用 AdaBoost 来构建一个强分类器,基础分类器选择为决策树桩(stump)。
假设我们的训练集如下:
正类别(+1):
(1, 2), (2, 3), (3, 3)
负类别(-1):
(2, 1), (3, 2), (4, 1)
x 1 x_1 x1 和 x 2 x_2 x2 是特征,类别标签分别为 +1 和 -1。
首先,我们初始化样本权重为 w i ( 1 ) = 1 6 w_i^{(1)} = \frac{1}{6} wi(1)=61。
第一轮迭代:
我们训练一个决策树桩,它在
x
1
x_1
x1 特征上选择阈值
x
1
<
2.5
x_1 < 2.5
x1<2.5 进行分类。分类结果如下:
- 正类别样本:(1, 2), (2, 3), (3, 3)
- 负类别样本:(2, 1), (3, 2), (4, 1)
计算错误率
ϵ
1
\epsilon_1
ϵ1:
ϵ
1
=
1
6
+
1
6
+
1
6
+
1
6
=
2
3
\epsilon_1 = \frac{1}{6} + \frac{1}{6} + \frac{1}{6} + \frac{1}{6} = \frac{2}{3}
ϵ1=61+61+61+61=32
计算分类器权重
α
1
\alpha_1
α1:
α
1
=
1
2
log
(
1
−
ϵ
1
ϵ
1
)
≈
0.65
\alpha_1 = \frac{1}{2} \log\left(\frac{1 - \epsilon_1}{\epsilon_1}\right) \approx 0.65
α1=21log(ϵ11−ϵ1)≈0.65
更新样本权重:
w
i
(
2
)
=
w
i
(
1
)
⋅
exp
(
−
α
1
⋅
y
i
⋅
h
1
(
x
i
)
)
w_i^{(2)} = w_i^{(1)} \cdot \exp\left(-\alpha_1 \cdot y_i \cdot h_1(x_i)\right)
wi(2)=wi(1)⋅exp(−α1⋅yi⋅h1(xi))
其中 h 1 ( x ) h_1(x) h1(x) 为第一个分类器的输出。在这个例子中,样本权重更新如下:
w i ( 2 ) ∝ { 0.14 , 0.14 , 0.14 , 0.14 , 0.14 , 0.29 } w_i^{(2)} \propto \{0.14, 0.14, 0.14, 0.14, 0.14, 0.29\} wi(2)∝{0.14,0.14,0.14,0.14,0.14,0.29}
第二轮迭代:
我们根据更新后的权重再次训练一个决策树桩,以提高对先前被错误分类的样本的关注。重复上述步骤,计算错误率、分类器权重、更新样本权重。
重复这个过程,直到达到预定的迭代次数或者错误率足够小。最后,通过将所有弱分类器组合起来,我们得到一个强分类器,能够更准确地对新样本进行分类。AdaBoost 的核心思想是通过迭代加权组合弱分类器,逐步提升整体的性能。
4. 参考
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》
《NLP深入学习(七):词向量》
《NLP深入学习(八):感知机学习》
《NLP深入学习(九):KNN 算法及分类用法》
《NLP深入学习(十):决策树(ID3、C4.5以及CART)》
《NLP深入学习(十一):逻辑回归(logistic regression)》
《NLP深入学习(十二):支持向量机(SVM)》
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
也欢迎关注我的wx公众号:一个比特定乾坤