多分类器组合算法简单的来讲经常使用的有voting,bagging和boosting,当中就效果来说Boosting略占优势,而AdaBoostM1算法又相当于Boosting算法的“经典款”。

Voting思想是使用多分类器进行投票组合。并依照少数服从多数(大多数情况)来决定终于的分类。缺点是少数服从多数的规则往往仅仅能避免达到最差的情况却也非常难达到最少的情况。

Bagging思想是有放回的随机抽样来训练多个分类器,最后使用voting来进行投票决策。经典算法如RandomForest(之前也有博客分析过)。缺点是要求各基分类器同构。而且从精度上来讲Bagging并非一个明显提高精度的算法,而是一个防止过拟合的算法。

Boosting是使用级联训练分类器,使得“下一级”分类器更加重视“上一级”分错的数据。最后把各分类器结果加权组合来进行决策。缺点是须要级联训练因此算法难于并行化。比較经典的算法如AdaBoostM1、GBDT。

一、算法

算法部分简单说一下,并不做具体的形式化描写叙述及相关理论正确性的证明,參考资料来自于wiki

http://zh.wikipedia.org/wiki/AdaBoost

算法过程:

(1)初始化训练集各实例权重为1/k(如果总共k个用例)

(2)for i=1;i <=m ; i++ (如果总共基分类器的个数是m)

(3)将训练集依据权重进行重採样。得到新训练集

(4)依据新训练集训练基分类器i

(5)评測该基分类器准确率r

(6)假设准确率r小于50%。直接退出。训练失败(这里指的是二值分类情况。多值分类类似扩展)

(7)设置基分类器i权重为log2(1-r/r)

(8)w=1-r/r(由于r>0.5,所以w>1)。对于分类错误的实例。原训练集中的权重乘以w(即调高权重)。

(9)归一化训练集权重(缩小一定倍数使和为1)

(10)回到2

能够看到,依据这个算法,第四步训练得到了基分类器,每一个基分类器都会在第七部得到一个权重。最后进行分类预測的时候就依据每一个基分类器的结果进行加权投票得到终于的结果。

二、实现

在分析每一个分类器的时候,我们都从buildClassifier入手,这次也不例外。

