Weka算法Classifier-meta-AdaBoostM1源代码分析(一)
多分类器组合算法简单的来讲经常使用的有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源代码分析(一)的更多相关文章
- OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析
1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...
- STL源代码分析——STL算法remove删除算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...
- STL源代码分析——STL算法merge合并算法
前言 因为在前文的<STL算法剖析>中.源代码剖析许多.不方便学习.也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的merge合并算法. ...
- STL源代码分析——STL算法sort排序算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...
- K-近邻算法的Python实现 : 源代码分析
网上介绍K-近邻算法的样例非常多.其Python实现版本号基本都是来自于机器学习的入门书籍<机器学习实战>,尽管K-近邻算法本身非常easy,但非常多刚開始学习的人对其Python版本号的 ...
- Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程
1 初始加入设备后.上传Object的详细流程 前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令: •swift-ring-builder obj ...
- Weka算法算法翻译(部分)
目录 Weka算法翻译(部分) 1. 属性选择算法(select attributes) 1.1 属性评估方法 1.2 搜索方法 2. 分类算法 2.1 贝叶斯算法 2.2 Functions 2.3 ...
- 机器学习:eclipse中调用weka的Classifier分类器代码Demo
weka中实现了很多机器学习算法,不管实验室研究或者公司研发,都会或多或少的要使用weka,我的理解是weka是在本地的SparkML,SparkML是分布式的大数据处理机器学习算法,数据量不是很大的 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
随机推荐
- Ubuntu安装配置Charles,抓取http网络请求包
http://blog.csdn.net/lylddinghffw/article/details/75322262
- 07Oracle Database 数据表
Oracle Database 数据表 DDL 数据定义语言 - 建立数据库对象 create /alter/ drop/ truncate 创建表 Create table table_name( ...
- Oracle 把一个用户所有表的读权限授予另一个用户
create user <USER_NAME> identified by <PASSWORD>; grant create session TO <USER_NAME& ...
- linux 系统 UDP 丢包问题分析思路
转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...
- block教程
http://pernghh.pixnet.net/blog/trackback/eac87d412e/33563409 本文来自台湾的某开发人员的博客,被墙,感觉讲的比较易懂,所以引过来.文字简体化 ...
- new实现
前言 本篇来分析new是怎么实现的, 使用c++进行在申请对象的时候用到new, 但是为什么申请对象要用到new, 而不能用malloc, 而有时申请数组的用new或者malloc似乎又都可以, 这里 ...
- libevent reference Mannual II--library
FYI: http://www.wangafu.net/~nickm/libevent-book/TOC.html The Libevent Reference Manual: Preliminari ...
- Vim常用快捷键--正常的学习曲线
vim可能对于初学者不太友好,学习曲线有点陡,特此整理了较为平滑的学习曲线的学习快捷键的方式,包含最常用的快捷键,让初学者领悟vim的优点,想要进阶学习请查找其它更好的教程 正常模式:可以使用快捷键命 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- vim基础(一)
今天看了下兄弟连的VIM讲解,又学了几个新命令,记录一下. 插入与删除 插入 首先还是插入,以前只知道i.今天发现原来还有a\A\i\I\o\O,下面具体说一下: 命令 含义 a 在光标后插入 A 在 ...