Weka算法Classifier-meta-AdaBoostM1源码分析(二)

AdaBoost.M1算法 1. 算法思想         AdaBoost.M1算法是基于AdaBoost算法的一个改进版本,当然还有第二个,称之为AdaBoost.M2算法,两种算法详情请参阅论文《Experiments with a New Boosting Algorithm》。         最早的AdaBoost算法是一种二分类算法,类标签为{+1,-1},该算法计算基分类器的分类误差率和权重参数都是基于此... 阅读详情


三、基分类器

AdaBoostM1使用的默认基分类器是weka.classifiers.trees.DecisionStump,名字直译过来就是决策桩(这什么名字?!),其分类方法类似于ID3算法的节点分裂算法,如果是枚举型的,遍历所有属性,选出其中一个属性,使使用该属性进行分类后的熵增益最大,如果是数值型的,选择一个节点做二分,使分类后方差最小。

但和决策树不同的是,并不做递归的树生长,只做一次节点选择并分裂(所以叫桩而不是树)。

这个基分类器大体思路就是这样,代码较简单并且没有什么巧妙的算法思想,故不做具体分析。


四、buildClassifierWithWeight

上篇文章分析主流程的时候,可以看到最后主流程最后把训练过程委派给了buildClassifierWithWeight和buildClassifierUsingResampling,先来分析一下buildClassifierWithWeight

 protected void buildClassifierWithWeights(Instances data) 
    throws Exception {

    Instances trainData, training;
    double epsilon, reweight;
    Evaluation evaluation;
    int numInstances = data.numInstances();
    Random randomInstance = new Random(m_Seed);

    // //初始化
    m_Betas = new double [m_Classifiers.length];
    m_NumIterationsPerformed = 0;

    // 从直观认识上讲,算法训练模型的时候,不应该改变训练数据或者把训练集弄脏,因此需要做一个Instances的深度拷贝。
    training = new Instances(data, 0, numInstances);
    
    // 主循环,boosting使用的基分类器数量就是m_Classifiers数组长度。
    for (m_NumIterationsPerformed = 0; m_NumIterationsPerformed < m_Classifiers.length; 
	 m_NumIterationsPerformed++) {
      if (m_Debug) {
	System.err.println("Training classifier " + (m_NumIterationsPerformed + 1));
      }
      // 这里可以设置一个百分数,代表权重分位数,低于该分位数的实例会被过滤掉,这里是体现了boosting的“每次迭代着重考虑之前分错的实例”这种思想。
      if (m_WeightThreshold < 100) {
	trainData = selectWeightQuantile(training, 
					 (double)m_WeightThreshold / 100);
      } else {
	trainData = new Instances(training, 0, numInstances);
      }

      //训练基分类器,如果是一个不稳定的随机分类器,先设置一个种子。
      if (m_Classifiers[m_NumIterationsPerformed] instanceof Randomizable)
	((Randomizable) m_Classifiers[m_NumIterationsPerformed]).setSeed(randomInstance.nextInt());
      m_Classifiers[m_NumIterationsPerformed].buildClassifier(trainData);

      // 进行模型准确度的估计,枚举型返回准确率,数值型返回方差,但因为AdaBoostM1不支持数值型,所以这里可以认为返回准确率。需要注意的是这里的估计方法就是把training里的每一个Instance放到基分类器里进行预测,相当于训练集和测试集是同一个集合,因此对于AdaBoostM1,<span style="color:#ff0000;">必须选择弱分类器</span>,可以预见到,如果是一个强分类器(如REPTree和不剪枝的J48),导致数据过拟合,这里得到的errorRate就为0,进而直接退出迭代。
      evaluation = new Evaluation(data);
      evaluation.evaluateModel(m_Classifiers[m_NumIterationsPerformed], training);
      epsilon = evaluation.errorRate();

      // 如果错误率大于0.5(那还分个毛。。。),或者错误率是0(完全分类),就退出。
      if (Utils.grOrEq(epsilon, 0.5) || Utils.eq(epsilon, 0)) {
	if (m_NumIterationsPerformed == 0) {
	  m_NumIterationsPerformed = 1; // If we're the first we have to to use it
	}
	break;
      }
      // 设置此基分类器的权重,并且重新设置整个训练集中各用例的权重
      m_Betas[m_NumIterationsPerformed] = Math.log((1 - epsilon) / epsilon);
      reweight = (1 - epsilon) / epsilon;
      if (m_Debug) {
	System.err.println("\terror rate = " + epsilon
			   +"  beta = " + m_Betas[m_NumIterationsPerformed]);
      }
 
      // 下面这个函数做了两个事:1、对于training里分错的对象,让其权重乘以reweight,即提高了权重 2、du对训练集所有权重进行归一化,使之和为1(即稍微同比缩小一点)
      setWeights(training, reweight);
    }
  }
