Adaboost算法
一、实验原理
AdaBoost(Adaptive Boosting,自适应提升)算法是由来自AT&T实验室的Freund和Schapire于1995年首次提出,该算法解决了早期Boosting算法的一些实际执行难题,而且该算法可以作为一种从一系列弱分类器中产生一个强分类器的通用方法。正由于AdaBoost算法的优异性能,Freund和Schapire因此获得了2003年度的哥德尔奖(Gödel Prize,该奖是在理论计算机科学领域中最负盛名的奖项之一)。
假设我们有一个集合{(x1, y1),(x2, y2), …, (xN,yN)},每一个数据项xi是一个表示事物特征的矢量,yi是一个与其相对应的分类yi∈{-1, 1},即xi要么属于-1,要么属于1。AdaBoost算法通过M次迭代得到了一个弱分类器集合{k1, k2,…, kM},对于每一个数据项xi来说,每个弱分类器都会给出一个分类结果来,即km(xi)∈{-1, 1}。这M个弱分类器通过某种线性组合(式1所示)就得到了一个强分类器Cm,这样我们就可以通过Cm来判断一个新的数据项xk是属于-1,还是1。这就是一个训练的过程。
二、 算法的实质
对于指定的分类器G(x),其分类效果可能未必理想,那么Adaboot算法则通过将分类器进行线性组合来提升分类效果,其表达式如下:
其中,x为数据的特征,f(x)为数据对应的分类类别,a_m为加权权重。G_m (x)为分类器函数G(x)第m次训练时数据所对应的分类类别,a_m为第m次训练时所对应的加权权重。
三、 算法的实现
输入:针对一个训练集
其中x_i表示第i个数据的特征,y_i表示第i个数据的分类类别,其中分类类别有1和-1。
输出:分类器函数f(x)
步骤:(1) 对于n个数据,其每个数据都配有一个权重系数,因此组成一个权重分布D,其初始值为
可以看出数据的总权重为1,初始状态下每个样本的权重都是一样的。
(2) 针对于训练集T,训练出最佳分类器G_m (x),由于训练目标属于分类类型,因此以分类误差率最小时所对应的分类器为最佳分类器,其分类误差率计算如下:
可以看出,分类误差率等于样本分类错误时所对应权重系数之和。
(3) 计算G_m (x)所对应的a_m
(4) 更新训练集的权重分布
经步骤(1),循环(2)-(4)步骤,就可以迭代训练出G_1 (x),G_2 (x)…G_m (x),因此通过以下公式即可计算出令人满意的分类效果。
四、代码的实现逻辑
应用情景:
训练集
其中x_i表示第i个数据的特征,y_i表示第i个数据的分类类别,其中分类类别有1和-1,这一次利用单层决策树构建G(x)来完成Adaboost算法。
根据应用需求,我们的代码实现逻辑具体如下:
在每一次构造训练器时:
在指定权重分布D下训练出最佳的单层决策树
将最佳的单层决策树加入单层决策树集合
计算alpha
更新权重分布D
如果分类错误率为0,则退出循环
返回单层决策树集合
在上述环节中,比较关键的是如何在指定权重分布D下训练出最佳的单层决策树,对此的代码实现逻辑如下:
对于数据集每一个特征:
对于数据集每一个特征值:
对于不等号的方向:
建立一个单层决策树
如果错误率低于minerro,则该单层决策树为最佳决策树
返回最佳单层决策树
五、代码演示
- 加载数据集
- 构建Adaboost
核心代码展示
(1)构建adaboost类
(2)找出最佳值
(3)进行测试
(4)结果展示
六、实验总结
其实AdaBoost算法可以看做有一个老师在看着你做作业,你做错了就打你一下,那么你下次在遇到相同的题的时候就会特别小心,错的概率就小了。慢慢的你就可以把每一道题都做对了,这个时候老师就可以下班了。当然,这个老师不会再你做对的时候给你块糖吃。