文档章节

Weka开发[14]-AdaBoost源代码介绍

pior
 pior
发布于 2015/10/20 20:28
字数 686
阅读 145
收藏 1

这一次讲的是Ensemble的东西,一位读者希望我讲一下Adaboost的内容,这种Ensemble看起来的确比较吓人,推荐一篇论文:Ensemble Based Systems in Decision Making. 在这里所有理论的东西我就不介绍了。

与以往一样,先看buildClassifier函数(我在函数中将不重要的代码全部去掉):

super.buildClassifier(data);

if ((!m_UseResampling)&& (m_Classifier instanceof WeightedInstancesHandler)) {

       buildClassifierWithWeights(data);

} else {

       buildClassifierUsingResampling(data);

}

Adaboost类继承自RandomizableIteratedSingleClassifierEnhancer类,再看一下这个类的buildClasssifier函数内容:

m_Classifiers = Classifier.makeCopies(m_Classifier, m_NumIterations);

这句话是产生m_NumIterations个基分类器。

接下来的是判断是否用Resampling方法,这个先不讲,直接看下面的函数,先讲buildClassifierWithWeights这个函数,代码太长了,我分开讲:

// Select instances to train the classifier on

if (m_WeightThreshold < 100) {

       trainData = selectWeightQuantile(training,(double) m_WeightThreshold / 100);

} else {

        trainData = new Instances(training, 0, numInstances);

}

最上面那个循环m_Classifiers.length次的循环没有粘,这一段话也没什么意思,就是说先多少样本训练,默认的是100,不是100的时候用selectWeightQuantile函数,这个函数是根据样本权重的比例来选择的,它先根据权重对样本进行排序,再选择样本。如果是默认值,那么当然是选择全部样本。

// Build the classifier

if (m_Classifiers[m_NumIterationsPerformed] instanceof Randomizable)

        ((Randomizable) m_Classifiers[m_NumIterationsPerformed])

              .setSeed(randomInstance.nextInt());

m_Classifiers[m_NumIterationsPerformed].buildClassifier(trainData);

    有的分类器是一个Randomizable实例,那么就给它设置种子,然后训练一个分类器。

    // Evaluate the classifier

    evaluation = new Evaluation(data);        

    evaluation.evaluateModel(m_Classifiers[m_NumIterationsPerformed],training);

    epsilon = evaluation.errorRate();

 

    // Stop if error too small or error too big and ignore this model

    if (Utils.grOrEq(epsilon, 0.5) || Utils.eq(epsilon, 0)) {

       if (m_NumIterationsPerformed == 0) {

           // If we're the first we have to to use it

           m_NumIterationsPerformed = 1;

        }

       break;

    }

    这一段,看过论文的人应该比较清楚是什么意思,这里也就不解释了。

    // Determine the weight to assign to this model

    m_Betas[m_NumIterationsPerformed] = Math.log((1 - epsilon)/ epsilon);

    reweight = (1 - epsilon) / epsilon;

 

    // Update instance weights

    setWeights(training, reweight);

    第一行代码对应我刚才讲的论文的图5中的公式15,第二句对应公式13,最后一句对应公式14,下面详细讲一下:

    oldSumOfWeights = training.sumOfWeights();

    Enumeration enu = training.enumerateInstances();

    while (enu.hasMoreElements()) {

       Instance instance = (Instance) enu.nextElement();

       if (!Utils.eq(m_Classifiers[m_NumIterationsPerformed].

           classifyInstance(instance), instance.classValue()))

           instance.setWeight(instance.weight() * reweight);

    }

 

    // Renormalize weights

    newSumOfWeights = training.sumOfWeights();

    enu = training.enumerateInstances();

    while (enu.hasMoreElements()) {

       Instance instance = (Instance) enu.nextElement();

       instance.setWeight(instance.weight() * oldSumOfWeights / newSumOfWeights);

    }

这段代码也是adaboost的核心了,这个函数就是重新计算每个样本的权重,第一个if是判断是否分类错误,如果分类错误,就在原来的权重上乘上reweight(这地方我还有点不清楚,原论文上应该是分类正确了乘上reweight,公式14)。

底下的那部分代码就是重新归一化权重,没什么特别的。至于另一个函数buildClassifierUsingResampling,想想还是不讲了,与这个函数比较也没什么特别的地方。


本文转载自:

共有 人打赏支持
pior
粉丝 26
博文 151
码字总数 22496
作品 0
济南
高级程序员
私信 提问
Weka 中的算法名说明

数据输入和输出 WOW():查看Weka函数的参数。 Weka_control():设置Weka函数的参数。 read.arff():读Weka Attribute-Relation File Format (ARFF)格式的数据。 write.arff:将数据写入Weka ...

pior
2015/10/17
304
0
Weka manual 3.6翻译: 1.1 简介

第一章 Weka命令行入门 1.1简介 在最初的实验,Weka所包含的图形用户界面是相当足够,若深入使用则建议使用命令行界面,因为它提供了一些功能(这些功能在图形用户界面下不可用) - 并使用少...

Honghe
2012/11/24
0
0
Mahout:并行创建决策树

几个月前,我写了一篇博客,描述了我们在 Kaggle Digit Recogniser Problem(译注:Kaggle是一个数据竞赛的在线平台,KDD2011便是由腾讯和Kaggle合作)中对基于 Mahout的随机森林(译注:一种决...

oschina
2013/01/06
1K
0
Weka 开发[1]-Instances类

言归正传,开始介绍Weka,先google一下,把Weka软件下载下来,在Weka的目录中有一个weka.jar的包。 把包添加到工程中后,就可以调用weka中的函数了。 再介绍一点weka的基本知识,在weka的目录...

pior
2015/10/17
217
0
Weka开发[5]-半监督算法

这次介绍一个我现在正在做的半监督算法,因为我只是提出一个框架,半监督算法只是一个工具,可是为了找这个工具也让我花了不少功夫。现在介绍的暂时不是Weka的一部分,但开发者是waikato大学...

pior
2015/10/17
46
0

没有更多内容

加载失败,请刷新页面

加载更多

iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码

iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 程序员取悦女票的正确姿势---Tip1(iOS美容篇) iOS 前台重启应用和清除角标的问题 微信原生提醒对话框3.0 JHLikeButton - 有趣...

Android爱开源
6分钟前
0
0
Yii2使用驼峰命名的形式访问控制器

yii2在使用的时候,访问控制器的时候,如果控制器的名称是驼峰命名法,那访问的url中要改成横线的形式。例如: public function actionRoomUpdate(){//}//访问的时候就要www.test.co...

dragon_tech
9分钟前
0
0
Navicat使用教程:使用Navicat Query Analyzer优化查询性能(第2部分)

下载Navicat Monitor最新版本 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona ...

电池盒
16分钟前
0
0
Python3 读写utf-8文本文件

with open('testRead.txt', 'r', encoding='utf-8') as f: for each_line in f: Passwith open('testWrite.txt', 'w', encoding='utf-8') as f: f.write('写入的内容'......

编程老陆
19分钟前
0
0
Linux syslog相关函数详解

介绍 syslog是Unix系统的日志系统。可以将日志记录在本地系统中。 一个完整的syslong日志包含如下信息:程序模块 | 严重性 | 时间 | 主机名 | 进程名 | 进程ID | 正文。 syslong相关函数 1....

RongJinhui0
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部