可以看到,此函数并没有对训练集根据权重进行重抽样,因为基分类器自身就是权重敏感的分类器。

但是从设计的角度来吐个槽的话,个人认为这并不是一个非常好的设计,AdaBoostM1类作为一个基分类器的wrapper,必须对整个训练及分类结果负责,并不能因为基分类器“仅仅实现了权重敏感接口”就完全信任其权重敏感的操作,再从算法本身的角度来讲,实现“权重敏感”的逻辑本身就是AdaBoostM1算法的一部分,不应委派给基分类器去做。


五、buildClassifierUsingResampling

protected void buildClassifierUsingResampling(Instances data) 
    throws Exception {

    Instances trainData, sample, training;
    double epsilon, reweight, sumProbs;
    Evaluation evaluation;
    int numInstances = data.numInstances();
    Random randomInstance = new Random(m_Seed);
    int resamplingIterations = 0;

    // 初始化所有基分类器的权重数组,迭代次数等。
    m_Betas = new double [m_Classifiers.length];
    m_NumIterationsPerformed = 0;
    // 深度拷贝训练集
    training = new Instances(data, 0, numInstances);
    sumProbs = training.sumOfWeights();
    for (int i = 0; i < training.numInstances(); i++) {
      training.instance(i).setWeight(training.instance(i).
				      weight() / sumProbs);//初始化权重为均值。
    }
    
    // 主循环
    for (m_NumIterationsPerformed = 0; m_NumIterationsPerformed < m_Classifiers.length; 
	 m_NumIterationsPerformed++) {
      if (m_Debug) {
	System.err.println("Training classifier " + (m_NumIterationsPerformed + 1));
      }

      // 低权重过滤
      if (m_WeightThreshold < 100) {
	trainData = selectWeightQuantile(training, 
					 (double)m_WeightThreshold / 100);
      } else {
	trainData = new Instances(training);
      }
      
      // 重采样
      resamplingIterations = 0;
      double[] weights = new double[trainData.numInstances()];
      for (int i = 0; i < weights.length; i++) {
	weights[i] = trainData.instance(i).weight();
      }
      do {
	sample = trainData.resampleWithWeights(randomInstance, weights);//根据权重重采样,算法是Walker's method, see pp. 232 of "Stochastic Simulation" by B.D. Ripley,我完全找不到出处,并且原代码可读性比较差,如果有知道该算法的读者望留个言,谢谢了。

	// 训练基分类器
	m_Classifiers[m_NumIterationsPerformed].buildClassifier(sample);
	evaluation = new Evaluation(data);
	evaluation.evaluateModel(m_Classifiers[m_NumIterationsPerformed], 
				 training);
	epsilon = evaluation.errorRate();
	resamplingIterations++;
      } while (Utils.eq(epsilon, 0) && 
	      (resamplingIterations < MAX_NUM_RESAMPLING_ITERATIONS));//因为重采样的不稳定性,所以这里会训练多次,MAX_NUM_RESAMPLING_ITERATIONS默认为10。如果只训练一次,或许会出现epsilon大于0.5直接导致迭代退出的情况。
      	
      // 退出条件,上一个函数说过了
      if (Utils.grOrEq(epsilon, 0.5) || Utils.eq(epsilon, 0)) {
	if (m_NumIterationsPerformed == 0) {
	  m_NumIterationsPerformed = 1; // If we're the first we have to to use it
	}
	break;
      }
      
      //权重调整,上个函数也说过了
      m_Betas[m_NumIterationsPerformed] = Math.log((1 - epsilon) / epsilon);
      reweight = (1 - epsilon) / epsilon;
      if (m_Debug) {
	System.err.println("\terror rate = " + epsilon
			   +"  beta = " + m_Betas[m_NumIterationsPerformed]);
      }
      setWeights(training, reweight);
    }
  }


六、总结

训练好了分类器之后,在针对具体instance分类时,会根据mBeta对各基分类器得到的结果进行算数加权,进而得到最终结果,相关代码叫见到不再分析。


