使用Weka的类预测不正确

时间:2017-07-04 11:11:56

标签: java machine-learning classification weka decision-tree

我正在使用WEKA API weka-stable-3.8.1 我一直在尝试使用J48决策树(weka的C4.5实现)。 我的数据包含大约22个功能和一个具有2个可能值的标称类:
在使用以下代码进行评估时:

Classifier model = (Classifier) weka.core.SerializationHelper.read(trainedModelDestination);
Evaluation evaluation = new Evaluation(trainingInstances);
evaluation.evaluateModel(model, testingInstances);
System.out.println("Number of correct predictions : "+evaluation.correct());


我得到所有预测正确。 但是,当我单独使用以下方法尝试这些测试用例时:

for(Instance i : testingInstances){
    double predictedClassLabel = model.classifyInstance(i);
    System.out.println("predictedClassLabel : "+predictedClassLabel);
}


我总是得到相同的输出,即 0.0

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:0)

如果提供的代码段确实来自您的代码,您似乎总是在对第一个测试实例进行分类:" testingInstances.firstInstance()"。

相反,您可能希望创建一个循环来对每个测试实例进行分类。

for(Instance i : testingInstances){
    double predictedClassLabel = model.classifyInstance(i);
    System.out.println("predictedClassLabel : "+predictedClassLabel);
}

答案 1 :(得分:0)

应该早点更新。 这是我的解决方法:

training阶段,模型从您的训练集中学习。从该集合中学习时,它还会遇到categorical/nominal个功能。

大多数算法都需要数值才能起作用。为了解决这个问题,算法将变量映射到特定的数值。 longer explanation here

由于算法在训练阶段已获悉,Instances对象将保留此信息。在testing阶段,您必须使用在Instances阶段创建的同一training对象。否则,测试分类器将无法正确将标称值映射到其期望值。

注意:

  

这种编码会在Non-tree based models中给biased训练结果,在这种情况下应使用One-Hot-Encoding之类的东西。