Weka学习三(ensemble算法)
前兩次我們講了數(shù)據(jù)挖掘中比較常見的兩類方法。這次我來介紹一下ensemble(集成技術(shù)),總的來說,ensemble技術(shù)是歸類在分類中的。它的主要原理是通過集成多個分類器的效果來達(dá)到提高分類效果的目的。簡單我們可以通過兩張圖片來看看集成的效果:
圖一為多個基分類器單獨(dú)工作時的分類效果圖。圖二為集成分類器的分類效果。我們可以看到集成分類器的分類曲線明顯會平滑的多。來個比喻,在一件事情的表決上面,一個人的意見與多個人的意見相比,往往是多個人的意見來的準(zhǔn)確一些。這是大概解釋我們要提倡民主決策的原因吧。
Ensemble技術(shù)在數(shù)據(jù)挖掘方向主要在以下三個方向做工作:
1.?????? 在樣本上做文章,基分類器為同一個分類算法,主要的技術(shù)有bagging,boosting;
2.?????? 在分類算法上做工作,即用于訓(xùn)練基分類器的樣本相同,基分類器的算法不同,這是本文采用的方法;
3.?????? 在樣本屬性集上做文章,即在不同的屬性空間上構(gòu)建基分類器,比較出名的是randomforestTree算法,這個在weka中也有實(shí)現(xiàn)。
現(xiàn)在我們來看看ensemble技術(shù)在weka中的實(shí)現(xiàn)過程。
package com.csdn;
?
import java.io.File;
?
import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.meta.Vote;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.SelectedTag;
import weka.core.converters.ArffLoader;
?
/*
?* Date: 2009.4.3
?* by: Wang Yi
?* Email: wangyi19840906@yahoo.com.cn
?* QQ: 270135367
?*
?*/
?
public class SimpleEnsemble {
?
??? /**
??? ?* @param args
??? ?*/
??? public static void main(String[] args) {
?????? // TODO Auto-generated method stub
?????? Instances trainIns = null;
?????? Instances testIns = null;
?????? Classifier cfs1 = null;
?????? Classifier cfs2 = null;
?????? Classifier cfs3 = null;
?????? Classifier[] cfsArray = new Classifier[3];
??????
?????? try{
??????????
?????????? /*
?????????? ?* 1.讀入訓(xùn)練、測試樣本
?????????? ?* 在此我們將訓(xùn)練樣本和測試樣本是由weka提供的segment數(shù)據(jù)集構(gòu)成的
?????????? ?*/
?????????? File file= new File("C://Program Files//Weka-3-6//data//segment-challenge.arff");
?????????? ArffLoader loader = new ArffLoader();
?????????? loader.setFile(file);
?????????? trainIns = loader.getDataSet();
??????????
?????????? file = new File("C://Program Files//Weka-3-6//data//segment-test.arff");
?????????? loader.setFile(file);
?????????? testIns = loader.getDataSet();
??????????
?????????? //在使用樣本之前一定要首先設(shè)置instances的classIndex,否則在使用instances對象是會拋出異常
?????????? trainIns.setClassIndex(trainIns.numAttributes()-1);
?????????? testIns.setClassIndex(testIns.numAttributes()-1);
??????????
??????????
?????????? /*
?????????? ?* 2.初始化基分類器
?????????? ?* 具體使用哪一種特定的分類器可以選擇,請將特定分類器的class名稱放入forName函數(shù)
?????????? ?* 這樣就構(gòu)建了一個簡單的分類器
?????????? ?*/
?????????? //貝葉斯算法
?????????? cfs1 = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();
?????????? //決策樹算法,是我們常聽說的C45的weka版本,不過在我看代碼的過程中發(fā)現(xiàn)有一些與原始算法有點(diǎn)區(qū)別的地方。
?????????? //即在原始的C45算法中,我們規(guī)定沒有一個屬性節(jié)點(diǎn)在被使用(即被作為一個分裂節(jié)點(diǎn)以后,他將被從屬性集合中去除掉)。
?????????? //但是在J48中沒有這樣做,它依然在下次分裂點(diǎn)前,使用全部的屬性集合來探測一個合適的分裂點(diǎn)。這樣做好不好?
?????????? cfs2 = (Classifier)Class.forName("weka.classifiers.trees.J48").newInstance();
?????????? //什么東東,不知道做什么用,平常很少用。本想要用LibSVM的,但是由于要加載一些包,比較麻煩。
?????????? cfs3 = (Classifier)Class.forName("weka.classifiers.rules.ZeroR").newInstance();
????????????????????
?????????? /*
?????????? ?* 3.構(gòu)建ensemble分類器
?????????? ?*/
??????????
?????????? cfsArray[0] = cfs1;
?????????? cfsArray[1] = cfs2;
?????????? cfsArray[2] = cfs3;
??????????
?????????? Vote ensemble = new Vote();
?????????? /*
?????????? ?* 訂制ensemble分類器的決策方式主要有:
?????????? ?* AVERAGE_RULE
?????????? ?* PRODUCT_RULE
?????????? ?* MAJORITY_VOTING_RULE
?????? ??? ?* MIN_RULE
?????????? ?* MAX_RULE
?????????? ?* MEDIAN_RULE
?????????? ?* 它們具體的工作方式,大家可以參考weka的說明文檔。
?????????? ?* 在這里我們選擇的是多數(shù)投票的決策規(guī)則
?????????? ?*/
?????????? SelectedTag tag1 = new SelectedTag(
????????????????? Vote.MAJORITY_VOTING_RULE, Vote.TAGS_RULES);
?
?????????? ensemble.setCombinationRule(tag1);
?????????? ensemble.setClassifiers(cfsArray);
?????????? //設(shè)置隨機(jī)數(shù)種子
?????????? ensemble.setSeed(2);
?????????? //訓(xùn)練ensemble分類器
?????????? ensemble.buildClassifier(trainIns);
??????????
?????????? /*
?????????? ?* 4.使用測試樣本測試分類器的學(xué)習(xí)效果
?????????? ?* 在這里我們使用的訓(xùn)練樣本和測試樣本是同一個,在實(shí)際的工作中需要讀入一個特定的測試樣本
?????????? ?*/
?????????? Instance testInst;
?????????? /*
?????????? ?* Evaluation: Class for evaluating machine learning models
?????????? ?* 即它是用于檢測分類模型的類
?????????? ?*/
?????????? Evaluation testingEvaluation = new Evaluation(testIns);
?????? ??? int length = testIns.numInstances();
?????????? for (int i =0; i < length; i++) {
????????????? testInst = testIns.instance(i);
????????????? //通過這個方法來用每個測試樣本測試分類器的效果
????????????? testingEvaluation.evaluateModelOnceAndRecordPrediction(
???????????????????? ensemble, testInst);
?????? ??? }
??????????
?????????? /*
?????????? ?* 5.打印分類結(jié)果
?????????? ?* 在這里我們打印了分類器的正確率
?????????? ?* 其它的一些信息我們可以通過Evaluation對象的其它方法得到
?????????? ?*/
?????????? System.out.println( "分類器的正確率:" + (1- testingEvaluation.errorRate()));
?????? }catch(Exception e){
?????????? e.printStackTrace();
?????? }
??? }
?
}
在weka中主要是通過weka.classifiers.meta.Vote來實(shí)現(xiàn),基分類器是通過基分類器數(shù)組來設(shè)置的。同時我們可以自己設(shè)置集成分類器的決策方法,較為常用的是多數(shù)投票算法。
我在寫下這篇文章是對ensemble分類器在segment數(shù)據(jù)集上的分類效果做了一個小小的測試,它對測試集segement-test的分類效果是0.8309的正確率。而我在使用單個分類器NaiveBayes,J48, ZeroR時它們的分類效果分別為0.7704、0.9617、0.1106 這樣我們可以看到,ensemble分類器是可以矯正弱分類器的分類效果的。
總的來說,我在做實(shí)驗(yàn)的過程中,大部分的實(shí)驗(yàn)結(jié)果都表明ensemble技術(shù)確實(shí)是可以提高分類效果。當(dāng)然這也是有國際上大牛的證明的,可不是我一個人這樣說的。
總結(jié)
以上是生活随笔為你收集整理的Weka学习三(ensemble算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Weka学习二(聚类算法)
- 下一篇: Weka学习四(属性选择)