织梦CMS - 轻松建站从此开始!

罗索

Weka初步一

落鹤生 发布于 2013-04-11 09:57 点击:次 
从前年开始使用weka最数据挖掘方面的研究,到现在有一年半的时间了。看到我们同组的兄弟写了关于weka方面的总结,我也想整理一下。因为网上的资料实在是太少,记得刚接手的时候,真是硬着头皮看代码。不过到现在看来,也积累了很多的代码了。希望能够在这里跟大家分享一
TAG:

从前年开始使用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.       打印分类结果

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

  1. package com.csdn; 
  2.  
  3. import java.io.File; 
  4. import weka.classifiers.Classifier; 
  5. import weka.classifiers.Evaluation; 
  6. import weka.core.Instance; 
  7. import weka.core.Instances; 
  8. import weka.core.converters.ArffLoader; 
  9.  
  10. public class Test { 
  11.     /** 
  12.      * @param args 
  13.      */ 
  14.     public static void main(String[] args) { 
  15.        // TODO Auto-generated method stub 
  16.        Instances ins = null
  17.        Classifier cfs = null
  18.        try
  19.            /* 
  20.             * 1.读入训练、测试样本 
  21.             * 在此我们将训练样本和测试样本作为同一个样本 
  22.             */ 
  23.            File file= new File("C://Program Files//Weka-3-6//data//contact-lenses.arff"); 
  24.            ArffLoader loader = new ArffLoader(); 
  25.            loader.setFile(file); 
  26.            ins = loader.getDataSet(); 
  27.            //在使用样本之前一定要首先设置instances的classIndex,否则在使用instances对象是会抛出异常 
  28.            ins.setClassIndex(ins.numAttributes()-1); 
  29.            /* 
  30.             * 2.初始化分类器 
  31.             * 具体使用哪一种特定的分类器可以选择,请将特定分类器的class名称放入forName函数 
  32.             * 这样就构建了一个简单的分类器 
  33.             */ 
  34. cfs = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance(); 
  35.            /* 
  36.             * 3.使用训练样本训练分类器 
  37.             */ 
  38.            cfs.buildClassifier(ins); 
  39.            /* 
  40.             * 4.使用测试样本测试分类器的学习效果 
  41.             * 在这里我们使用的训练样本和测试样本是同一个,在实际的工作中需要读入一个特定的测试样本 
  42.             */ 
  43.            Instance testInst; 
  44.            /* 
  45.             * Evaluation: Class for evaluating machine learning models 
  46.             * 即它是用于检测分类模型的类 
  47.             */ 
  48.            Evaluation testingEvaluation = new Evaluation(ins); 
  49.            int length = ins.numInstances(); 
  50.            for (int i =0; i < length; i++) { 
  51.               testInst = ins.instance(i); 
  52.               //通过这个方法来用每个测试样本测试分类器的效果 
  53.            testingEvaluation.evaluateModelOnceAndRecordPrediction( 
  54.                   cfs, testInst); 
  55.            } 
  56.            /* 
  57.             * 5.打印分类结果 
  58.             * 在这里我们打印了分类器的正确率 
  59.             * 其它的一些信息我们可以通过Evaluation对象的其它方法得到 
  60.             */ 
  61.            System.out.println( "分类器的正确率:" + (1- testingEvaluation.errorRate())); 
  62.        }catch(Exception e){ 
  63.            e.printStackTrace(); 
  64.        } 
  65.     } 

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

获取样本Instances

  1. /* 
  2.      * 从.arff文件中获取样本Instances; 
  3.      * 1.fileName instances的文件名 
  4.      */ 
  5.     public static Instances getInstances(String fileName) throws Exception{ 
  6.        File file= new File(fileName); 
  7.        return getInstances(file); 
  8.     } 
  9. /* 
  10.      * 从.arff文件中获取样本Instances; 
  11.      * 1.file 获得instances的File对象 
  12. */ 
  13.     public static Instances getInstances(File file) throws Exception{ 
  14.        Instances inst = null
  15.        try
  16.            ArffLoader loader = new ArffLoader(); 
  17.            loader.setFile(file); 
  18.            inst = loader.getDataSet(); 
  19.        } 
  20.        catch(Exception e){ 
  21.            throw new Exception(e.getMessage()); 
  22.        } 
  23.        return inst; 
  24.     } 
  25.  
  26.   

获得一个Evaluation对象:

  1. /* 
  2.      * 获得一个Evaluation对象 
  3.      * 1.h 一个已经训练过的分类器 
  4.      * 2.ins 测试样本 
  5. */ 
  6.     public static Evaluation getEvaluation(Classifier h,Instances ins){ 
  7.        try
  8.            Instance testInst; 
  9.            /* 
  10.             * Evaluation: Class for evaluating machine learning models 
  11.             * 即它是用于检测分类模型的类 
  12.             */ 
  13.            Evaluation testingEvaluation = new Evaluation(ins); 
  14.            int length = ins.numInstances(); 
  15.            for (int i =0; i < length; i++) { 
  16.              testInst = ins.instance(i); 
  17.               //通过这个方法来用每个测试样本测试分类器的效果 
  18.            testingEvaluation.evaluateModelOnceAndRecordPrediction( 
  19.                    h, testInst); 
  20.             } 
  21.            return testingEvaluation; 
  22.        } 
  23.        catch(Exception e){ 
  24.            System.out.println("haha bug!"); 
  25.            System.out.println(e); 
  26.        } 
  27.        return null

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

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

(anqiang1984)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201304/16579.html]
本文出处:CSDN博客 作者:anqiang1984 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容