一直是用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());//输出分类的混淆矩阵
}