2013-12-16 42 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。

問候,
馬丁