多分类器组合算法简单的来讲经常使用的有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. Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1

    记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...

  2. oracle创建临时表空间、用户表空间、创建用户关联表空间、授权等

    1.创建临时表空间 CREATE TEMPORARY TABLESPACE test_temp TEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test ...

  3. JS函数assign

    Object函数提供了一个叫做assign的函数,用来合并多个对象. Object.assign(...): 你可以传递多个对象给该函数,这些对象中的自有且可枚举的属性,会被拷贝给第一个对象. var ...

  4. luogu P4172 [WC2006]水管局长 LCT维护动态MST + 离线

    Code: #include<bits/stdc++.h> #define maxn 1200000 #define N 120000 using namespace std; char ...

  5. Django - 模版之继承

    模版继承: 当多个html有共同之处时,需要建立一个模版html(master.html) 1.在模版html中,写入公共的部分: 备注:在模版中,我们可以指定多个block ,其中,可以在标题,cs ...

  6. 数组--P1980 计数问题

    题目描述 题解 试计算在区间 1 到 n的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1到 11中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 ...

  7. 常量、变量;基本数据类型;input()、if、while、break、continue

    一.编译型语言和解释型语言区别:编译型:一次性将所有程序编译成二进制文件 缺点:开发效率低,不能跨平台 优点:运行速度快. 例如:C,C++等解释型:当程序执行时,一行一行的解释 优点:开发效率高,可 ...

  8. 【转】精选十二款餐饮、快递、票务行业微信小程序源码demo推荐

    微信小程序的初衷是为了线下实体业服务的,必须有实体相结合才能显示小程序的魅力.个人认为微信小程序对于餐饮业和快递业这样业务比较单一的行业比较有市场,故整理推荐12款餐饮业和快递业微信小程序源码demo ...

  9. array copy rotate in Pointwise

    goal: # # Copyright 2010 (c) Pointwise, Inc. # All rights reserved. # # This sample Pointwise script ...

  10. atCoder Ants on a Circle(又是蚂蚁问题。。。)

    atCoder Ants on a Circle(又是蚂蚁问题...) 传送门 题意:一个圈,蚂蚁在上面以相同的速度和不同的方向走,问t秒后它们各自的位置. 解法:和经典的蚂蚁问题一致,把相撞的情况看 ...