• Weka初步


    从前年開始使用weka最数据挖掘方面的研究,到如今有一年半的时间了。看到我们同组的兄弟写了关于weka方面的总结。我也想整理一下。由于网上的资料实在是太少。记得刚接手的时候,真是硬着头皮看代码。只是到如今看来,也积累了非常多的代码了。希望可以在这里跟大家分享一下学习weka的乐趣与经验。

    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上做开发非常easy的。每一个模块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函数中了,下次我们使用的时候就能够方便的调用这个接口了。能够省去我们写这些代码的时间了。

    我们还清楚?这是比较简单。

  • 相关阅读:
    集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)
    CycleBarrier与CountDownLatch原理
    Volatile和Synchronized
    集合类源码(五)Collection之BlockingQueue(LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue)
    集合类源码(三)Collection之List(CopyOnWriteArrayList, Stack)
    集合类源码(二)Collection之List(ArrayList, LinkedList, Vector)
    集合类源码(一)概述
    Java ReentrantLock中tryLock与lock的区别(非公平锁与公平锁)
    Arctime制作视频字幕教程
    用Pr对视频画面进行裁剪
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4563112.html
Copyright © 2020-2023  润新知