使用 Weka 的 class 预测不正确
Incorrect class prediction using Weka
我正在使用 WEKA API weka-stable-3.8.1.
我一直在尝试使用 J48 决策树(weka 的 C4.5 实现)。
我的数据有大约 22 个特征和一个名义上的 class,有 2 个可能的值:yes 或 no.
使用以下代码进行评估时:
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.
我正在使用 WEKA API weka-stable-3.8.1.
我一直在尝试使用 J48 决策树(weka 的 C4.5 实现)。
我的数据有大约 22 个特征和一个名义上的 class,有 2 个可能的值:yes 或 no.
使用以下代码进行评估时:
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.