2015-04-18 96 views
0

我正在使用Weka進行分類,使用LibSVM分類器,並希望獲得與從評估模型中獲得的輸出相關的一些幫助。查找分類在Weka中的實例的概率

在下面的例子中,我的test.arff文件包含1000個實例,我想知道每個實例被分類爲yes/no的概率(這是一個簡單的兩類問題)。

例如,例如1,如果它被歸類爲'是',那麼它被分類的概率如此,是我正在尋找的東西。

下面的代碼片段,我目前有:

  // Read and load the Training ARFF file 
     ArffLoader trainArffLoader = new ArffLoader(); 
     trainArffLoader.setFile(new File("train_clusters.arff")); 
     Instances train = trainArffLoader.getDataSet(); 
     train.setClassIndex(train.numAttributes() - 1); 
     System.out.println("Loaded Train File"); 

     // Read and load the Test ARFF file 
     ArffLoader testArffLoader = new ArffLoader(); 
     testArffLoader.setFile(new File("test_clusters.arff")); 
     Instances test = testArffLoader.getDataSet(); 
     test.setClassIndex(test.numAttributes() - 1); 
     System.out.println("Loaded Test File"); 


     LibSVM libsvm = new LibSVM(); 

     libsvm.buildClassifier(train); 

     // Evaluation 
     Evaluation evaluation = new Evaluation(train); 
     evaluation.evaluateModel(libsvm, test); 
     System.out.println(evaluation.toSummaryString("\nPrinting the Results\n=====================\n", true)); 
     System.out.println(evaluation.toClassDetailsString()); 

回答

1

您應該使用libsvm.distributionForInstance方法。它返回每個類索引的概率估計值(在您的案例中爲2)。

例如,要打印所有概算測試組使用的東西,每個實例是這樣的:

for (Instance instance : test) { 
     double[] distribution = libsvm.distributionForInstance(instance); 
     for (int classIndex : classIndices) { 
      System.out.print(distribution[classIndex] + " "); 
     } 
     System.out.println(); 
    } 

請注意,這是不正確的概率,但普拉特的方法制成的估計(見question)。

+0

完美!它有助於。我必須做的唯一改變是從測試中獲得實例,我使用了test.instance(index)。 –