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 获取预测值的主要内容,如果未能解决你的问题,请参考以下文章
WEKA:从classifyInstance中获取类,为啥错了