Weka AdaBoost

上传人:飞*** 文档编号:4712884 上传时间:2017-08-23 格式:DOCX 页数:10 大小:38.88KB
返回 下载 相关 举报
Weka AdaBoost_第1页
第1页 / 共10页
Weka AdaBoost_第2页
第2页 / 共10页
Weka AdaBoost_第3页
第3页 / 共10页
Weka AdaBoost_第4页
第4页 / 共10页
Weka AdaBoost_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Weka AdaBoost》由会员分享,可在线阅读,更多相关《Weka AdaBoost(10页珍藏版)》请在金锄头文库上搜索。

1、 Weka 算法Classifier-meta-AdaBoostM1 源码分析(一)多分类器组合算法简单的来讲常用的有 voting,bagging 和 boosting,其中就效果来说 Boosting 略占优势,而 AdaBoostM1 算法又相当于Boosting 算法的“ 经典款 ”。Voting 思想是使用多分类器进行投票组合,并按照少数服从多数(大多数情况)来决定最终的分类,缺点是少数服从多数的规则往往只能避免达到最差的情况却也很难达到最少的情况。Bagging 思想是有放回的随机抽样来训练多个分类器,最后使用 voting来进行投票决策,经典算法如 RandomForest(之前

2、也有博客分析过),缺点是要求各基分类器同构,并且从精度上来讲 Bagging 并不是一个明显提高精度的算法,而是一个防止过拟合的算法。Boosting 是使用级联训练分类器,使得“下一级 ”分类器更加重视“上一级”分错的数据,最后把各分类器结果加权组合来进行决策,缺点是需要级联训练因此算法难于并行化。比较经典的算法如 AdaBoostM1、GBDT 。一、算法算法部分简单说一下,并不做详细的形式化描述及相关理论正确性的证明,参考资料来自于 wikihttp:/zh.wikipedia.org/wiki/AdaBoost算法过程:(1)初始化训练集各实例权重为 1/k(假设总共 k 个用例)(2

3、)for i=1;i 0.5,所以 w1),对于分类错误的实例,原训练集中的权重乘以 w(即调高权重)。(9)归一化训练集权重(缩小一定倍数使和为 1)(10 )回到 2可以看到,根据这个算法,第四步训练得到了基分类器,每个基分类器都会在第七部得到一个权重,最后进行分类预测的时候就根据每个基分类器的结果进行加权投票得到最终的结果。二、实现在分析每个分类器的时候,我们都从 buildClassifier 入手,这次也不例外。java view plaincopy1. public void buildClassifier(Instances data) throws Exception 2. 3

4、. super.buildClassifier(data);/weka 里面有个工具是可以从一个分类器以深度拷贝的方式新建一个分类器,而 adaboostm1 作为一个多分类器的 combine,这个深度拷贝必须要拷贝每一个基分类器,这个就是在 super 类中实现的。 4. 5. / 看看这个数据能否用 adaboost 来分类,从代码来看,只能处理枚举类型,但我认为这个应该是由基分类器能力决定的。 6. getCapabilities().testWithFail(data); 7. 8. / 预处理 9. data = new Instances(data); 10. data.dele

5、teWithMissingClass(); 11. 12. / 如果只有一个属性列,当然也就是分类本身的属性,这时没法使用任何复杂分类方法,就只是用 mZero 模型,mZero 模型简单的返回枚举值中出现最多的值。 13. if (data.numAttributes() = 1) 14. System.err.println( 15. Cannot build model (only class attribute present in data!), 16. + using ZeroR model instead!); 17. m_ZeroR = new weka.classifiers

6、.rules.ZeroR(); 18. m_ZeroR.buildClassifier(data); 19. return; 20. 21. else 22. m_ZeroR = null; 23. 24. 25. m_NumClasses = data.numClasses(); 26. if (!m_UseResampling) & 27. (m_Classifier instanceof WeightedInstancesHandler) 28. buildClassifierWithWeights(data);/如果基分类器本身就是一个权重敏感的分类器,那么就不需要使用重抽样,否则使用

7、重采样方法,常见的权重敏感的分类器的实现有很多,比如之前介绍过的 J48,RandomTree,RandomForest,Bagging 等。 29. else 30. buildClassifierUsingResampling(data);/否则使用重抽样的方法。 31. 32. 三、基分类器AdaBoostM1 使用的默认基分类器是 weka.classifiers.trees.DecisionStump,名字直译过来就是决策桩(这什么名字?!),其分类方法类似于 ID3 算法的节点分裂算法,如果是枚举型的,遍历所有属性,选出其中一个属性,使使用该属性进行分类后的熵增益最大,如果是数值型

