`
endual
  • 浏览: 3546097 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

weka中写Ensemble算法

    博客分类:
  • weka
 
阅读更多
weka中写Ensemble算法(系综或者集成分类器)---转贴
2010-10-24 13:18

前两次我们讲了数据挖掘中比较常见的两类方法。这次我来介绍一下 ensemble (集成技术),总的来说, ensemble 技术是归类在分类中的。它的主要原理是通过集成多个分类器的效果来达到提高分类效果的目的。简单我们可以通过两张图片来看看集成的效果

 

 

图一为多个基分类器单独工作时的分类效果图。图二为集成分类器的分类效果。我们可以看到集成分类器的分类曲线明显会平滑的多。来个比喻,在一件事情的表决上面,一个人的意见与多个人的意见相比,往往是多个人的意见来的准确一些。这是为什么我们要提倡民主决策的原因。

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 技术确实是可以提高分类效果。当然这也是有国际上大牛的证明的,可不是我一个人这样说的。

 转自:http://blog.csdn.net/anqiang1984/archive/2009/04/03/4045903.aspx

分享到:
评论

相关推荐

    weka源码学习

    Weka开发[-1]——在你的代码中使用Weka 51 挖掘多标签数据综述(multi-label data mining)[Available] 62 数据流-移动超平面(HyperPlane)构造 63 Weka开发[17]——关联规则之Apriori 66 Weka开发[18]——寻找K...

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

    以下将对WEKA中的一些关键组件和算法进行详细说明。 首先,Instances 类是WEKA中的核心数据结构,用于存储和处理数据实例。它包含了数据集的属性信息以及每个实例的值。Instances类支持各种操作,如添加、删除和...

    weka 中参数传递的使用方法

    参数传递是Weka软件中一个关键的概念,它允许用户通过命令行或图形用户界面自定义算法的参数,从而调整模型的行为和性能。理解并正确使用这些参数,可以显著提高分析结果的准确性和可靠性。 #### 参数传递实例:以J...

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

    - **SimpleCLI**:提供了一个简单的命令行界面,便于在没有内置命令行操作系统的环境中执行WEKA命令。 - **Tools**:这部分提供了其他有用的应用程序,例如: - **ArffViewer**:一个使用表格形式展示ARFF文件的...

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

    `sorting-main`可能包含了一个排序算法的主程序,这在分类算法中并不直接涉及,但排序对于数据预处理和特征选择至关重要。良好的数据排序可以帮助提高分类算法的效率和准确性。 在实践中,选择哪种分类算法取决于...

    19决策树与随机森林.pptx

    在机器学习领域中,决策树和随机森林是两种非常重要的算法。下面,我们将对这两种算法进行详细的介绍。 1. 决策树 决策树是一种树型结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输出,每...

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

    在Java项目中,开发者可以利用现有的开源库,如ELKI、Weka或Apache Commons Math,快速实现这些聚类算法,以便进行数据挖掘和分析。 综上所述,Java提供了丰富的工具和库支持数据挖掘中的聚类任务,包括DBSCAN、GMM...

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

    在集成学习中,这两种任务都可能涉及,具体取决于所使用的算法。 在这个项目中,我们将使用**Java**语言实现集成学习。Java是一种广泛用于开发大规模软件系统的编程语言,它提供了丰富的库和工具,如Weka、Deep...

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

    【标题】中的“vector源码Java-Dynamic-Ensemble-Model”揭示了这是一个关于Java编程的项目,专注于实现一种特定的机器学习模型——动态转移集成模型(Dynamic Ensemble Model)。动态集成模型是一种策略,通过在...

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

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

Global site tag (gtag.js) - Google Analytics