Java调用weka.jar利用交叉验证方法进行分类

一直是用weka的explorer进行分类,但是现在需要重复实验100次,人工肯定搞不定了,所以试着写代码调用weka.jar来实现之前的方法。

首先不知道怎么调用J48方法,之后又不知道怎么实现交叉验证方法,后面又不知道怎么进行评价,其实,weka.jar都给实现了,只管简单调用就行。也就是说explorer能实现的weka.jar都能实现,关键是去查看帮助文档和源代码,知道是哪个方法实现了哪个功能,该如何设置参数问题而已。

为了避免忘记,附代码备份。

public static void J48ByWeka(String filePath) throws Exception{
  File file=new File(filePath);
  ArffLoader loader=new ArffLoader();//Reads a source that is in arff (attribute relation file format) format.
  loader.setFile(file);
  Instances dataSet = loader.getDataSet();//得到数据集的数据结构
  dataSet.setClassIndex(dataSet.numAttributes()-1);//设置数据集中表示类别的属性
  J48 dt = new J48();//实例化一个J48的决策树对象
  //dt.setMinNumObj(100);//The minimum number of instances per leaf
  //1、建立分类器模型
  dt.buildClassifier(dataSet);
  //System.out.println(dt.toString());//输出训练模型
  
  // 自己实现评测
  //2、利用模型进行预测 
  int a=0,b=0,c=0,d=0;//记录每个类别的个数,方便计算评价指标
  for(int i=0;i
   double classification = dt.classifyInstance(dataSet.instance(i));
   double classValue = dataSet.instance(i).classValue();
   if(classification==0.0 && classValue==0.0){
    a++;
   }else if(classification==0.0 && classValue==1.0){
    b++;
   }else if(classification==1.0 && classValue==0.0){
    c++;
   }else if(classification==1.0 && classValue==1.0){
    d++;
   }
  } 
  
  //3、得出预测效果评测指标 
  double precision = (double)a/(a+b);
  double recall = (double)a/(a+c);
  double fMeasure = 2*precision*recall/(precision+recall);
  System.out.println("precision\trecall\tF-Measure");
  System.out.println(String.format("%.3f", precision)+"\t\t"+String.format("%.3f", recall)+"\t"+String.format("%.3f", fMeasure));
  
  //直接调用Evaluation即可完成
  Evaluation eval=null;
  for(int i=0;i<10;i++){
   eval=new Evaluation(dataSet);
   eval.crossValidateModel(dt, dataSet, 10, new Random(i));//实现交叉验证模型
  }
  System.out.println(eval.toSummaryString());//输出总结信息
  System.out.println(eval.toClassDetailsString());//输出分类详细信息
  System.out.println(eval.toMatrixString());//输出分类的混淆矩阵

 }


猜你喜欢

转载自blog.csdn.net/it_beecoder/article/details/80816761