大部分博客中关于Adaboost算法的讲解都大同小异,算法很容易看明白,但是一些细节只有在编程实现的时候才会真正弄明白。
Adaboost算法如下图:
- 初始化样本权值向量,使得每个样本的权重相同;
- 对每次迭代:
找到当前样本分布下,使得误差权重之和最小的弱分类器,并计算其误差
如果误差大于50%:
(则还不如瞎猜呢,果断舍弃)
否则:
1.计算当前弱分类器在最终的分类器中的权重,分类错误率小的弱分类器对应的权重较大。
2.更新样本权值向量,被当前弱分类器分类错误的样本的权重将被放大,反之被缩 小。(相当于在原来的样本权值向量的每个元素上面乘以一个权值,使得分类错误的样本在新的权值向量中所占比重较大)
3.计算组合分类器的分类错误率,当满足一定条件时终止迭代
- 输出最终的组合分类器
算法的精髓在于通过改变样本的重要性,即分类错误的样本权重更大,分类正确的样本权重较小,从而训练出了不同的弱分类器。那么如何改变样本的重要性分布呢?有两种方法:
- 正如在上面的算法流程图里面,通过最小化样本加权分类误差,使得分类器格外重视那些权重系数较大的样本,即在上一轮中分类错误的样本:
- 根据计算得到的新的样本权值向量来对样本进行重采样,从而在每次迭代之后都产生一个新的样本集。这种重采样的方法可以通过python的random.choice函数实现:
from numpy.random import choice new_dataset = choice(list_of_samples, number_of_items_to_pick, p=weight_vector)
例如:
elements = ['one', 'two', 'three'] #原来的样本分布 weights = [0.2, 0.3, 0.5] #样本权值 from numpy.random import choice print(choice(elements, p=weights)) #新的样本分布
这两种改变样本重要性的方法可以根据实际需要进行选择,比如
1。对于采用神经网络为弱分类器的Adaboost算法,采用第一种方式比较方便,即在原来的代价函数上面加上样本权重系数,使其最小。
2。对于采用多层决策树为弱分类器的Adaboost算法,采用第二种方法较为方便。
3。对于采用单层决策树为弱分类器的Adaboost算法,采用两种方式均可。
一个二分类的Adaboost代码及注释可以在
我的github上找到:https://github.com/plz717/Machine-Learning-Algorithms/tree/master/adaboost
代码是在https://github.com/jakezhaojb/adaboost-py/blob/master/adaboost.py上面修改得到,加入了数据集的K-fold交叉检验及对训练误差的可视化。