1、Adaboost算法简介
集成学习包括bagging、boosting、stacking三种方法。Adaboost作为boosting方法的一种,由Yoav Freund和RobertSchapire于1995年提出。
Adaboost的英文含义为Adaptive boost,意为自适应增强。Adaboost算法包括分类算法与回归算法,这里讲解分类算法。
这一算法的基本思路是,在一组弱分类器的基础上,通过不断调整弱分类器权重与样本权重,构建强分类器。这一算法需要事先给定一组弱分类器。在这一过程中,会增加分类误差大的样本的权重,减少分类误差小的样本的权重;并通过样本误差进一步确定弱分类器的权重,使得误差越小其权重越大。
2、Adaboost算法过程
2.1 输入输出
1)输入
训练样本集:,其中,
个弱分类器:
2)输出
最终分类器
2.2 算法过程
2.2.1 初始化样本权重
设初始的样本权重为
给训练的每个样本赋予相等的权重:,即以上权重
2.2.2 进行迭代
对于第=1,2,...,T轮迭代:
1)确定本轮基本分类器
根据最新的样本权重,计算每一个弱分类的误差。
每个弱分类器的误差为:
其中,误差最小的弱分类器记为,确定为本轮基本分类器,其误差为
2)计算本轮基本分类器的权重
上述基本分类器的权重:
从上述公式可以看出:当时,
;当
时,
;当
时,
。并且,随着
的增大,
会逐渐减小。
3)确定本轮的分类函数和强分类器
当时,分类函数
,本轮强分类器
;
当时,分类函数
,本轮强分类器
。
4)更新样本的权重
在前述弱分类器的分类下,样本的预测值与实际值可能不一致。在Adaboost算法中,会增加预测错误的样本的权重。为此,构造了如下的样本新权重:
,
其中是规范化因子,构建
。
可以看出是
的分子部分的求和,如此
,且可使得
的取值介于0到1之间。
规范化因子的表达式可以进行简化,
a.当样本分类正确时,,新的样本权重为
b.当样本分类错误时,,新的样本权重为
Tips:的简化过程
在计算时,
已知,与
无关,并且由前述构造可知
于是,上式等于
2.2.3 得到最终分类器
当在第轮迭代时:误差
=0时,或满足停止条件(如迭代次数、分类器在训练集或测试集上的性能等)时,迭代停止。
得到最终分类函数,
最终强分类器
3、Adaboost算法实例
给定如下数据集:
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
(1,4) | (2,5) | (3,9) | (4,1) | (5,8) | (6,3) | (7,10) | (8,7) | (9,7) | (10,9) | |
-1 | -1 | -1 | 1 | 1 | 1 | -1 | 1 | -1 | 1 |
其中,
为分类特征。
该数据的三个弱分类器:
,
,
3.1 初始化样本权重
初始化样本权重
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
(1,4) | (2,5) | (3,9) | (4,1) | (5,8) | (6,3) | (7,10) | (8,7) | (9,7) | (10,9) | |
-1 | -1 | -1 | 1 | 1 | 1 | -1 | 1 | -1 | 1 | |
1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 |
3.2 进行迭代
3.2.1 第1轮迭代
1)确定本轮基本分类器
根据最新的样本权重计算每个弱分类器的误差。
第1个分类器,第7、9个样本分类错误。
其误差
第2个分类器,第4、5、6、9个样本分类错误。
其误差
第3个分类器,第1、2、9、10个样本分类错误。
其误差
第1个弱分类器误差最小,记为基本分类器
,即
其误差记为,
。
2)计算本轮基本分类器的权重
基本分类器的权重:
3)确定本轮的分类函数和强分类器
本轮分类函数,本轮强分类器
本轮强分类器下,第7、9个样本分类错误(或不满足停止条件),继续迭代。
4)更新样本的权重
在前述基本分类器下,第7、9个样本分类错误。
a.当样本分类正确时,新的样本权重
b.当样本分类错误时,新的样本权重
即新的样本权重为
3.2.2 第2轮迭代
1)确定本轮基本分类器
根据最新的样本权重计算每个弱分类器的误差。
第1个分类器,第7、9个样本分类错误。
其误差
第2个分类器,第4、5、6、9个样本分类错误。
其误差
第3个分类器,第1、2、9、10个样本分类错误。
其误差
第2、3个弱分类器误差最小,不妨选择第2个分类器,记为基本分类器
,即
其误差记为,
。
2)计算本轮基本分类器的权重
基本分类器的权重:
3)确定本轮的分类函数和强分类器
本轮分类函数,本轮强分类器
本轮强分类器下,第7、9个样本分类错误(或不满足停止条件),继续迭代。
4)更新样本的权重
在前述基本分类器下,第4、5、6、9个样本分类错误。
a.当样本分类正确时,新的样本权重
b.当样本分类错误时,新的样本权重
即新的样本权重为
3.2.3 第3轮迭代
1)确定本轮基本分类器
根据最新的样本权重计算每个弱分类器的误差。
第1个分类器,第7、9个样本分类错误。
其误差
第2个分类器,第4、5、6、9个样本分类错误。
其误差
第3个分类器,第1、2、9、10个样本分类错误。
其误差
第3个弱分类器误差最小,第3个分类器,记为基本分类器
,即
其误差记为,
。
2)计算本轮基本分类器的权重
基本分类器的权重:
3)确定本轮的分类函数和强分类器
本轮分类函数,本轮强分类器
本轮强分类器下,第7、9个样本分类错误(或不满足停止条件),继续迭代。
4)更新样本的权重
在前述基本分类器下,第1、2、9、10个样本分类错误。
a.当样本分类正确时,新的样本权重
b.当样本分类错误时,新的样本权重
即新的样本权重为
3.2.4 第4轮迭代
1)确定本轮基本分类器
根据最新的样本权重计算每个弱分类器的误差。
第1个分类器,第7、9个样本分类错误。
其误差
第2个分类器,第4、5、6、9个样本分类错误。
其误差
第3个分类器,第1、2、9、10个样本分类错误。
其误差
第3个弱分类器误差最小,第3个分类器,记为基本分类器
,即
其误差记为,
。
2)计算本轮基本分类器的权重
基本分类器的权重:
3)确定本轮的分类函数和强分类器
本轮分类函数,本轮强分类器
本轮强分类器下,第7、9个样本分类错误(或不满足停止条件),继续迭代。
4)更新样本的权重
在前述基本分类器下,第1、2、9、10个样本分类错误。
a.当样本分类正确时,新的样本权重
b.当样本分类错误时,新的样本权重
即新的样本权重为
至此,可以发现,,分类函数和强分类器无法再提升,迭代终止。
3.3 得到最终分类器
最终强分类器:
3.4 分类迭代展示表
上述计算过程的数据展示如下:
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
x | (1,4) | (2,5) | (3,9) | (4,1) | (5,8) | (6,3) | (7,10) | (8,7) | (9,7) | (10,9) |
y | -1 | -1 | -1 | 1 | 1 | 1 | -1 | 1 | -1 | 1 |
W0 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 | 1/10 |
h1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
h2 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | 1 | 1 | 1 |
h3 | 1 | 1 | -1 | 1 | 1 | 1 | -1 | 1 | 1 | -1 |
f1 | -0.6931 | -0.6931 | -0.6931 | 0.6931 | 0.6931 | 0.6931 | 0.6931 | 0.6931 | 0.6931 | 0.6931 |
sign(f1) | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
W1 | 1/16 | 1/16 | 1/16 | 1/16 | 1/16 | 1/16 | 1/16 | 1/4 | 1/16 | 1/4 |
f2 | -0.9444 | -0.9444 | -0.9444 | 0.4418 | 0.4418 | 0.4418 | 0.4418 | 0.9444 | 0.9444 | 0.9444 |
sign(f2) | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
W2 | 1/18 | 1/18 | 1/18 | 1/14 | 1/14 | 1/14 | 2/9 | 1/18 | 2/7 | 1/18 |
f3 | -0.7533 | -0.7533 | -1.1355 | 0.6329 | 0.6329 | 0.6329 | 0.2507 | 1.1355 | 1.1355 | 0.7533 |
sign(f3) | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
W3 | 7/114 | 7/114 | 7/138 | 3/46 | 3/46 | 3/46 | 14/69 | 7/138 | 6/19 | 7/114 |
4、Adaboost算法代码实现
本例中,使用sklearn中的AdaBoostClassifier算法训练分类树。由于该算法中的参数设置原因,最终分类树的结果可能与前述分析不一样。
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
df = pd.DataFrame(
{'x1':[1,2,3,4,5,6,7,8,9,10],
'x2':[4,5,9,1,8,3,10,7,7,9],
'y':[-1,-1,-1,1,1,1,-1,1,-1,1]}
)
#决策树模型
X = df.iloc[:,0:2]
y = df.iloc[:,2]
clf = AdaBoostClassifier(n_estimators=5, random_state=0)
clf.fit(X,y)
clf.predict(X)
array([-1, -1, -1, 1, 1, 1, -1, 1, -1, 1])
5、关于算法的说明
1、初始的弱分类器对Adaboost算法的迭代效率和最终分类器的效果都有着比较重要的影响。比如前述例子中,若只用其中两个弱分类器,可能会导致最终的分类器效果变差。在API模块中,往往通过默认的方法选择一定数量的弱分类器。
2、Adaboost算法与GBDT、XGBoost算法虽都是boosting算法,但二者的思路不同。前者通过样本和分类器的权重的不断调整来实现算法的优化,而后者是通过梯度提升来实现算法的优化。