从前年开始使用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 {
-
-
-
- public static void main(String[] args) {
-
- Instances ins = null;
- Classifier cfs = null;
- try{
-
-
-
-
- File file= new File("C://Program Files//Weka-3-6//data//contact-lenses.arff");
- ArffLoader loader = new ArffLoader();
- loader.setFile(file);
- ins = loader.getDataSet();
-
- ins.setClassIndex(ins.numAttributes()-1);
-
-
-
-
-
- cfs = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();
-
-
-
- cfs.buildClassifier(ins);
-
-
-
-
- Instance testInst;
-
-
-
-
- Evaluation testingEvaluation = new Evaluation(ins);
- int length = ins.numInstances();
- for (int i =0; i < length; i++) {
- testInst = ins.instance(i);
-
- testingEvaluation.evaluateModelOnceAndRecordPrediction(
- cfs, testInst);
- }
-
-
-
-
-
- System.out.println( "分类器的正确率:" + (1- testingEvaluation.errorRate()));
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
通过这个实例,我们可以看到在weka上做开发非常简单的,每个模块weka都提供了很好的支持。同时,我们可以在此基础上对weka进行一个简单的封装。设计一个Util类,将数据读取,以及分类器测试等功能放在这个Util类中共以后其它的程序使用。
获取样本Instances
-
-
-
-
- public static Instances getInstances(String fileName) throws Exception{
- File file= new File(fileName);
- return getInstances(file);
- }
-
-
-
-
- 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对象:
-
-
-
-
-
- public static Evaluation getEvaluation(Classifier h,Instances ins){
- try{
- Instance testInst;
-
-
-
-
- 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函数中了,下次我们使用的时候就可以方便的调用这个接口了,可以省去我们写这些代码的时间了。
大家明白了吗?还是比较简单的吧。
(anqiang1984) |