`
orange.lpai
  • 浏览: 92716 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Weka学习(ensemble算法)

阅读更多
转载自http://blog.csdn.net/anqiang1984/archive/2009/04/03/4045903.aspx
  
   前两次我们讲了数据挖掘中比较常见的两类方法。这次我来介绍一下ensemble(集成技术),总的来说,ensemble技术是归类在分类中的。它的主要原理是通过集成多个分类器的效果来达到提高分类效果的目的。简单我们可以通过两张图片来看看集成的效果

[img][/img]

图一为多个基分类器单独工作时的分类效果图。图二为集成分类器的分类效果。我们可以看到集成分类器的分类曲线明显会平滑的多。来个比喻,在一件事情的表决上面,一个人的意见与多个人的意见相比,往往是多个人的意见来的准确一些。这是为什么我们要提倡民主决策的原因。
Ensemble技术在数据挖掘方向主要在以下三个方向做工作:
1.       在样本上做文章,基分类器为同一个分类算法,主要的技术有bagging,boosting;
2.       在分类算法上做工作,即用于训练基分类器的样本相同,基分类器的算法不同,这是本文采用的方法;
3.       在样本属性集上做文章,即在不同的属性空间上构建基分类器,比较出名的是randomforestTree算法,这个在weka中也有实现。
现在我们来看看ensemble技术在weka中的实现过程。
package com.csdn;
 
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 SimpleEnsemble {
 
    /**
     * @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();
          
           //在使用样本之前一定要首先设置instances的classIndex,否则在使用instances对象是会抛出异常
           trainIns.setClassIndex(trainIns.numAttributes()-1);
           testIns.setClassIndex(testIns.numAttributes()-1);
          
          
           /*
            * 2.初始化基分类器
            * 具体使用哪一种特定的分类器可以选择,请将特定分类器的class名称放入forName函数
            * 这样就构建了一个简单的分类器
            */
           //贝叶斯算法
           cfs1 = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();
           //决策树算法,是我们常听说的C45的weka版本,不过在我看代码的过程中发现有一些与原始算法有点区别的地方。
           //即在原始的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();
       }
    }
 
}

在weka中主要是通过weka.classifiers.meta.Vote来实现,基分类器是通过基分类器数组来设置的。同时我们可以自己设置集成分类器的决策方法,较为常用的是多数投票算法。
我在写下这篇文章是对ensemble分类器在segment数据集上的分类效果做了一个小小的测试,它对测试集segement-test的分类效果是0.8309的正确率。而我在使用单个分类器NaiveBayes,J48, ZeroR时它们的分类效果分别为0.7704、0.9617、0.1106 这样我们可以看到,ensemble分类器是可以矫正弱分类器的分类效果的。
总的来说,我在做实验的过程中,大部分的实验结果都表明ensemble技术确实是可以提高分类效果。当然这也是有国际上大牛的证明的,可不是我一个人这样说的。
分享到:
评论
1 楼 deepfuture 2010-07-29  
不错,我也是做机器学习的,呵呵,不过没用weka,我自己写的变种贝叶斯算法,你的QQ是多少

相关推荐

    WEKA源码,包括SVM、KNN等源代码

    WEKA 是一个流行的数据挖掘工具,它包含了多种机器学习算法,如支持向量机(SVM)、K近邻(KNN)等。源代码的提供使得开发者能够深入了解这些算法的工作原理,同时也为自定义和扩展提供了可能。以下将对WEKA中的一些...

    weka源码学习

    Weka开发[13]-Ensemble 39 Weka开发[14]-AdaBoost源代码介绍 42 Weka开发[15]-ZeroR源代码介绍(入门篇) 45 Multi-Label Classification(多标签分类) 介绍 47 Weka开发[16]-OneR源代码介绍 47 Weka开发...

    java机器学习WEKA 3-5-5 Explorer 用户指南

    ### Java机器学习WEKA 3-5-5 Explorer 用户指南 #### 1. 启动WEKA 在启动WEKA时,用户会看到一个菜单驱动的图形用户界面(GUI),该界面继承了旧版GUI选择器的功能,并采用了多文档界面(MDI)设计,使所有打开的窗口...

    weka 中参数传递的使用方法

    对于学习者和研究者而言,掌握Weka中的参数传递机制至关重要,这不仅能够提升模型训练的效率,还能帮助优化模型性能,达到更佳的预测效果。 #### Weka参数传递的核心概念 参数传递是Weka软件中一个关键的概念,它...

    机器学习十大算法:C4.5

    监督学习的核心在于,给定一个属性值数据集,其中实例由一组属性描述,并属于一组互斥类别之一,C4.5算法学习如何将属性值映射到类别,以便对新实例进行分类。例如,图1.1展示了一个高尔夫球场景下的数据集,其中行...

    19决策树与随机森林.pptx

    Bagging 是一种 Ensemble学习方法,即 Bootstrap aggregating,通过对训练集进行采样和投票来提高模型的泛化能力。 随机森林是Bagging的一种实现,即随机选择特征和样本来训练决策树,然后对所有树的预测结果进行...

    分类:不同分类算法的实现

    在Java中实现这些算法,可以利用诸如Weka、Weka4J、Apache Mahout或TensorFlow for Java等库。`sorting-main`可能包含了一个排序算法的主程序,这在分类算法中并不直接涉及,但排序对于数据预处理和特征选择至关重要...

    Ensemble-Learning:在给定一组特征的情况下,预测大约 50,000 个人的工资的工作代码。 将实现不同类型的算法进行分类和预测以提高准确性

    Java是一种广泛用于开发大规模软件系统的编程语言,它提供了丰富的库和工具,如Weka、Deeplearning4j等,这些都可以用于构建和实现机器学习模型。 集成学习主要包括两种策略:**Bagging (Bootstrap Aggregating)** ...

    datamining:Java 中的 DBSCAN、GMM 和 Kmeans 算法

    Java中,可以使用诸如Weka(Waikato Environment for Knowledge Analysis)这样的机器学习库来实现K-means。K-means的优点在于其简单性和效率,但缺点是需要预设簇的数量,并且对初始聚类中心的选择敏感。此外,K-...

    ECemble:使用机器学习进行多类酶分类

    在模型选择和评估阶段,ECemble可能会使用各种算法构建多个模型,形成一个集成学习(ensemble learning)系统。集成学习通过结合多个弱预测器来提高整体预测性能,例如,通过投票或平均策略。在ECemble中,可能采用...

    vector源码Java-Dynamic-Ensemble-Model:对基于特征选择的动态转移集成模型进行编程,实现递归特征消除支持向量机。

    Java库如Weka和Deeplearning4j提供了丰富的机器学习功能。 5. **开源软件**:开源项目鼓励社区共享和改进代码,这对于开发者来说是宝贵的资源。参与开源项目可以提升技能,了解最佳实践,并且能够与其他开发者合作...

Global site tag (gtag.js) - Google Analytics