我想在对一些测试实例进行分类时获取一些信息。我使用了带有SMO选项的多类分类模型来预测类别。我在这里找到了一些代码,但这些代码只显示了一些基本信息(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, actual: class_1, predicted: 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
我可能会坚持使用这个解决方案,因为这是我目前找到的最合理的一个。
再次感谢。
回答:
因此,我将在这里回答自己的问题,因为我想帮助SO关闭它并继续前进。
classifyInstance()
方法将实例分类到一个类别中,但没有提供我所需的数据。
我尝试了double[] p = cModel.individualPredictions(testInstances.instance(i));
和double[] p = cModel.distributionForInstance(testInstances.instance(i));
,这两者都返回了结果。
我坚持使用cModel.distributionForInstance(testInstances.instance(i));
方法,因为我需要手动从结果中排除一些类别。从MultiClassClassifier
中忽略不需要的分布是目前唯一可能的解决方案。这暂时解决了我的类别过滤问题,这些类别与我期望的判定相距甚远。
相关帖子在这里:WEKA – 在多类分类器中过滤类别
再次感谢。