使用 Weka 的 class 预测不正确

Incorrect class prediction using Weka

我正在使用 WEKA API weka-stable-3.8.1.
我一直在尝试使用 J48 决策树(weka 的 C4.5 实现)。 我的数据有大约 22 个特征和一个名义上的 class,有 2 个可能的值:yesno.
使用以下代码进行评估时:

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.

为什么会这样?

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

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

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

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

training 阶段,模型从您的训练集中学习。在从这个集合中学习时,它也会遇到 categorical/nominal 个特征。

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

由于算法在训练阶段已经了解了这一点,因此 Instances 对象保存了这一信息。在 testing 阶段,您必须使用在 training 阶段创建的相同 Instances 对象。否则,测试分类器将无法将您的标称值正确映射到它们的预期值。

注:

This kind of encoding gives biased training results in Non-tree based models and things like One-Hot-Encoding should be used in such cases.