【发布时间】:2014-01-03 12:44:04
【问题描述】:
我正在研究 Weka,需要为每个测试实例输出每个标签的预测值(概率)。
在 GUI 中,分类选项卡中有一个选项(分类 -> 选项 -> 输出预测值),它通过输出每个标签的预测概率来完成这项工作,但如何在 java 代码中执行此操作。我想在分类后接收每个标签的概率分数?
【问题讨论】:
我正在研究 Weka,需要为每个测试实例输出每个标签的预测值(概率)。
在 GUI 中,分类选项卡中有一个选项(分类 -> 选项 -> 输出预测值),它通过输出每个标签的预测概率来完成这项工作,但如何在 java 代码中执行此操作。我想在分类后接收每个标签的概率分数?
【问题讨论】:
从 WEKA GUI,分类面板 -> 按“更多选项...” -> 输出预测 -> 选择“纯文本”选项。现在,左键单击“PlainText”并将“outputDistribution”变为“True”。
请注意,此过程可以在最新的 WEKA 版本中执行,例如 WEKA 3.8.0。
问候,
马丁
【讨论】:
我想我找到了解决办法。
训练集和测试集必须相等:相同的标题、相同的属性名称、相同的顺序。只改变数字。问题是:如果我不知道这个类,为什么要把它放在测试集中,而这正是我想要得到的?似乎该方法需要一些东西,但是当您查看classModel.distributionForInstance(dataModel.instance(0))
,它使用双精度数组为您提供对类的预测。
因此,有必要将类的一些值放入测试集中,然后‘distributionForInstance’ 会为您提供类的真实结果。
【讨论】:
以下代码采用一组训练实例,并输出特定实例的预测概率。
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。
【讨论】: