《机器学习实战》第七章
总结:Adaboost是一个2分类器
Adaboost其中的弱分类器可以是任意一种分类器,但是常用的是单层决策树
每一层弱分类器包括:特征维度Index;
阈值(在这一特征维度上的);
哪边是正lt or gt;
弱分类器的权重αi
每一层弱分类器的确定包含三个循环:特征维度上(eg二维特征,阈值是选在横轴上,还是纵轴上);
阈值(按照一定的步长,在某一轴上遍历选阈值);
阈值哪边为正lt or gt;
Adaboost的核心是根据弱分类器的判断结果,更新样本权重。分错的样本对应的权重增加,正确的样本权重减小。
预测新样本,∑(弱分类器的权重αi * 弱分类器的预测结果)
定义:说到boosting算法,就不得提一提bagging算法,他们两个都是把一些弱分类器组合起来来进行分类的方法,统称为集成方法(ensemble method)。类似于投资,“不把鸡蛋放在一个篮子”,虽然每个弱分类器分类的不那么准确,但是如果把多个弱分类器组合起来可以得到相当不错的结果,另外要说的是集成方法还可以组合不同的分类器,而Adaboost和boosting算法的每个弱分类器的类型都一样的。他们两个不同的地方是:boosting的每个弱分类器组合起来的权重不一样,本节的Adaboost就是一个例子,而bagging的每个弱分类器的组合权重是相等,代表的例子就是random forest。Random forest的每个弱分类器是决策树,输出的类别有多个决策树分类的类别的众数决定。
简单的说,Adaboost就是不断的对同样的数据使用同一个分类器进行分类,直到所有的数据都分类完毕,或是达到迭代的次数为止。这是一个串行训练的过程,在每个迭代过程中,分类器和数值的权重都不一样,下次的权重会依赖于当前分类器的分类结果。
具体算法:
(1)分类器的系数(权重)和分类器的错误率相关,具体如下:
(2)数据的权值:对于分类器分类正确的数据减小它的权值,相反对于分类器分错的数据增大它的权值,这样使得我们在下次的分类过程中更加关注那些被分错的数据,具体的公式如下:
以上我们就概括了Adaboost的整个算法,接下来我们就要选择一个分类器,进行Adaboost的实现。
弱分类器:单层决策树
其实就是一个单节点的决策树。构造单层决策树,这部分的构造的思路和前面的决策树是一样的,只是这里的评价体系不是熵而是加权的错误率,这里的加权是通过数据的权重D来实现的,每一次build权重都会因上一次分类结果不同而不同。
单层决策树的伪代码:
将minError设置为无穷大
对数据集中的每一个属性
对每个步长(第二层循环):
对每个不等号:
建立一棵单层决策树并利用加权数据集对其进行测试
如果错误率低于minError,则将当前的决策树设为最佳单层决策树
返回最佳单层决策树
下面进行代码的实现,首先建立adaboost.py文件。同样,我们需要一个简单的数据集用来测试我们的算法。编辑代码如下:
接下来按照伪代码实现单层决策树:
测试代码:
...................
这样我们就找到了一个弱分类器,有了这个弱分类器,接下来我们只需要根据公式构建Adaboost即可。
伪代码如下:
对每次迭代:
利用buildStump找到最佳的单层决策树
将最佳单层决策树加入数组
计算分类器系数alpha
计算新的权重D
更新累计类别估计值
如果错误率为0.0,跳出循环
继续编辑代码如下:
测试程序得到如下结果:
从上面的结果可以看出,如果对某个数据分错了,adaboost在下一次分类中会增加分错数据的权重,直到所有的数据都分类正确为止。
下面我们看一下完整的分类器:
这样我们就完成了整个算法的实现。