总结实在不知道该写些啥,简单说两点吧

1、Weka的AdaBoostM1基本按照标准算法实现得来,唯一的不同之处就是部分权重resampling会委派给基分类器进行实现。

2、基分类器一定要选择弱分类器。



Weka算法Classifier-meta-Bagging源码分析 阅读详情

相关推荐

Meta-Classifier in Membership Inference

文章目录1. 什么是 meta-classifier2. 如何训练一个 meta-classifier2.1 符号定义2.2 meta-classifier 训练过程2.3 预测过程参考资料 1. 什么是 meta-classifier Google 上发现了一个对 meta-classifier 的英文解释[1] : Meta-Classifier Definition: A classifi...

pandalai的博客 1853

weka[7] - Adaboost

前面已经分析完bagging,当然不得不提boosting了。作为boosting方法中,名气最大的suan

狂奔的番茄 3498

AdaBoostClassifer详解及实战

AdaBoostClassifer详解及实战 AdaBoost算法是Adaptive Boost的简称,属于Boosting类算法。 随机森林是一种经典的Bagging算法。 Boosting通过将一系列弱学习器组合起来,通过集成这些弱学习器的学习能力,得到一个强学习器。具体到AdaBoost算法,AdaBoost在之前学习器的基础上改变样本的权重,增加那些之前被分类错误的样本的比重,降低分类正确样本的比重,这样之后的学习器将重点关注那些被分类错误的样本。最后通过将这些学习器通过加权组合成..

data+scenario+science+insight 2141

weka-分类算法

weka-分类算法   3. 分类与回归 背景知识 WEKA把分类(Classification)和回归(Regression)都放在“Classify”选项卡中,这是有原因的。 在 这两个任务中,都有一个目标属性(输出变量)。我们希望根据一个样本(WEKA中称作实例)的一组特征(输入变量),对目标进行预测。为了实现这一目的, 我们需要有一个训练数据集,这个数据集中每

2072

weka源码学习

目录 Weka 开发[1]-Instances类 1 Weka开发[2]-分类器类 2 Weka开发[3]-Evaluation类 3 Weka开发[4]-特征选择 4 Weka开发[5]-半监督算法 6 Weka开发[0]-导入Weka包 8 半监督算法工具SVMlin使用 12 半监督算法工具SVMlin读取数据代码介绍 14 Weka开发[6]-参数设置 16 Weka开发[7]-LibSVM 17 Weka开发[8]-ID3源码介绍 18 Weka开发[9]—KMeans源码介绍 21 Weka开发[10]—NBTree源码介绍 25 Weka开发[11]—J48源代码介绍 31 Weka开发[13]-Ensemble 39 Weka开发[14]-AdaBoost源代码介绍 42 Weka开发[15]-ZeroR源代码介绍(入门篇) 45 Multi-Label Classification(多标签分类) 介绍 47 Weka开发[16]-OneR源代码介绍 47 Weka开发[-1]——在你的代码中使用Weka 51 挖掘多标签数据综述(multi-label data mining)[Available] 62 数据流-移动超平面(HyperPlane)构造 63 Weka开发[17]——关联规则之Apriori 66 Weka开发[18]——寻找K个邻居 67 Weka开发[19]——NaiveBayes源代码分析 69 Weka开发[20]——IB1源代码分析 74 Weka开发[21]——IBk(KNN)源代码分析 77 Weka开发[22]——REPTree源代码分析(1) 81 Weka开发[23]——PART源代码分析 94 Weka开发[24]——Apriori源代码分析(1) 101 Weka开发[24]——Apriori源代码分析(2) 106 Weka开发[25]——Bagging源代码分析 112 Weka开发[26]——Voting源代码分析 116 Weka开发[27]——SMO源代码分析[1] 122 Weka开发[27]——SMO源代码分析[2] 127 weka开发[27]——SMO源代码分析[3] 132 Weka开发[27]——SMO源代码分析[4] 138

HAL库:中断处理函数 及 weak弱声明中断回调函数 详解

HAL库中断处理函数 及 weak弱声明中断回调函数

L_Z_J_I的博客 5169

Weka算法Classifier-meta-AdaBoostM1源码分析(一)

Weka算法Classifier-meta-AdaBoostM1源码分析(一)

锐之锋芒 8490

renderdoc的使用

