Weka学习一(分类器算法)
http://liouwei20051000285.blog.163.com/blog/static/252367420091016104326723/
從前年開(kāi)始使用weka最數(shù)據(jù)挖掘方面的研究,到現(xiàn)在有一年半的時(shí)間了。看到我們同組的兄弟寫了關(guān)于weka方面的總結(jié),我也想整理一下。因?yàn)榫W(wǎng)上的資料實(shí)在是太少,記得剛接手的時(shí)候,真是硬著頭皮看代碼。不過(guò)到現(xiàn)在看來(lái),也積累了很多的代碼了。希望能夠在這里跟大家分享一下學(xué)習(xí)weka的樂(lè)趣與經(jīng)驗(yàn)。
Weka是來(lái)之新西蘭懷卡托大學(xué)的一款開(kāi)源軟件,主要是數(shù)據(jù)挖掘方面的一些算法的集合。這款軟件大概是當(dāng)前數(shù)據(jù)挖掘領(lǐng)域最好的開(kāi)源軟件了,當(dāng)然國(guó)外還有其它一些組織維護(hù)的有自己的開(kāi)源軟件,但是只有這款軟件應(yīng)用是比較廣泛的了。具體關(guān)于weka的信息可以到官網(wǎng)去查看http://www.cs.waikato.ac.nz/ml/weka/ ,軟件的下載也可大家到官網(wǎng)去。
我是從weka1.4一直用到現(xiàn)在的1.6版本的,其間weka在圖形界面上有一些變動(dòng),但是底層的框架結(jié)構(gòu)沒(méi)有太大的變化,主要是添加一些新的算法什么的。總之大家可以放心的使用。我現(xiàn)在積累的代碼是從1.5版本積累下來(lái)的,到現(xiàn)在1.6版本,集成起來(lái)一點(diǎn)問(wèn)題都沒(méi)有,這大概也是我喜歡weka的一個(gè)原因。
數(shù)據(jù)挖掘的過(guò)程一般如下:
1.?????? 讀入訓(xùn)練、測(cè)試樣本
2.?????? 初始化分類器
3.?????? 使用訓(xùn)練樣本訓(xùn)練分類器
4.?????? 使用測(cè)試樣本測(cè)試分類器的學(xué)習(xí)效果
5.?????? 打印分類結(jié)果
我們現(xiàn)在看看一個(gè)簡(jiǎn)單的實(shí)例
?
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;
?
/*
?* Date: 2009.4.1
?* by: Wang Yi
?* Email: wangyi19840906@yahoo.com.cn
?* QQ: 270135367
?*
?*/
public class Test {
?
??? /**
??? ?* @param args
??? ?*/
??? public static void main(String[] args) {
?????? // TODO Auto-generated method stub
?????? Instances ins = null;
??????
?????? Classifier cfs = null;
?????? try{
??????????
?????????? /*
?????????? ?* 1.讀入訓(xùn)練、測(cè)試樣本
?????????? ?* 在此我們將訓(xùn)練樣本和測(cè)試樣本作為同一個(gè)樣本
?????????? ?*/
?????????? File file= new File("C://Program Files//Weka-3-6//data//contact-lenses.arff");
?????????? ArffLoader loader = new ArffLoader();
?????????? loader.setFile(file);
?????????? ins = loader.getDataSet();
??????????
?????????? //在使用樣本之前一定要首先設(shè)置instances的classIndex,否則在使用instances對(duì)象是會(huì)拋出異常
?????????? ins.setClassIndex(ins.numAttributes()-1);
??????????
?????????? /*
?????????? ?* 2.初始化分類器
?????????? ?* 具體使用哪一種特定的分類器可以選擇,請(qǐng)將特定分類器的class名稱放入forName函數(shù)
?????????? ?* 這樣就構(gòu)建了一個(gè)簡(jiǎn)單的分類器
?????????? ?*/
?????????? cfs = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();
??????????
?????????? /*
?????????? ?* 3.使用訓(xùn)練樣本訓(xùn)練分類器
?????????? ?*/
?????????? cfs.buildClassifier(ins);
??????????
??????????
?????????? /*
?????????? ?* 4.使用測(cè)試樣本測(cè)試分類器的學(xué)習(xí)效果
?????????? ?* 在這里我們使用的訓(xùn)練樣本和測(cè)試樣本是同一個(gè),在實(shí)際的工作中需要讀入一個(gè)特定的測(cè)試樣本
?????????? ?*/
?????????? Instance testInst;
?????????? /*
?????????? ?* Evaluation: Class for evaluating machine learning models
?????????? ?* 即它是用于檢測(cè)分類模型的類
?????????? ?*/
?????????? Evaluation testingEvaluation = new Evaluation(ins);
?????? ??? int length = ins.numInstances();
?????????? for (int i =0; i < length; i++) {
????????????? testInst = ins.instance(i);
????????????? //通過(guò)這個(gè)方法來(lái)用每個(gè)測(cè)試樣本測(cè)試分類器的效果
????????????? testingEvaluation.evaluateModelOnceAndRecordPrediction(
????????????????? cfs, testInst);
?????? ??? }
??????????
?????????? /*
?????????? ?* 5.打印分類結(jié)果
?????????? ?* 在這里我們打印了分類器的正確率
?????????? ?* 其它的一些信息我們可以通過(guò)Evaluation對(duì)象的其它方法得到
?????????? ?*/
?????????? System.out.println( "分類器的正確率:" + (1- testingEvaluation.errorRate()));
?????? }catch(Exception e){
?????????? e.printStackTrace();
?????? }
??? }
?
}
?
通過(guò)這個(gè)實(shí)例,我們可以看到在weka上做開(kāi)發(fā)非常簡(jiǎn)單的,每個(gè)模塊weka都提供了很好的支持。同時(shí),我們可以在此基礎(chǔ)上對(duì)weka進(jìn)行一個(gè)簡(jiǎn)單的封裝。設(shè)計(jì)一個(gè)Util類,將數(shù)據(jù)讀取,以及分類器測(cè)試等功能放在這個(gè)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對(duì)象
??? ?*/
??? 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;
??? }
?
獲得一個(gè)Evaluation對(duì)象:
/*
??? ?* 獲得一個(gè)Evaluation對(duì)象
??? ?* 1.h 一個(gè)已經(jīng)訓(xùn)練過(guò)的分類器
??? ?* 2.ins 測(cè)試樣本
??? ?*/
??? public static Evaluation getEvaluation(Classifier h,Instances ins){
?????? try{
?????????? Instance testInst;
?????????? /*
?????????? ?* Evaluation: Class for evaluating machine learning models
?????????? ?* 即它是用于檢測(cè)分類模型的類
?????????? ?*/
?????????? Evaluation testingEvaluation = new Evaluation(ins);
?????? ??? int length = ins.numInstances();
?????????? for (int i =0; i < length; i++) {
????????????? testInst = ins.instance(i);
????????????? //通過(guò)這個(gè)方法來(lái)用每個(gè)測(cè)試樣本測(cè)試分類器的效果
????????????? testingEvaluation.evaluateModelOnceAndRecordPrediction(
?????? ??????????? h, testInst);
??? ??? ??? }
?????? ??? return testingEvaluation;
?????? }
?????? catch(Exception e){
?????????? System.out.println("haha bug!");
?????????? System.out.println(e);
?????? }
?????? return null;?????
??? }
?
通過(guò)這幾個(gè)函數(shù)我們就將讀取instances對(duì)象的功能以及測(cè)試分類器的效果的功能封裝到兩個(gè)static函數(shù)中了,下次我們使用的時(shí)候就可以方便的調(diào)用這個(gè)接口了,可以省去我們寫這些代碼的時(shí)間了。
大家明白了嗎?還是比較簡(jiǎn)單的吧。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Weka学习一(分类器算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: libsvm2.9数据格式
- 下一篇: Weka学习二(聚类算法)