基于单层决策树的adaBoost算法思想分析和源代码解析

基于单层决策树的AdaBoost算法思想分析和源代码解析

前言:

上一篇SVM可是废了我好鼻子劲,这一篇咱们来点愉快的东西。我们一定听说过这句俗语:“三个臭皮匠,顶个诸葛亮!” 大致意思就是三个能力一般的人加起来,也能抵得上一个能力很强的人。通俗意思就是人多力量大。没错,今天咱们所说的这个算法,就是利用这三个臭皮匠,去替代这个诸葛亮。
源码已上传到GitHub上,有需要的小伙伴自取:源码地址,如果有帮到你,不要吝啬你的小⭐⭐

算法原理故事:

在很久以前,有一个皇帝,由于要去邻国去洽谈生意,需要找一个武功高强、知识渊博、善于言谈的人,来跟随自己去,以此来体现本国人才济济,增加胜算。

皇帝派人贴出告示,重金求赏这么一个人才。果真,不久,便来了一个人前来面试。经过考核,此人各项能力都满足我们的要求,于是打算任用他。但是此人野心很大,深知在本国找不出第二个有如此能力之人,就狮子大张口,不仅要求皇帝给出黄金万两、而且还有当个官。皇帝自然不乐意了,给朕服务是你的荣幸,拿由得你来给朕谈条件,拖出去,斩了!die。。。。

眼看着马上就要启程了,除了上次那个人,还是没有人来面试,皇帝很着急,就在早朝询问大臣们的意见。其中有一个大臣说到,的却找到这样综合实力非常强的人比较难,那么,我们可以多去找一些人,有很多人会符合其中的某一项。皇帝连连点头。便再次贴出告示,分别寻找具有这些品质的人。

果真不久,就来了三个人,这里暂时命名为A,B,C,说自己在某一个或某两个方面比较擅长,其他方面不太擅长。为了考核A,皇帝出了一套考卷(情节需要,可能不太合适,见谅),用来检测A的能力。该试卷分为三部分,每一部分是50分。

A人在武功方面很优秀,拿到了满分50分,但后两项不太行,都只拿到了25分。

接下来,皇上将试卷做了修改,将武功方面的分数改成了30分,后两项各加了10分。

皇帝拿着改完的试卷,来考察B人。

B人在知识方面非常优秀,拿到了满分60分,但是其他两项稍显薄弱,分别拿到了20和30分

皇帝看到这种情况,立即对试卷又做了修改,将考察言谈的部分增加到了80分,其他两项个35分。

皇帝拿着这套试卷去考察C人。

C人在言谈方面可所谓相当优秀了,拿到了75分的超高分,其他两项也都拿到了25分。

皇帝对于这三个人非常满意,都在某一项能力中有出众的表现。并针对他们在测试中的分数表现,对于他们的信任程度,也是不一样的,其中对于C人的信任度最高。

最后皇帝带着这三个人去谈判,顺利的谈成了生意。

算法原理解读

上面这个故事我不知道大家看的怎么样, 如果你完整的看下去了,那么,恭喜你,对于本篇adaBoost算法的原理你已经明白了!什么?这么容易? 没错,不信接着看!

我前面也总结了几个机器学习的分类算法,怎么说呢,精度越高,其算法就越复杂。业界公认最好的分类模型SVM支持向量机,我硬是磨了快两个月才弄个差不多。

也就是精度比较弱的分类器的实现要比精度高的分类器实现起来要简单很多,不信让你写个SVM和让你写个线性回归,你试试?

而几个弱分类器经过组合,他们可以组成一个强分类器。是不是有点臭皮匠顶诸葛亮的味儿了。

1. 弱分类器-单层决策树

这里,我们使用的弱分类器为单层决策树。决策树它是按照其属性分类后信息熵的变化来选择决策树的枝干的。这里我们只是使用一层,也就是只针对一个属性来进行。

