WEKA - 从 MultiClassClassifier 获取预测值

Posted

技术标签:

【中文标题】WEKA - 从 MultiClassClassifier 获取预测值【英文标题】:WEKA - obtain prediction values from a MultiClassClassifier 【发布时间】:2016-06-21 11:13:49 【问题描述】:

我想获取一些信息。在一些测试实例的分类过程中。我正在使用带有选项 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

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

再次感谢。

【问题讨论】:

double[] p = cModel.individualPredictions(testInstances.instance(i)) 这里的 p 包含实例属于实际类的概率。就像当你得到 p[0] = 7.664525149317826E-177 时,意味着实际实例属于 0 类的概率非常低。但是,您可以在 p 中找到其他类,其中概率更高。 感谢 Istvan 的解释。我真的很难解释这样的数字,因为我更了解 0 和 1 之间的概率。这些输出真的超出了我的范围。 :) 可能对你有帮助:***.com/questions/11960580/… 或者这个:***.com/questions/20605615/… 是的,我使用了distributionForInstance 方法。这给出了一些比individualPredictions 更具可读性的结果。现在我正在寻找一种方法来过滤我的模型(从分类中排除一些类),但这是一个全新的话题。再次感谢 Istvan。 【参考方案1】:

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

【讨论】:

Weka 预测与未知样本最近的类别。预测最接近或最相似的一个。这意味着,如果您想预测“无类别”类别,则必须包含“无类别”类别预测的有效数据,我认为这是荒谬的。这可能是计算预测误差或预测置信度的更好方法。如果错误太高或置信度太低,请将实例样本的类别值设置为“无类别”。您可能想在这里查看讨论:forums.pentaho.com/… 关于堆栈的另一个讨论:***.com/questions/11084248/… 和另一个讨论:***.com/questions/21902473/…【参考方案2】:

所以,我会冒昧地在这里回答我自己的问题,因为我想帮助 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

再次感谢。

【讨论】:

以上是关于WEKA - 从 MultiClassClassifier 获取预测值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MATLAB 从 WEKA 检索类值

Weka 从命令行预测到 CSV

WEKA:从classifyInstance中获取类,为啥错了

WEKA - 从 MultiClassClassifier 获取预测值

如何在 weka 中可视化 j48 树

将 Weka DecisionTree 从 Java API 导出到 XML 或 JSON