weka初步一

来源:互联网 发布:淘宝联盟怎么转淘口令 编辑:程序博客网 时间:2024/04/29 16:50

Weka是来之新西兰怀卡托大学的一款开源软件,主要是数据挖掘方面的一些算法的集合。这款软件大概是当前数据挖掘领域最好的开源软件了,当然国外还有其它一些组织维护的有自己的开源软件,但是只有这款软件应用是比较广泛的了。具体关于weka的信息可以到官网去查看http://www.cs.waikato.ac.nz/ml/weka/ ,软件的下载也可大家到官网去。

我是从weka3.4一直用到现在的3.6版本的,其间weka在图形界面上有一些变动,但是底层的框架结构没有太大的变化,主要是添加一些新的算法什么的。总之大家可以放心的使用。我现在积累的代码是从3.5版本积累下来的,到现在3.6版本,集成起来一点问题都没有,这大概也是我喜欢weka的一个原因。

数据挖掘的过程一般如下:

1.       读入训练、测试样本

2.       初始化分类器

3.       使用训练样本训练分类器

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

5.       打印分类结果

我们现在看看一个简单的实例

 

package com.csdn;

 

import java.io.File;

 

import weka.classifiers.Classifier;

import weka.classifiers.Evaluation;

import weka.core.Instance;

import weka.core.Instances;

import weka.core.converters.ArffLoader;

 

public class Test {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       Instances ins = null;

      

       Classifier cfs = null;

       try{

          

           /*

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

            * 在此我们将训练样本和测试样本作为同一个样本

            */

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

           ArffLoader loader = new ArffLoader();

           loader.setFile(file);

           ins = loader.getDataSet();

          

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

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

          

           /*

            * 2.初始化分类器

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

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

            */

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

          

           /*

            * 3.使用训练样本训练分类器

            */

           cfs.buildClassifier(ins);

          

          

           /*

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

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

            */

           Instance testInst;

           /*

            * Evaluation: Class for evaluating machine learning models

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

            */

           Evaluation testingEvaluation = new Evaluation(ins);

           int length = ins.numInstances();

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

              testInst = ins.instance(i);

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

              testingEvaluation.evaluateModelOnceAndRecordPrediction(

                  cfs, testInst);

           }

          

           /*

            * 5.打印分类结果

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

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

            */

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

       }catch(Exception e){

           e.printStackTrace();

       }

    }

 

}

 

通过这个实例,我们可以看到在weka上做开发非常简单的,每个模块weka都提供了很好的支持。同时,我们可以在此基础上对weka进行一个简单的封装。设计一个Util类,将数据读取,以及分类器测试等功能放在这个Util类中共以后其它的程序使用。

 

获取样本Instances

/*

     * .arff文件中获取样本Instances;

     * 1.fileName instances的文件名

     */

    public static Instances getInstances(String fileName) throws Exception{

       File file= new File(fileName);

       return getInstances(file);

    }

 

/*

     * .arff文件中获取样本Instances;

     * 1.file 获得instancesFile对象

     */

    public static Instances getInstances(File file) throws Exception{

       Instances inst = null;

       try{

           ArffLoader loader = new ArffLoader();

           loader.setFile(file);

           inst = loader.getDataSet();

       }

       catch(Exception e){

           throw new Exception(e.getMessage());

       }

       return inst;

    }

 

获得一个Evaluation对象:

/*

     * 获得一个Evaluation对象

     * 1.h 一个已经训练过的分类器

     * 2.ins 测试样本

     */

    public static Evaluation getEvaluation(Classifier h,Instances ins){

       try{

           Instance testInst;

           /*

            * Evaluation: Class for evaluating machine learning models

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

            */

           Evaluation testingEvaluation = new Evaluation(ins);

           int length = ins.numInstances();

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

              testInst = ins.instance(i);

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

              testingEvaluation.evaluateModelOnceAndRecordPrediction(

                   h, testInst);

            }

           return testingEvaluation;

       }

       catch(Exception e){

           System.out.println("haha bug!");

           System.out.println(e);

       }

       return null;     

    }

 

通过这几个函数我们就将读取instances对象的功能以及测试分类器的效果的功能封装到两个static函数中了,下次我们使用的时候就可以方便的调用这个接口了,可以省去我们写这些代码的时间了。

大家明白了吗?还是比较简单的吧。

0 0
原创粉丝点击