ensemble技术在weka中的实现过程

5 篇文章 0 订阅
3 篇文章 0 订阅

参考原文: http://blog.csdn.net/anqiang1984/article/details/4045903 

Weka学习三(ensemble算法)


package weka;

 

import java.io.File;

 

import weka.classifiers.Classifier;

import weka.classifiers.Evaluation;

import weka.classifiers.meta.Vote;

import weka.core.Instance;

import weka.core.Instances;

import weka.core.SelectedTag;

import weka.core.converters.ArffLoader;

 

public class Ensemble {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       Instances trainIns = null;

       Instances testIns = null;

       Classifier cfs1 = null;

       Classifier cfs2 = null;

       Classifier cfs3 = null;

       Classifier[] cfsArray = new Classifier[3];

      

       try{

          

           /*

            * 1.读入训练、测试样本

            * 在此我们将训练样本和测试样本是由weka提供的segment数据集构成的

            */

           File file= new File("C://Program Files//Weka-3-6//data//segment-challenge.arff");

           ArffLoader loader = new ArffLoader();

           loader.setFile(file);

           trainIns = loader.getDataSet();

          

           file = new File("C://Program Files//Weka-3-6//data//segment-test.arff");

           loader.setFile(file);

           testIns = loader.getDataSet();

          

           //在使用样本之前一定要首先设置instancesclassIndex,否则在使用instances对象是会抛出异常

           trainIns.setClassIndex(trainIns.numAttributes()-1);

           testIns.setClassIndex(testIns.numAttributes()-1);

          

          

           /*

            * 2.初始化基分类器

            * 具体使用哪一种特定的分类器可以选择,请将特定分类器的class名称放入forName函数

            * 这样就构建了一个简单的分类器

            */

           //贝叶斯算法

           cfs1 = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();

           //决策树算法,是我们常听说的C45weka版本,不过在我看代码的过程中发现有一些与原始算法有点区别的地方。

           //即在原始的C45算法中,我们规定没有一个属性节点在被使用(即被作为一个分裂节点以后,他将被从属性集合中去除掉)。

           //但是在J48中没有这样做,它依然在下次分裂点前,使用全部的属性集合来探测一个合适的分裂点。这样做好不好?

           cfs2 = (Classifier)Class.forName("weka.classifiers.trees.J48").newInstance();

           //什么东东,不知道做什么用,平常很少用。本想要用LibSVM的,但是由于要加载一些包,比较麻烦。

           cfs3 = (Classifier)Class.forName("weka.classifiers.rules.ZeroR").newInstance();

                    

           /*

            * 3.构建ensemble分类器

            */

          

           cfsArray[0] = cfs1;

           cfsArray[1] = cfs2;

           cfsArray[2] = cfs3;

          

           Vote ensemble = new Vote();

           /*

            * 订制ensemble分类器的决策方式主要有:

            * AVERAGE_RULE

            * PRODUCT_RULE

            * MAJORITY_VOTING_RULE

            * MIN_RULE

            * MAX_RULE

            * MEDIAN_RULE

            * 它们具体的工作方式,大家可以参考weka的说明文档。

            * 在这里我们选择的是多数投票的决策规则

            */

           SelectedTag tag1 = new SelectedTag(

                  Vote.MAJORITY_VOTING_RULE, Vote.TAGS_RULES);

 

           ensemble.setCombinationRule(tag1);

           ensemble.setClassifiers(cfsArray);

           //设置随机数种子

           ensemble.setSeed(2);

           //训练ensemble分类器

           ensemble.buildClassifier(trainIns);

          

           /*

            * 4.使用测试样本测试分类器的学习效果

            * 在这里我们使用的训练样本和测试样本是同一个,在实际的工作中需要读入一个特定的测试样本

            */

           Instance testInst;

           /*

            * Evaluation: Class for evaluating machine learning models

            * 即它是用于检测分类模型的类

            */

           Evaluation testingEvaluation = new Evaluation(testIns);

           int length = testIns.numInstances();

           for (int i =0; i < length; i++) {

              testInst = testIns.instance(i);

              //通过这个方法来用每个测试样本测试分类器的效果

              testingEvaluation.evaluateModelOnceAndRecordPrediction(

                     ensemble, testInst);

           }

          

           /*

            * 5.打印分类结果

            * 在这里我们打印了分类器的正确率

            * 其它的一些信息我们可以通过Evaluation对象的其它方法得到

            */

           System.out.println( "分类器的正确率:" + (1- testingEvaluation.errorRate()));

       }catch(Exception e){

           e.printStackTrace();

       }

    }

 

}


voting功能已经可以实现 不过还是没有找到好的 给每个算法分配权重的办法,之后继续更新

To be continue...



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值