《机器学习实战》笔记(七):Ch7 - 利用AdaBoost元算
第七章 利用AdaBoost元算法提高分类性能(代码)
-
AdaBoost算法的优缺点
-
优点: 泛化错误率低,易编码,可以应用再大部分分类器上,无参数调整。
-
缺点: 对离群点敏感。
-
使用数据类型: 数值型和标称型数据。
-
-
bagging:基于数据随机重抽样的分类器构造方法
在原始数据选择S次后得到S个数据集的一种技术。新数据集和原数据集的大小相等。每个数据集通过原始样本中随机替换得到的。
-
boosting
-
收集数据:可以使用任意方法。
-
准备数据:依赖于所使用的弱分类器类型,本章使用的是单层决策树,这种分类器可以处理任何数据类型。当然也可以使用任意分类器作为弱分类器,第2章到第6章中的任一分类器都可以充当弱分类器。作为弱分类器,简单分类器的效果更好。
-
分析数据:可以使用任意方法。
-
训练算法: Adaboost的大部分时间都用在训练上,分类器将多次在同一数据集上训练弱分类器。
-
测试算法:计算分类的错误率。
-
使用算法:同SVM一样, Adaboost预测两个类别中的一个。如果想把它应用到多个类次后别的场合,那么就要像多类SVM中的做法一样对。
-
-
训练算法:基于错误提升分类器的性能
AbaBoost算法会不断得重复训练和调整权重的过程,直到悬链错误率为0或者弱分类器的数目达到用户的制定值为止。
-
基于单层决策树构建弱分类器
-
伪代码
-
将minError设置为无穷大
-
对数据集中的每一个属性
-
对每个步长(第二层循环):
-
对每个不等号:
-
建立一棵单层决策树并利用加权数据集对其进行测试
-
如果错误率低于minError,则将当前的决策树设为最佳单层决策树
-
返回最佳单层决策树
-
-
-
根据公式构建Adaboost
-
伪代码
-
对每次迭代:
-
利用buildStump找到最佳的单层决策树
-
将最佳单层决策树加入数组
-
计算分类器系数alpha
-
计算新的权重D
-
更新累计类别估计值
-
如果错误率为0.0,跳出循环
-
-
-
例子:在一个难数据集上应用AdaBoost
-
收集数据:提供的文本文件。
-
准备数据:确保类别标签是+1和-1而非1和0。
-
分析数据:手工检查数据。
-
训练算法:在数据上,利用adaboosttrainds()画教训练出一系列的分类器。
-
测试算法:我们拥有两个数据集。在不采用随机抽样的方法下,我们就会对 Adaboost和 Logistic回归的结果进行完全对等的比较。
-
使用算法:观察该例子上的错误率。不过,也可以构建一个Web网站,让驯马师输入马的症状然后预测马是否会死去。
-
分类器数目 | 测试错误率(%) | 训练错误率(%) |
---|---|---|
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 |
不同的弱分类器数目情况下的AdaBoost测试和分类错误率。该数据集是个难数据集。通常情况下,AdaBoost会达到一个稳定的测试错误率,而不会随分类器数目的增多而提高
-
非均衡分类问题
-
其他分类性能度量指标
-
正确率
-
召回率
-
ROC曲线
-
-
-
基于代价函数的分类器决策控制
除调节分类器的阈值外,代价敏感的学习(cost-sensitive learning)也可用于处理非均衡分类。引入代价信息的方法,在AdaBoost中,可基于代价函数来调整错误权重向量D;在朴素贝叶斯中,可选择具有最小期望代价而不是最大概率的类别作为最后的结果;在SVM中,可在代价函数中对于不同的类别选择不同的参数C。这些做法会给较小类更多的权重,即在训练时,小类当中只允许更少的错误。
-
处理非均衡问题的数据抽样方法
就是对分类器的训练数据进行改造。可通过欠抽样(undersampling)和过抽样(oversampling)来实现。过抽样意味着复制样例,或者加入与已有样例相似的点(加入已有数据点的插值点,可能导致过拟合问题)。欠抽样意味着删除样例,此方法的缺点在于确定哪些样例需要进行剔除,在选择剔除的样例中可能携带了剩余样例中并不包含的有价值信息。一种解决方法,选择那些离决策边界较远的样例进行删除。
-
小节
多个分类器组合可能会进一步凸显单个分类器的不足,如过拟合问题。若多个分类器间差别显著,可能会缓解这一问题。差别可以是算法本身或者应用于算法上的数据的不同。
针对错误的调节能力是AdaBoost的长处,AdaBoost函数可以应用于任意能够处理加权数据的分类器。AdaBoost算法十分强大,它能够快速处理其他分类器难以处理的数据集。