2017-02-08 42 views
0

我对weka相当陌生,但是我在java中使用朴素贝叶斯 - 我已经转向想要使用J48,并且一直在遇到这个错误。Weka-阵列指数出界

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1236 

它的上线:

double clsLabel = tree.classifyInstance(unlabeled.instance(i)); 

我试图打印(unlabeled.instance(I));它给了我一个例子。只要我尝试使用“分类实例”,就会出现错误。

该程序的培训部分似乎工作正常 - 我得到了一个打印多少它的正确分类等我试图复制一些数据从我的测试arff文件到要分类的arff文件,并没有停止这个错误,所以我觉得我的arff文件被分类的格式没问题。

我会发布下面的代码的其余部分 - 正如我所说的,当我使用朴素贝叶斯时它工作得很好。任何线索,为什么我有这个问题?

ConverterUtils.DataSource source = new ConverterUtils.DataSource("training.arff"); 
Instances train = source.getDataSet(); 

train.setClassIndex(train.numAttributes() - 1); 

StringToWordVector stringToWord = new StringToWordVector();       
stringToWord.setInputFormat(train); 
Instances newData = Filter.useFilter(train, stringToWord); 

J48 tree = new J48(); 
tree.buildClassifier(newData); 

// evaluate classifier and print some statistics 
Evaluation eval = new Evaluation(train); 
train.setClass((newData.attribute("class"))); 
eval.evaluateModel(tree, newData); 
System.out.println(eval.toSummaryString("\nResults\n======\n", false)); 
eval.crossValidateModel(tree, newData, 10, new Random(1)); 

Instances unlabeled = new Instances(new BufferedReader(new FileReader("input.arff"))); 
unlabeled.setClassIndex(unlabeled.numAttributes() - 1); 
Instances labeled = Filter.useFilter(unlabeled, stringToWord); 

for (int i = 0; i < unlabeled.size(); i++) { 
    double clsLabel = tree.classifyInstance(unlabeled.instance(i)); 
    labeled.instance(i).setClassValue(clsLabel); 
} 

BufferedWriter writer = new BufferedWriter(new FileWriter("outputgroup.arff")); 

回答