我使用的是WEKA API weka-stable-3.8.1。
我尝试使用J48决策树(Weka的C4.5实现)。我的数据大约有22个特征和一个名义类,有两个可能的值:是或不是。
在使用以下代码进行评估时:
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。
为什么会这样?
回答:
应该早点更新。这是我如何解决这个问题的:
在训练
阶段,模型从你的训练集学习。在学习过程中,它也会遇到分类/名义特征。
大多数算法需要数值来工作。为了处理这个问题,算法将变量映射到特定的数值。这里有更详细的解释
由于算法在训练阶段已经学会了这一点,Instances
对象保存了这些信息。在测试
阶段,你必须使用在训练
阶段创建的相同Instances
对象。否则,测试分类器将无法正确地将你的名义值映射到预期的值。
注意: