这次我们介绍Evaluation类。在上一次中我们只是单纯的预测了分类值,并没有其他评价数据。这场我们使用Evalution类。首先初始化一个Evaluation对象,Evaluation类没有无参的构造函数,一般用Instances对象作为构造函数的参数。如果我们没有训练数据和测试数据,那么我们可以使用Cross Validation验证方式,即交叉验证。Cross ValidateModel方法的四个参数分别为,第一个是分类器,第二个是在某个数据集上评价的数据集,第三个参数是交叉检验的次数(10是比较常见的),第四个是一个随机数对象。 如果有训练集和测试集,可以使用Evaluation 类中的evaluateModel方法,方法中的参数为:第一个为一个训练过的分类器,第二个参数是在某个数据集上评价的数据集。
package InstanceTest;
import weka.core.Instances;import weka.classifiers.trees.J48;import weka.classifiers.Evaluation;import java.io.*;import java.util.Random;public class InstanceTest {/**
* @param args */ public static Instances data; //训练数据 public static Instances testData; //测试数据 //获取数据集 public Instances GetTestDate(String File,boolean flag) throws Exception { FileReader reader=new FileReader(File); if(!flag) { testData=new Instances(reader); return testData; } else { data=new Instances(reader); return data; } } //设置预测类别 默认为最后一个 public void SetClassIndex(Instances ins) { ins.setClassIndex(ins.numAttributes()-1); } /* public void classify()throws Exception { J48 classify=new J48(); classify.buildClassifier(data); System.out.println(classify.classifyInstance(data.instance(0))); } */ public void CrossValidation()throws Exception { J48 classify=new J48(); Evaluation eval=new Evaluation (data); eval.crossValidateModel(classify, data, 10, new Random(1)); System.out.println(eval.toClassDetailsString()); System.out.println(eval.toSummaryString()); System.out.println(eval.toMatrixString()); } public void validation()throws Exception { J48 classify=new J48(); classify.buildClassifier(data); Evaluation eval=new Evaluation(testData); eval.evaluateModel(classify, testData); System.out.println(eval.toClassDetailsString()); System.out.println(eval.toSummaryString()); System.out.println(eval.toMatrixString()); } public static void main(String[] args) { try { InstanceTest test=new InstanceTest(); test.GetTestDate("C://Program Files//Weka-3-7//data//segment-challenge.arff", true); test.GetTestDate("C://Program Files//Weka-3-7//data//segment-test.arff", false); test.SetClassIndex(data); test.SetClassIndex(testData); test.validation(); } catch(Exception e) { e.printStackTrace(); }}}