使用 Weka 进行错误的类预测
Posted
技术标签:
【中文标题】使用 Weka 进行错误的类预测【英文标题】:Incorrect class prediction using Weka 【发布时间】:2017-12-07 20:02:30 【问题描述】:我正在使用 WEKA API weka-stable-3.8.1。 我一直在尝试使用J48 决策树(weka 的 C4.5 实现)。 我的数据有大约 22 个特征和一个具有 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。
为什么会这样?
【问题讨论】:
那是预测的类标签 0,也许你的测试实例只包含类标签 0,因此一切都是正确的。 不,我尝试了不同的测试用例,结果已知。还尝试了训练集中的实例。 可能是您的测试实例与训练实例完全不同。您是否尝试过在您的训练集上评估您的模型? 使用训练集进行评估可以达到 100% 的准确率。 在这种情况下,您的模型训练了您的数据集。请问你们的训练和测试数据有多大? 【参考方案1】:如果提供的 sn-p 确实来自您的代码,您似乎总是对第一个测试实例进行分类:“testingInstances.firstInstance()”。
相反,您可能希望创建一个循环来对每个测试实例进行分类。
for(Instance i : testingInstances)
double predictedClassLabel = model.classifyInstance(i);
System.out.println("predictedClassLabel : "+predictedClassLabel);
【讨论】:
即使在遍历所有测试用例之后,所有结果的输出都是 0.0。问题是无论测试用例是什么:o/p 总是 0.0. 修改问题以获得更好的解释。【参考方案2】:应该更新得更快。 这是我解决此问题的方法:
在training
阶段,模型从您的训练集中学习。在从这个集合中学习时,它也遇到了categorical/nominal 特征。
大多数算法都需要数值才能工作。为了解决这个问题,算法将变量映射到特定的数值。 longer explanation here
由于算法在训练阶段已经学会了这一点,Instances
对象保存了这些信息。在testing
阶段,您必须使用在training
阶段创建的相同Instances
对象。否则,测试分类器不会正确地将您的标称值映射到它们的预期值。
注意:
这种编码在
Non-tree based models
中提供biased 训练结果,在这种情况下应该使用One-Hot-Encoding 之类的东西。
【讨论】:
以上是关于使用 Weka 进行错误的类预测的主要内容,如果未能解决你的问题,请参考以下文章