机器学习入门之 — Adaboost

Adaboost 的思想

Adaboost的想法是通过多个弱分分类器,组成一个效果很好的分类器。
对于第一个分类器分类错误的点,他们的权重变大,使得后面的分类器不得不去关注这些权值更大的点。然后,多个分类器累加在一起,实现一个比较好的效果。

Adaboost 一个例子
  • 基本的步骤是:
  1. 求每个点的权重
  2. 求一个基分类器
  3. 求在这个基分类器上面的误差
  4. 得出基分类器的权重
  5. 更新每个点的权重,跳到step1

我们按照这个例子,走一遍流程。

  • step1 计算权重
    对于刚开始,数据的每个权值都是 1/10。即 D1=(w11,w12,.....,w110),每一个的权重都是1/10 。

  • step2 计算基分类器
    (在这里做了一个简单的假设,就是基分类器是一个弱分类器,由x<v 或 x>v 产生)。在权重分布是D1的数据集上面,v=2.5是一个最好的情况。所以,基分类器是:


  • step3 计算当前分类器的误差
    误差的计算公式是:


    仔细一看,不就是对分类错误的点的权重求和吗?嗯嗯,是的!
    于是,这个的有三个点被分类错误,每一个点的权重都是0.1,所以分类错误的权重是0.1*3 = 0.3

  • step4 求解当前基分类器的权重


    那么这个的权重是:


  • step5 更新训练数据的权值分布



    公式里面的Zm指的是:


这个公式看起来稍稍复杂一点,但是细看一下也不是很复杂。对于当前点的权重的更新,我们写一段小代码,求解一下。

import math 

def creatdataset():
    x=[0,1,2,3,4,5,6,7,8,9]
    y=[1,1,1,-1,-1,-1,1,1,1,-1]
    return x,y

#a指的是基分类器的权重
def update_weight(a,weight,x,y,y_pre):
    res=[]
    for i in range(0,10):
        res.append(weight[i] * math.exp(-a*y[i]*y_pre[i]))
    new_weight = [float(ele)/sum(res) for ele in res]
    return new_weight

if __name__=="__main__":
    #原始的权重
    weight = [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
    #数据集
    x,y= creatdataset()
    #基分类器的分类效果
    y_pre = [1,1,1,-1,-1,-1,-1,-1,-1,-1]
    # 更新权重
    new_weight = update_weight(0.4236,weight,x,y,y_pre)

    print (new_weight)
输出结果:
[0.07143206644239734, 0.07143206644239734, 0.07143206644239734,
 0.07143206644239734, 0.07143206644239734,  0.07143206644239734, 
 0.1666585116344062, 0.1666585116344062, 0.1666585116344062, 
 0.07143206644239734]

这个是第一个分类器的分类效果。我们再往下计算。重复进行刚才的计算。

对于第二个分类器:

对于第三个分类器:



(sign函数是一个分段函数)

这就是adaboost的一个例子。这个多个弱分类器组合出一个强分类器的优点是可以明显提高模型的泛化能力(也就是不会出现决策树那样的过拟合的情况)。


参考文献:
《统计学习方法》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容