总的思路如下:

  1. 循环数据集中的每一个特征(第一层循环):
    1. 对于每个步长(第二层循环):
      1. 对于每个不等号(第三层循环):
        1. 建立一个单层决策树并利用加权数据集对它测试
        2. 如果错误率抵御minError(初始值为无穷大),则将当前单层决策树设为最佳单层决策树
  2. 返回单层决策树

看不懂没关系,咱们举个例子:

我们手上有五个数据,数据详情如下:

x1(属性) x2(属性) y(类别)
1 2 -1
3 1 1
2 4 1
3 2 1
1 3 -1

我们需要提前初始化数据权值向量D(0.2,0.2,0.2,0.2,0.2),使其总和为1即可。

咱们看第一层循环,第一层循环是对属性的循环,首先对属性x1进行循环

我们设定的步数为10,步长=(max(x1)-min(x1))/10=0.2

也就是对于第二步循环,我们需要循环11次,从小于最小值开始【(1-0.2)~ (1+10*0.2)】。

然后进入第三层循环,这一循环是对于每个不等式:这个怎么理解呢,在我们第二步中,每增加一次循环,其步长都会加1,这样的目的就是为了让我们能够将小于这个值的分为一类,大于这个值的分为另一类。由于不知道小于这个值应该分为哪一类,那我们都进行尝试,所在在这个不等式循环中,需要循环两次,用来处理这种情况。

假设我们循环到第二步的第六个步长了,当前值为1+6x0.2=2.2.我们在第三层循环中,先将小于2.2的值归为-1类,那么剩下的归为1类。此时,我们统计与源标签不一致的情况,对照原数据,我们发现第三个属性值为(2,4)的数据标签出现了点问题。我们就计算错误值=出错的数据对应的权值之和=0.2

所以,第三步的第一次循环中,我们所采用的单层决策树的错误值为0.2.

在第三步的另一个循环中,我们将小于2.2的值归为1类,剩下的归为-1类,此时出错的数据有4个,那么对应的错误值为0.8.

每次循环我们都会记录当前错误值最小的单层决策树,直到所有循环完毕,将返回错误值最小的单层决策树。

2. 单层决策树AdaBoost算法完整思路

从上面那一步,我们能够获得当前数据权值D下的最佳单层决策树,那么,这一部分呢,我们就会对相关参数进行迭代优化。

此步步骤大致如下:

  1. 对每次迭代:
    1. 利用1方法找到最佳的单层决策树
    2. 将最佳单层决策树加入到单层决策树数组
    3. 计算alpha
    4. 计算新的权值向量D
    5. 更新累计类别估计值
    6. 如果错误率等于0,退出循环

上述方法中,alpha是这些选出来的单层决策树的权值,也就是对最终结果的话语权。咱们拿出前面讲的故事,来这些步骤进行一一对应。

我们的目的,就是完美无误的将数据分类完毕<---->皇帝需要找一个武功高强、知识渊博、善于言谈的高人辅助自己完成生意谈判。

迭代中:

方法1找到的最佳单层决策树<---->皇帝发现A人在武功方面很优秀,就留了下来。

计算alpha<---->皇帝根据其测试的成绩,成绩越高,皇帝越信任他。

计算新的权值向量D,也就是提高这个决策树分类错误的数据权值<---->皇帝在测试完A人之后,提高了知识和言谈的所占分数。

更新累计类别估计值<----->当前所获人才水平

错误率为0<----> 皇帝对当前的人才水平非常满意,已达到期望值,可以前去谈判生意。

如果还有不明白的地方,我就用我的理解再陈述一下吧:

此方法就是通过寻找当前数据权值下,对数据分类表现最好的弱分类器,并且根据这个弱分类器分类错误的数据,提到其对应的数据权值,以此来找到能对上一个分类器分类错误的数据有很好表现得分类器。这样就能够达到缺什么补什么,后者优势补前者劣势的情况。

算法公式

数据集:

img

初始化数据权值分布:

img

使用具有权值分布Dm训练数据集,得到基本分类器Gm(x):

img

计算Gm(x)在训练数据集上的分类误差率:

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值