WEKA - 从MultiClassClassifier

时间:2016-03-07 18:51:41

标签: java machine-learning classification svm weka

我想获得一些信息。在某些测试实例的分类过程中。我正在使用带有选项SMO的MultiClassClassification模型来预测类。我找到了一些代码here,但这只显示了一些基本信息(id,起始类和预测类)。这真的很酷,但我想把这个樱桃放在首位。

以下是代码:

double classLabel = cModel.classifyInstance(testInstances.instance(i));
System.out.print("ID: " + testInstances.instance(i).value(0));
System.out.print(", actual: " + testInstances.classAttribute().value((int) testInstances.instance(i).classValue()));
System.out.println(", predicted: " + testInstances.classAttribute().value((int) classLabel));
labeled.instance(i).setClassValue(classLabel);

以下是控制台中显示内容的一个输出示例(一切正常,分类效果很好):

  

ID:10.840449559881472,实际:class_1,预测:class_12

我想在输出中添加一个概率值,为预测的类显示介于0和1之间的值(例如0.80 ...)。我怎样才能做到这一点?

我试过这个:double[] p = cModel.individualPredictions(testInstances.instance(i)); 但这会返回我真正无法理解的数字。

输出示例:

  

7.664525149317826E-177

修改

确定。现在我已经使用了distributionForInstance方法,它实际上返回了一些实数(之前使用它并且它给了我那些奇怪的数字),但是对于某些情况的预测真的很低,尽管它们被正确分类。可能需要向我的分类器添加更多样本,但至少现在可以给出结果。

这段代码显示结果(供将来参考):

double[] p = cModel.distributionForInstance(testInstances.instance(i));

一些正确分类的未知样本的预测示例:

  

0.6801721826680843 - 示例1第12类

     

0.9834993119977282 - 示例2第14类

     

0.20165539938974703 - 示例3第1类

     

0.9947991411834111 - 示例4第9类

     

0.9809472418105786 - 示例5第3类

可能会坚持使用这个解决方案,因为它是迄今为止我发现的最合理的解决方案。

再次感谢。

2 个答案:

答案 0 :(得分:0)

当你还需要预测“无类别”类别时,你会如何解决挑战问题? Predicting the "no class" / unrecognised class in Weka Machine Learning

答案 1 :(得分:0)

所以,我会冒昧地回答我自己的问题,因为我想帮助SO关闭它并继续前进。

classifyInstance()方法将实例分类为某个类,并且没有提供我正在寻找的必要数据。

我已经尝试了double[] p = cModel.individualPredictions(testInstances.instance(i));double[] p = cModel.distributionForInstance(testInstances.instance(i));,两者都返回了结果。

我坚持使用cModel.distributionForInstance(testInstances.instance(i));方法,因为我需要从结果中手动排除某些类。忽略MultiClassClassifier中不需要的分发是目前唯一可行的解​​决方案。这暂时解决了我对于与我想要的决定相距太远的类的过滤问题。

以下是相关帖子:WEKA - filtering out classes in a MultiClassClassifier

再次感谢。