renderdoc可以用来捕获帧渲染情况,排查一些GPU渲染、资源规格等问题。 下面讲述一些该软件连接真机调试使用。 一、下载安装renderdoc 软件的下载地址:https://renderdoc.org/可直接点击下载即可。该软件是开源免费的,不用破解。 下载后直接安装即可使用。 二、打开使用renderdoc 打开界面后,默认的界面布局如下图所示,(这里我已经设置了黑色主题,可以忽略这点),renderdo中主要的窗口有Texture Viewer(纹理查看器)、Event B.

x_xingduo_2315的博客 2万+

weka对数据集进行分类

如下运用weka中的AdaBoost分类器对weather.nominal.arff数据集进行十折交叉验证 具体步骤如下: (1)打开weka,打开探索者 (2)打开数据集文件 (3)打开weka文件中的data文件夹,其中有weka自带的数据集 (4)这里以weather.nominal.arff数据集为例,选择打开 (5)下图为打开数据集后的示意图,继续点击分类功能 (6)选择分类器 (7)按如下图选择AdaBoost分类器,这...

tiantianzs的博客 4334

SCL3400硬件避坑指南:引脚兼容性测试+模式切换异常处理

本文针对村田SCL3400双轴倾角计在实际硬件设计中的常见问题,提供了详细的避坑指南。重点解析了从SCL3300迁移时的引脚兼容性真相,包括SPI时序、电源去耦等关键差异,并深入探讨了模式切换中超量程错误的复现原因与软件容错方案。同时,指导了如何根据应用场景配置低通滤波器,并给出了无自动唤醒功能下的可靠电源与长线SPI通信管理策略。

weixin_29190573的博客 292

Windows原生与WSL2环境下OpenClaw性能与兼容性的对比分析研究

本文对比分析了Windows原生环境与WSL2环境下运行OpenClaw的性能与兼容性。Windows原生环境提供深度系统集成、图形界面支持和硬件加速优势,适合需要Windows生态集成的用户;WSL2则提供接近原生Linux的性能体验,兼容Linux工具链,适合开发者和跨平台需求。文章详细介绍了两种环境下的推荐硬件配置、系统版本选择及必备工具,并提供了具体的部署步骤指南。研究表明,两种环境各有适用场景,用户可根据需求选择最适合的部署方式。

一键难忘的博客 1218

数据挖掘工具weka中的算法列表

weka 数据挖掘 算法

知道者 1991

【NVIDIA GR00T N1 从入门到精通】第1章 环境搭建与基础配置 第2章 数据准备与格式转换

针对新型机器人形态的适配,需完成从硬件接口到数据模式的完整配置流程。创建modality_config.py文件自定义形态配置通过继承基类实现。配置类需实例化以下组件:状态模态定义(观测空间)、动作模态定义(动作空间)、相机模态定义(视觉输入)、可选的标注模态定义(语言指令或成功判定)。每个模态配置指定数据类型、形状、归一化统计量以及时序采样策略。状态模态配置状态配置的核心参数包括与。定义策略观测的历史时域窗口,对于高动态操作(如投掷、击打),需扩展历史窗口以捕捉运动趋势;

VectorShift的博客 95

Weka应用总结

一. 引入本文是我学习《数据挖掘与机器学习–WEKA应用技术与实践》的笔记。该书电子版的链接是:http://download.youkuaiyun.com/detail/fhb292262794/8759397全书简单说明了机器学习的分类、聚类、关联的算法原理及实践,在高级应用中说明了贝叶斯网络、神经网络的原理及简单实例应用,还给出了Java Api调用WEKA接口的方法。总体而言该书比较详实,有理论有实践,

狮子座明仔知识集散场 9441

二维光子晶体禁带的遗传优化算法实现

二维光子晶体禁带的遗传优化算法MATLAB源代码 光子晶体中因周期性结构而存在的频率禁带称为光子禁带,光子禁带的存在是光子晶体具有广泛应用前景的重要原因。 禁带越大,可控光的频带也越宽,因此如何设计合适的晶体结构以获得大的光子禁带一直是研究和应用的重点与热点。 给大家讲解在平面波展开法的基础上,使用遗传算法寻找具有最大光子禁带的二维光子晶体结构。 %-------------------------------------------------------------------------- % Ph

m0_53407570的博客 583

R语言 百度坐标转换至WGS84坐标