8、的,选择一个节点做二分,使分类后方差最小。但和决策树不同的是,并不做递归的树生长,只做一次节点选择并分裂(所以叫桩而不是树)。这个基分类器大体思路就是这样,代码较简单并且没有什么巧妙的算法思想,故不做具体分析。四、buildClassifierWithWeight上篇文章分析主流程的时候,可以看到最后主流程最后把训练过程委派给了buildClassifierWithWeight 和 buildClassifierUsingResampling,先来分析一下buildClassifierWithWeightview sourceprint?01.protected void buildClass

9、ifierWithWeights(Instances data)02.throws Exception 03. 04.Instances trainData, training;05.double epsilon, reweight;06.Evaluation evaluation;07.int numInstances = data.numInstances();08.Random randomInstance = new Random(m_Seed);09. 10./ /初始化11.m_Betas = new double m_Classifiers.length;12.m_NumIter

10、ationsPerformed = 0;13. 14./ 从直观认识上讲,算法训练模型的时候,不应该改变训练数据或者把训练集弄脏,因此需要做一个Instances 的深度拷贝。15.training = new Instances(data, 0, numInstances);16. 17./ 主循环,boosting 使用的基分类器数量就是 m_Classifiers 数组长度。18.for (m_NumIterationsPerformed = 0; m_NumIterationsPerformed 必须选择弱分类器,可以预见到,如果是一个强分类器(如REPTree 和不剪枝的 J48),

11、导致数据过拟合,这里得到的 errorRate 就为 0,进而直接退出迭代。37.evaluation = new Evaluation(data);38.evaluation.evaluateModel(m_Classifiersm_NumIterationsPerformed, training);39.epsilon = evaluation.errorRate();40. 41./ 如果错误率大于 0.5(那还分个毛。),或者错误率是 0(完全分类),就退出。42.if (Utils.grOrEq(epsilon, 0.5) | Utils.eq(epsilon, 0) 43.if (

12、m_NumIterationsPerformed = 0) 44.m_NumIterationsPerformed = 1; / If were the first we have to to use it45.46.break;47.48./ 设置此基分类器的权重,并且重新设置整个训练集中各用例的权重49.m_Betasm_NumIterationsPerformed = Math.log(1 - epsilon) / epsilon);50.reweight = (1 - epsilon) / epsilon;51.if (m_Debug) 52.System.err.println( e

13、rror rate = + epsilon53.+ beta = + m_Betasm_NumIterationsPerformed);54.55. 56./ 下面这个函数做了两个事:1、对于 training 里分错的对象,让其权重乘以 reweight,即提高了权重 2、du 对训练集所有权重进行归一化,使之和为 1(即稍微同比缩小一点)57.setWeights(training, reweight);58.59.可以看到,此函数并没有对训练集根据权重进行重抽样,因为基分类器自身就是权重敏感的分类器。但是从设计的角度来吐个槽的话,个人认为这并不是一个非常好的设计,AdaBoostM1类作

14、为一个基分类器的 wrapper,必须对整个训练及分类结果负责,并不能因为基分类器 “仅仅实现了权重敏感接口”就完全信任其权重敏感的操作,再从算法本身的角度来讲,实现“ 权重敏感” 的逻辑本身就是 AdaBoostM1 算法的一部分,不应委派给基分类器去做。五、buildClassifierUsingResamplingview sourceprint?01.protected void buildClassifierUsingResampling(Instances data)02.throws Exception 03. 04.Instances trainData, sample, tr

15、aining;05.double epsilon, reweight, sumProbs;06.Evaluation evaluation;07.int numInstances = data.numInstances();08.Random randomInstance = new Random(m_Seed);09.int resamplingIterations = 0;10. 11./ 初始化所有基分类器的权重数组,迭代次数等。12.m_Betas = new double m_Classifiers.length;13.m_NumIterationsPerformed = 0;14./ 深度拷贝训练集15.training = new Instances(data, 0, numInstances);16.sumProbs = training.sumOfWeights();17.for (int i = 0; i training.numInstances(); i+) 18.training.instance(i).setWeight(training.instance(i).19.weight() / s

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号