使用 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 个可能值的标称类: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

为什么会这样?

【问题讨论】:

那是预测的类标签 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 进行错误的类预测的主要内容,如果未能解决你的问题,请参考以下文章

weka 中的机器学习分类和预测

如何使用 weka 进行预测

如何在 WEKA 中测试分类数据集?

在命令行中导出 Weka 预测

Weka 预测(百分比置信度) - 这是啥意思?

WEKA中的预测结果是啥意思?