我正在使用 FilteredClassifier.classifyInstance() 对 weka 中的实例进行分类。
我有 2 个类(真假),我有很多正面,所以我实际上需要知道每个实例的分数才能获得最好的正面。
你知道我如何从我的 weka 分类器中获得分数吗?
谢谢
更新:我也尝试过使用distributionForInstance,但是对于每个实例,我总是得到一个带有[1.0,0.0]的数组。
我实际上需要比较几个实例,看看哪个最可靠,哪个有更多变化才能正确分类。
我正在使用 FilteredClassifier.classifyInstance() 对 weka 中的实例进行分类。
我有 2 个类(真假),我有很多正面,所以我实际上需要知道每个实例的分数才能获得最好的正面。
你知道我如何从我的 weka 分类器中获得分数吗?
谢谢
更新:我也尝试过使用distributionForInstance,但是对于每个实例,我总是得到一个带有[1.0,0.0]的数组。
我实际上需要比较几个实例,看看哪个最可靠,哪个有更多变化才能正确分类。
distributionForInstance(Instance anInstance)
是您需要的方法。它为您提供了一个Double
数组,显示了您对每个班级的信心。我正在使用 Weka 3.6。它对我很有效。如果你总是得到相同的值,那么你的分类器没有得到很好的训练,而且根本没有判别力。在这种情况下,你应该总是得到相同的预测类。你平衡了你的训练集吗?
distributionForInstance(Instance anInstance) 似乎是正确的。
也许它对您不起作用,因为分类器不知道您需要置信度值?例如,对于 Weka Java 上的 LibSVM,您需要将 setProbabilityEstimates 设置为 true,才能使用分数。
对数据运行分类器后,您可以通过右键单击“结果列表”中的测试来可视化数据。此右键菜单上还有许多其他功能,可让您从 weka 分类器中获得分数。
假设您的模型已经过训练。
然后,您可以使用 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 项目的回归和分类。