public void buildClassifier(Instances data) throws Exception {

    super.buildClassifier(data);//weka里面有个工具是能够从一个分类器以深度拷贝的方式新建一个分类器,而adaboostm1作为一个多分类器的combine,这个深度拷贝必需要拷贝每个基分类器,这个就是在super类中实现的。

    // 看看这个数据是否能用adaboost来分类,从代码来看,仅仅能处理枚举类型,但我觉得这个应该是由基分类器能力决定的。
getCapabilities().testWithFail(data); // 预处理
data = new Instances(data);
data.deleteWithMissingClass(); // 假设仅仅有一个属性列,当然也就是分类本身的属性。这时没法使用不论什么复杂分类方法。就仅仅是用mZero模型,mZero模型简单的返回枚举值中出现最多的值。
if (data.numAttributes() == 1) {
System.err.println(
"Cannot build model (only class attribute present in data!), "
+ "using ZeroR model instead!");
m_ZeroR = new weka.classifiers.rules.ZeroR();
m_ZeroR.buildClassifier(data);
return;
}
else {
m_ZeroR = null;
} m_NumClasses = data.numClasses();
if ((!m_UseResampling) &&
(m_Classifier instanceof WeightedInstancesHandler)) {
buildClassifierWithWeights(data);//假设基分类器本身就是一个权重敏感的分类器,那么就不需要使用重抽样,否则使用重採样方法,常见的权重敏感的分类器的实现有非常多。比方之前介绍过的J48,RandomTree。RandomForest,Bagging等。
} else {
buildClassifierUsingResampling(data);//否则使用重抽样的方法。 }
}

(未完待续)

Weka算法Classifier-meta-AdaBoostM1源代码分析(一)的更多相关文章

  1. OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析

    1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...

  2. STL源代码分析——STL算法remove删除算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...

  3. STL源代码分析——STL算法merge合并算法

    前言 因为在前文的<STL算法剖析>中.源代码剖析许多.不方便学习.也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的merge合并算法. ...

  4. STL源代码分析——STL算法sort排序算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...

  5. 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

    首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...

  6. K-近邻算法的Python实现 : 源代码分析

    网上介绍K-近邻算法的样例非常多.其Python实现版本号基本都是来自于机器学习的入门书籍<机器学习实战>,尽管K-近邻算法本身非常easy,但非常多刚開始学习的人对其Python版本号的 ...

  7. Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程

    1 初始加入设备后.上传Object的详细流程  前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令: •swift-ring-builder obj ...

  8. Weka算法算法翻译(部分)

    目录 Weka算法翻译(部分) 1. 属性选择算法(select attributes) 1.1 属性评估方法 1.2 搜索方法 2. 分类算法 2.1 贝叶斯算法 2.2 Functions 2.3 ...

  9. 机器学习:eclipse中调用weka的Classifier分类器代码Demo

    weka中实现了很多机器学习算法,不管实验室研究或者公司研发,都会或多或少的要使用weka,我的理解是weka是在本地的SparkML,SparkML是分布式的大数据处理机器学习算法,数据量不是很大的 ...

  10. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

随机推荐

  1. 总结esp8266刷Python的完整的步骤(终极总结)

    2018-04-0319:12:02 从玩microPython 到现在,一路荆棘一路坎坷. 不知道只有我遇到这样的问题还是microPython太不稳定,还是我买的板子太糙.总之遇到了太多问题了. ...

  2. Qt 5.8.3 部署/添加 Crypto++第三方库(5.6.5版本)

    首先,Qt没有封装加解密算法库(其实有个哈希函数的函数).介于OpenSSL函数封装不友好,以及先前爆发的心脏滴血漏洞广受诟病,我们考虑在C++上使用一种新的,并且封装友好的,OOAD程度更高的加解密 ...

  3. swift extension 的最终目的是结合

    与数据结合:对数据进行操作: 与行为结合:使用原有行为生成更便捷的行为: 与协议结合:实现协议: 与类型结合:对类型数据进行操作,添加新的行为: 与关联类型.泛型结合:对类型做出限定.

  4. day16-常用模块I(time、datetime、random、os、sys、json、pickle)

    目录 time模块 datetime模块 random模块 os模块 sys模块 json模块与pickle模块 json pickle time模块 time模块一般用于不同时间格式的转换,在使用前 ...

  5. 使用SELECT语句检索数据

    使用SELECT语句检索数据select指令适用于SQL数据库SELECT 语句用于从数据库中选取数据.(指令不分大小写,选择的值除名字和一些有特殊意义的字符可不分大小写,from结束时一定要加;) ...

  6. vivo手机执行input命令提示killed

    异常现象: 使用vivo手机时发现通过inputManager发送按键.执行屏幕滑动等动作失效,相关API并没有任何异常抛出,继续跟踪发现shell控制台执行input进行屏幕滑动.发送文本.模拟按键 ...

  7. Don't make me think [读书笔记] [思维导图]

      <Don't make me think>第3版 内容:解析用户心理,在用户模式.扫描设计.导航设计.主页布局.可用性测试,提出了许多的独到观点及建议. 特色:语言轻松.实在.配有许多 ...

  8. C++字符串处理函数总结

    1.基础函数输入输出:cin,cout,getchar,gets,putchar,puts,printf,scanf格式化:sprintf,sprintf_s,wsprintf,wsprintf_s, ...

  9. <MyBatis>入门七 缓存机制

    缓存机制 MyBatis包含强大的查询缓存特性,它可以非常方便的定制和配置.缓存可以极大的提升查询效率. MyBatis默认定义了两级缓存:一级缓存和二级缓存 1.默认情况下,只有一级缓存(sqlSe ...

  10. Python学习-比较运算符和逻辑运算符

    比较运算符 == 等于 - 比较对象是否相等 print(3 == 4); //False != 不等于 - 比较两个对象是否不相等 print(3 != 4); // True    <> ...