我正在使用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 。
为什么会发生这种情况?
答案 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之类的东西。