WEKA - 从 MultiClassClassifier 获取预测值

WEKA - obtain prediction values from a MultiClassClassifier

我想获取一些信息。在class一些测试实例的化过程中。我正在使用带有 SMO 选项的 MultiClassClassification 模型来预测 classes。我找到了一些代码 here 但这只显示了一些基本信息(id,起始 class 和预测 class)。这真的很酷,但我想要那个樱桃在上面。

代码如下:

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);

这是控制台中显示的输出示例(一切正常,class化工作正常):

ID: 10.840449559881472, actual: class_1, predicted: class_12

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

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

输出示例:

7.664525149317826E-177

编辑:

好的。现在我使用了 distributionForInstance 方法,它实际上返回了一些实数(以前用过它,它给了我那些奇怪的),但是某些情况下的预测确实很低,尽管它们是正确的 class化。可能需要向我的 classifier 添加更多样本,但至少它现在给出了结果。

这段代码显示结果(供以后参考):

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

部分正确class化未知样本的预测示例:

0.6801721826680843 -- example 1 class 12

0.9834993119977282 -- example 2 class 14

0.20165539938974703 -- example 3 class 1

0.9947991411834111 -- example 4 class 9

0.9809472418105786 -- example 5 class 3

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

再次感谢。

当您还需要预测 "no class" 类别时,您将如何应对挑战? Predicting the "no class" / unrecognised class in Weka Machine Learning

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

classifyInstance()方法class将实例化为class,但没有提供我正在寻找的必要数据。

我试过 double[] p = cModel.individualPredictions(testInstances.instance(i));double[] p = cModel.distributionForInstance(testInstances.instance(i)); 都返回了结果。

我坚持使用 cModel.distributionForInstance(testInstances.instance(i)); 方法,因为我需要从我的结果中手动排除一些 classes。忽略来自 MultiClassClassifier 的不需要的分布是目前唯一可能的解决方案。这暂时解决了我对 classes 的过滤问题,这些问题与我想要的确定相去甚远。

这是相关的post:

再次感谢。