2013-12-16 35 views
7

我正在Weka上工作,需要为每个测试实例输出每个标签的预测值(概率)。如何在weka中获取实例的预测值?

在GUI中,在分类选项卡中有一个选项(分类 - >选项 - >输出预测值),它通过输出每个标签的预测概率来完成此工作,但是如何在java代码中执行此操作。我想在分类后为每个标签获得概率分数?

回答

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

感谢名单@walter,我真的很感谢您的帮助....有没有一种方式来获得测试文档相同维向量,因为我可以通过训练词汇测试得到的训练样本在weka中抽样vua的StringtoVector功能? –

+1

我不熟悉Weka中的文本挖掘,所以我没有很好的装备来回答你的问题。您可以尝试在堆栈溢出中发布新问题。 – Walter

+1

此外,如果这已回答您的问题,则通常在“向上和向下”箭头下单击复选标记(以使其变为绿色)。这让人们知道这个问题已经得到解答,并且为成功回答您的问题提供了一些功劳。我只提到它,因为它看起来像你是堆栈溢出的新手。 – Walter

1

我想我找到了解决方案。

训练集和测试集必须相同:头相同,属性名相同,顺序相同。只更改数字。问题是:如果我不知道它,为什么我必须把这个类放到测试集中,而这正是我想要获得的?看来这个方法需要一些东西,但是当你看一下classModel.distributionForInstance(dataModel.instance(0)) 时,它会给你用一个double数组的预测。 因此,有必要在测试集中放置一些类的值,然后‘distributionForInstance’为您提供真正的类结果。

-1

从WEKA GUI,分类面板 - >按“更多选项...” - >输出预测 - >选择“PlainText”选项。现在,左键单击“PlainText”并将“outputDistribution”转换为“True”。

请注意,该过程可以在最近的WEKA版本中执行,例如WEKA 3.8.0。

问候,
马丁