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:
再次感谢。
我想获取一些信息。在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:
再次感谢。