- 转载请注明作者和出处:http://blog.csdn.net/u011475210
- 代码地址:https://github.com/WordZzzz/ML/tree/master/Ch07
- 操作系统:WINDOWS 10
- 软件版本:python-3.6.2-amd64
- 编 者:WordZzzz
基于单层决策树构建弱分类器
单层决策树(decision stump,也称决策树桩)是一种简单的决策树。前面我们已经介绍了决策树的工作原理,接下来将构建一个单层决策树,而它仅基于单个特征来做决策。
首先,需要通过一个简单数据集来确保在算法实现上一切就绪。建立adaboost.py文件并加入如下代码:
1 | #!/usr/bin/env python |
查看建立的数据集:
1 | import adaboost |
可视化结果:
接下来,构建单层决策树,伪代码如下:
1 | 将最小错误率minEroor设为无穷大 |
单层决策树生成函数代码如下:
1 | def stumpClassify(dataMatrix, dimen, threshVal, threshIneq): |
测试:
1 | from numpy import * |
上述单层决策树的生成函数是决策树的一个简化版本。它就是所谓的弱学习器,即弱分类算法。其中,weightError是AdaBoost和分类器交互的地方,大家可以留意一下。
完整AdaBoost算法的实现
完成AdaBoost算法的伪代码如下:
1 | 对每次迭代: |
代码实现如下:
1 | def adaBoostTrainDS(dataArr, classLabels, numIt = 40): |
测试如下:
1 | from imp import reload |
我们观察中间的运行结果,可以发现,第一轮迭代中,D中的所有值都相等,于是,只有第一个数据点被错分了。第二轮迭代中,D向量给第一个数据点0.5的权重。这就可以通过变量aggClassEst的符号来了解总的类别。第二次迭代之后,我们就会发现第一个数据点已经正确分类了,但最后一个数据点错分了。D向量中的最后一个元素变成0.5,而D向量中的其他值都变得非常小。最后,第三次迭代后aggClassEst所有值的符号和真实类别标签都完全吻合,那么训练错误率为0,程序就此退出。
基于AdaBoost的分类
一旦拥有了多个弱分类器以及其对应的alpha值,进行测试就变得相当容易了。现在,我们就将之前的代码应用到具体的实例上去。每个分类器的结果以其对应的alpha值作为权重。所有这些弱分类器的结果加权求和就得到了最后的结果。
代码实现:
1 | def adaClassify(datToClass, classifierArr): |
测试结果:
1 | from imp import reload |
我们可以看到,随着迭代的进行,分类结果越来越强。下面我们换个数据集。
在一个难数据集上应用AdaBoost
这次我们在之前给出的马疝病数据集上应用AdaBoost分类器,之前用的是Logistic回归。
示例:在一个难数据集上的AdaBoost应用
- 收集数据:提供的文本文件。
- 准备数据:确保类别标签是+1和-1而非1和0。
- 分析数据:手工检查数据。
- 训练算法:在数据上,利用adaBoostTrainDS()函数训练出一系列的分类器。
- 测试算法:我们拥有两个数据集。在不采用随机抽样的方法下,我们就会对AdaBoost和Logistic回归的结果进行完全对等的比较。
- 使用算法:观察该例子上的错误率。不过,这可以构建一个web网站,让驯马师输入马的症状然后预测马是否会死去。
加入我们最熟悉的代码,唯一的区别就是这次是自动识别特征数目的。
1 | def loadDataSet(fileName): |
分类结果:
1 | from imp import reload |
书上给了个表,我们直接来看表格数据:
Number of Classifiers | Training Error | Test Error |
---|---|---|
1 | 0.28 | 0.27 |
10 | 0.23 | 0.24 |
50 | 0.19 | 0.21 |
100 | 0.19 | 0.22 |
500 | 0.16 | 0.25 |
1000 | 0.14 | 0.31 |
10000 | 0.11 | 0.33 |
我们发现,测试错误率在到达一个最小值之后又开始上升了。这类现象就是过拟合(overfitting)。有文献称,对于表现好的数据集,AdaBoost的测试错误率就会达到一个稳定值,并不会随着分类器的增多而上升。但是别忘了,我们这个数据集可是有百分之三十的缺失值哦。
很多人认为,AdaBoost和SVM是监督机器学习中最强大的两种方法。实际上,这两者之间拥有不少相似之处。我们可以把弱分类器想象成SVM中的一个核函数,也可以按照最大化某个最小间隔的方式重写AdaBoost算法。而他们的不同之处在于所定义的间隔计算方式有所不同。因此导致的结果也不同。特别是在高位空间下,这两者之间的差异就会更加明显。
至此,分类算法部分全部介绍完了,之后的回归、无监督学习等等,有机会了再更吧。
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz