我在使用模型进行训练和再次分类时遇到了问题。
我能够正确地获取第一部分的统计数据,但第二部分却不行。在再次评估时出现了nullPointerException。我尝试了各种操作,比如在代码中创建一个实例进行测试等。
java.lang.NullPointerException at weka.classifiers.trees.m5.M5Base.classifyInstance(M5Base.java:514) at wekaTest.<init>(wekaTest.java:44) at wekaTest.main(wekaTest.java:71)
我编写的代码片段如下:
wekaTest(){ try { FileReader reader = new FileReader("3.arff"); Instances instances = new Instances(reader); // 将最后一个属性设置为类属性 int numAttr = instances.numAttributes(); instances.setClassIndex( numAttr - 1); M5P tree = new M5P(); Evaluation eval = new Evaluation(instances); eval.crossValidateModel(tree, instances, 10, new Random(1)); System.out.println(eval.toSummaryString("\nResults\n======\n", false)); weka.core.SerializationHelper.write("/path/tree.model", tree); reader.close(); FileReader reader2 = new FileReader("3.arff"); Instances instances2 = new Instances(reader2); instances2.setClassIndex(instances2.numAttributes() - 1); reader2.close(); Instances labeled = new Instances(instances2); Classifier cls = (Classifier) weka.core.SerializationHelper.read("/path/tree.model"); //instances2.deleteAttributeAt(numAttr-1); for(int j=0; j<instances2.numInstances() ;j++) { //instance temp = new instance(instances2.instance(j)); //instances2.instance(j).setValue(numAttr-1,-1); System.out.println("The instance: " + instances2.instance(j)); double clsLabel = tree.classifyInstance(instances2.instance(j)); labeled.instance(j).setClassValue(clsLabel); } } catch(Exception ex) { ex.printStackTrace(); }}
回答:
谢谢@。实际上,你是对的!当我在10折交叉验证后写入时,变量尚未初始化。
代码片段如下:
try { FileReader reader2 = new FileReader("3.arff"); Instances instances2 = new Instances(reader2); instances2.setClassIndex(instances2.numAttributes() - 1); reader2.close(); int numAttr = instances2.numAttributes(); Instances labeled = new Instances(instances2); Classifier cls = (Classifier) weka.core.SerializationHelper.read("/home/sumit/Desktop/weka test/tree.model"); cls.setDebug(true); Instance inst = new Instance(4); inst.setValue(0, instances2.instance(0).value(0)); inst.setValue(1, instances2.instance(0).value(1)); inst.setValue(2, instances2.instance(0).value(2)); inst.setValue(3, -1); double clsLabelTest = cls.classifyInstance(inst); System.out.println(clsLabelTest); //instances2.deleteAttributeAt(numAttr-1); for(int j=0; j<instances2.numInstances() ;j++) { //instance temp = new instance(instances2.instance(j)); instances2.instance(j).setValue(numAttr-1,-1); //System.out.println("The instance: " + instances2.instance(j)); double clsLabel = cls.classifyInstance(instances2.instance(j)); labeled.instance(j).setClassValue(clsLabel); } BufferedWriter writer = new BufferedWriter(new FileWriter("/home/sumit/Desktop/weka test/labeled.arff")); writer.write(labeled.toString()); writer.newLine(); writer.flush(); writer.close(); // 测试模型 //Evaluation eTest = new Evaluation(instances2); //eTest.evaluateModel(cls, instances2); }