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上做開發非常簡單的,每個模塊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函數中了,下次我們使用的時候就可以方便的調用這個接口了,可以省去我們寫這些代碼的時間了。

大家明白了嗎?還是比較簡單的吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章