我正在研究Weka,需要为每个测试实例输出每个标签的预测值(概率)。
在GUI中,分类标签中有一个选项为(classify - > options - >输出预测值),它通过输出每个标签的预测概率但是如何在java代码中执行此操作来完成此工作。我想在分类后获得每个标签的概率分数吗?
答案 0 :(得分:12)
以下代码接受一组训练实例,并输出特定实例的预测概率。
import weka.classifiers.trees.J48;
import weka.core.Instances;
public class Main {
public static void main(String[] args) throws Exception
{
//load training instances
Instances test=...
//build a J48 decision tree
J48 model=new J48();
model.buildClassifier(test);
//decide which instance you want to predict
int s1=2;
//get the predicted probabilities
double[] prediction=model.distributionForInstance(test.get(s1));
//output predictions
for(int i=0; i<prediction.length; i=i+1)
{
System.out.println("Probability of class "+
test.classAttribute().value(i)+
" : "+Double.toString(prediction[i]));
}
}
}
方法“distributionForInstance”仅适用于能够输出分布预测的分类器。你可以阅读here。
答案 1 :(得分:1)
我想我找到了解决方案。
训练集和测试集必须相同:相同的标题,相同的属性名称,相同的顺序。只更改数字。问题是:如果我不知道它,为什么我必须把这个类放在测试集中,而这正是我想要获得的?似乎该方法需要一些东西,但是当你看看classModel.distributionForInstance(dataModel.instance(0))
时
,它为您提供了一个double数组的类预测。
因此,有必要在测试集中放置一些类的值,稍后‘distributionForInstance’
会为您的类提供真实的结果。
答案 2 :(得分:-1)
来自WEKA GUI,分类面板 - &gt;按“更多选项...” - &gt;输出预测 - &gt;选择“PlainText”选项。现在,左键单击“PlainText”并将“outputDistribution”变为“True”。
请注意,此过程可以在最后的WEKA版本中执行,例如WEKA 3.8.0。
的问候,
马丁