前两次我们讲了数据挖掘中比较常见的两类方法。这次我来介绍一下ensemble(集成技术),总的来说,ensemble技术是归类在分类中的。它的主要原理是通过集成多个分类器的效果来达到提高分类效果的目的。简单我们可以通过两张图片来看看集成的效果
图一为多个基分类器单独工作时的分类效果图。图二为集成分类器的分类效果。我们可以看到集成分类器的分类曲线明显会平滑的多。来个比喻,在一件事情的表决上面,一个人的意见与多个人的意见相比,往往是多个人的意见来的准确一些。这是为什么我们要提倡民主决策的原因。
Ensemble技术在数据挖掘方向主要在以下三个方向做工作:
1. 在样本上做文章,基分类器为同一个分类算法,主要的技术有bagging,boosting;
2. 在分类算法上做工作,即用于训练基分类器的样本相同,基分类器的算法不同,这是本文采用的方法;
3. 在样本属性集上做文章,即在不同的属性空间上构建基分类器,比较出名的是randomforestTree算法,这个在weka中也有实现。
现在我们来看看ensemble技术在weka中的实现过程。
- 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;
-
- public class SimpleEnsemble {
-
-
-
- public static void main(String[] args) {
-
- Instances trainIns = null;
- Instances testIns = null;
- Classifier cfs1 = null;
- Classifier cfs2 = null;
- Classifier cfs3 = null;
- Classifier[] cfsArray = new Classifier[3];
- try{
-
-
-
-
- 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();
-
- trainIns.setClassIndex(trainIns.numAttributes()-1);
- testIns.setClassIndex(testIns.numAttributes()-1);
-
-
-
-
-
-
-
- cfs1 = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();
-
-
-
- cfs2 = (Classifier)Class.forName("weka.classifiers.trees.J48").newInstance();
-
- cfs3 = (Classifier)Class.forName("weka.classifiers.rules.ZeroR").newInstance();
-
-
-
-
- cfsArray[0] = cfs1;
- cfsArray[1] = cfs2;
- cfsArray[2] = cfs3;
- Vote ensemble = new Vote();
-
-
-
-
-
-
-
-
-
-
-
- SelectedTag tag1 = new SelectedTag(
- Vote.MAJORITY_VOTING_RULE, Vote.TAGS_RULES);
- ensemble.setCombinationRule(tag1);
- ensemble.setClassifiers(cfsArray);
-
- ensemble.setSeed(2);
-
- ensemble.buildClassifier(trainIns);
-
-
-
-
- Instance testInst;
-
-
-
-
- Evaluation testingEvaluation = new Evaluation(testIns);
- int length = testIns.numInstances();
- for (int i =0; i < length; i++) {
- testInst = testIns.instance(i);
-
- testingEvaluation.evaluateModelOnceAndRecordPrediction(
- ensemble, testInst);
- }
-
-
-
-
-
- System.out.println( "分类器的正确率:" + (1- testingEvaluation.errorRate()));
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
在weka中主要是通过weka.classifiers.meta.Vote来实现,基分类器是通过基分类器数组来设置的。同时我们可以自己设置集成分类器的决策方法,较为常用的是多数投票算法。
我在写下这篇文章是对ensemble分类器在segment数据集上的分类效果做了一个小小的测试,它对测试集segement-test的分类效果是0.8309的正确率。而我在使用单个分类器NaiveBayes,J48, ZeroR时它们的分类效果分别为0.7704、0.9617、0.1106 这样我们可以看到,ensemble分类器是可以矫正弱分类器的分类效果的。
总的来说,我在做实验的过程中,大部分的实验结果都表明ensemble技术确实是可以提高分类效果。当然这也是有国际上大牛的证明的,可不是我一个人这样说的。
(anqiang1984) |