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();
//在使用樣本之前一定要首先設置instances的classIndex,否則在使用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 獲得instances的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對象:
/*
* 獲得一個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函數中了,下次我們使用的時候就可以方便的調用這個接口了,可以省去我們寫這些代碼的時間了。
大家明白了嗎?還是比較簡單的吧。