本文利用R语言封装了百度坐标转换至WGS84坐标的函数,亲测有效,提供了便捷的百度坐标转换方法。

qingchen98的博客 2135

Weka算法Classifier-trees-RandomTree源码分析

主要讲述了Weka算法中Classifier-trees-RandomTree的源码分析(随机森林算法)

smilehehe110的博客 2807

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Weka算法Classifier-meta-AdaBoostM1源代码分析(一)

多分类器组合算法简单的来讲经常使用的有voting,bagging和boosting,当中就效果来说Boosting略占优势,而AdaBoostM1算法又相当于Boosting算法的“经典款”。 Voting思想是使用多分类器进行投票组合。并依照少数服从多数(大多数情况)来决定终于的分类。缺点是少数服从多数的规则往往仅仅能避免达到最差的情况却也非常难达到最少的情况。 Baggi...

weixin_34238633的博客 323

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

weka分类算法精度效率汇总

统计了一下weka各个分类器的效果,表格如下: right 682 wrong 1 percent 99.853584 % 0.76632506 ms/once total time 52340 ms class weka.classifiers.functions.MultilayerP

无知的我 5345

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

adaboost算法matlab代码,离散Discrete adaboost算法matlab实现

function [classifiers] =adaboostTrain(tr_set,tr_labels,TCount)% gentle_adaboost算法实现,version 1,效果不好,似乎成线性分类器了.% Instruction 说明:% tr_set:训练集,行数为样本数,列数为每个样本的特征数% tr_labels:训练集标识,正类标识为1,负类标识为0% TCount:弱分...

weixin_28998775的博客 399

adaboost.M1与adaboost.M2差别比较

三种算法的差别adaboost是由Yoav Freund和Robert E. Schapire 首先提出来的一种用于二分类问题的集成方法,紧接着出现的adaboost.M1将二分类扩展到多分类问题,而adaboost.M2不仅可以处理多分类问题,还引入了置信度的概念,进一步扩展了adaboost算法。adaboost的简单介绍 由H(x)=sign(∑t=1Tαtht(x))H(x)=sign(\

tyh70537的博客 1万+

Weka一些基础内容

<br />无意间在网上看到了:http://weka.wiki.sourceforge.net/Use+Weka+in+your+Java+code,相对我写的代码,它的当然更有权威性。翻译完了,第一次翻译,术语的汉语很多不清楚。还没有校对,有什么错误请告诉我。<br />你可能要用的最常用的组件(components)是:<br />l  Instances 你的数据<br />l  Filter 对数据的预处理<br />l  Classifiers/Clusterer 被建立在预处理的数据上,分类/

Wayne's Road to Rome! 4461

Weka各类分类器的使用(Java)

1.配置 MyEclipse2013+Weka3.6+libsvm3.18+Jdk1.7+Win8.1 2.小Tips 1). Java使用Weka 实现: 将安装文件夹里的weka.jar加入项目编译路径中 2). CSV文件可以转换成Arff文件 实现: 运行Weka的Explorer界面,打开csv文件,保存为arff文件。 注意:

计算机技术博客 3716

使用Weka进行数据挖掘

1.简介 数据挖掘、机器学习这些字眼,在一些人看来,是门槛很高的东西。诚然,如果做算法实现甚至算法优化,确实需要很多背景知识。但事实是,绝大多数数据挖掘工程师,不需要去做算法层面的东西。他们的精力,集中在特征提取,算法选择和参数调优上。那么,一个可以方便地提供这些功能的工具,便是十分必要的了。而weka,便是数据挖掘工具中的佼佼者。 Weka的全名是怀卡托智能分析环境(W...

weixin_34080571的博客 1393

Weka数据挖掘——选择属性

如果你现在还不努力,那么将来的你会过的更加吃力。 1 选择属性 属性选择是通过搜索数据中所有可能的属性组合,以找到预测效果最好的属性子集。手工选择属性既繁琐又容易出错,为了帮助用户事项选择属性自动化。Weka中提供了选择属性面板。要自动选择属性需要设立两个对象:属性评估器和搜索方法,如下图所示: 属性评估器确定使用什么方法给每个属性分配一个评估值...

weixin_30487317的博客 1606
上一篇: Weka算法Classifier-meta-AdaBoostM1源码分析(一)
下一篇: 执行Java -jar somefile.jar时发生了什么(一)
ROger__Wong
博客等级 码龄14年 250粉丝 78原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值