5

我正在使用 FilteredClassifier.classifyInstance() 对 weka 中的实例进行分类。

我有 2 个类(真假),我有很多正面,所以我实际上需要知道每个实例的分数才能获得最好的正面。

你知道我如何从我的 weka 分类器中获得分数吗?

谢谢

更新:我也尝试过使用distributionForInstance,但是对于每个实例,我总是得到一个带有[1.0,0.0]的数组。

我实际上需要比较几个实例,看看哪个最可靠,哪个有更多变化才能正确分类。

4

4 回答 4

8

distributionForInstance(Instance anInstance)是您需要的方法。它为您提供了一个Double数组,显示了您对每个班级的信心。我正在使用 Weka 3.6。它对我很有效。如果你总是得到相同的值,那么你的分类器没有得到很好的训练,而且根本没有判别力。在这种情况下,你应该总是得到相同的预测类。你平衡了你的训练集吗?

于 2011-05-04T14:56:52.087 回答
3

distributionForInstance(Instance anInstance) 似乎是正确的。

也许它对您不起作用,因为分类器不知道您需要置信度值?例如,对于 Weka Java 上的 LibSVM,您需要将 setProbabilityEstimates 设置为 true,才能使用分数。

于 2013-05-17T22:45:48.140 回答
2

对数据运行分类器后,您可以通过右键单击“结果列表”中的测试来可视化数据。此右键菜单上还有许多其他功能,可让您从 weka 分类器中获得分数。

于 2011-04-11T00:09:20.280 回答
1

假设您的模型已经过训练。

然后,您可以使用 distributionForInstance 进行预测。此命令生成一个由两项组成的数组(因为您的数据集上有两个类:true 和 false)

double[] distributions = model.distributionForInstance(new_instance);

之后,分布数组中最大项目的索引将是分类结果。

假设分布 = {0.9638458988630731, 0.03615410113692686}。在这种情况下,您的新实例将被归类为 class_0,因为第一项大于分布数组中的第二项。

您还可以使用分类实例命令获取此索引。

double classifiedIndex = model.classifyInstance(new_instance);

对于分布 = {0.9638458988630731, 0.03615410113692686},分类索引值将为 0。

最后,您可以将类名作为真或假而不是类索引。

new_instance.setClassValue(classifiedIndex); //firstly, assigned classified index to new_instance.
String classifiedText = new_instance.stringValue(new_instance.numAttributes());

此代码块产生错误。

您可以检查这个GitHub 项目的回归和分类。

于 2017-08-08T10:59:07.673 回答