2011-04-06 68 views
3

我使用FilteredClassifier.classifyInstance()來分類weka中的實例。WEKA:如何從classifyInstance獲得分數?

我有2個班(真和假),我有很多積極的東西,所以我實際上需要知道每個子班的分數才能獲得最好的積極。

你知道我怎麼能從我的weka分類器中獲得分數嗎?

感謝

更新:我也嘗試過使用distributionForInstance,但對於每個實例我總是用[1.0,0.0]數組。

我實際上需要比較幾個實例,看哪一個是最可靠的,哪一個有更多的更改已被正確分類。

回答

7

distributionForInstance(Instance anInstance)是您需要的方法。它給你一個雙數組,顯示你的每個類的信心。我正在使用weka 3.6。它對我來說很好。如果你總是得到相同的值,那麼你的分類器訓練不好,而且根本沒有區別性。那麼你應該總是得到相同的預測。你是否平衡了你的訓練集?

1

您已經在數據上運行的分類後,你可以想像在測試中的「結果列表」中右擊該數據還有很多其他funcitons這個右鍵菜單,讓你獲得從分數上weka分類器。

+0

我正在使用Java API而不是GUI。這是我使用FilteredClassifier.classifyInstance()的方法 – user680406 2011-04-11 07:20:24

1

distributionForInstance(Instance anInstance)似乎是正確的。

也許它不適合你,因爲分類器不知道你會需要信心值?例如,對於Weka Java上的LibSVM,您需要將setProbabilityEstimates設置爲true,以使用分數。

0

假設您的模型已經過訓練。

然後,您可以使用distributionForInstance進行預測。此命令產生包括兩個項目(因爲有兩個班在你的數據集:true和false)數組

double[] distributions = model.distributionForInstance(new_instance); 

之後,在分佈陣列的最大項目的索引將分類結果。

假設分佈= {0.9638458988630731,0.03615410113692686}。在這種情況下,您的新實例將被分類爲class_0,因爲第一個項目大於分發數組中的第二個項目。

您也可以通過classifyInstance命令獲取此索引。

double classifiedIndex = model.classifyInstance(new_instance); 

classifiedIndex值將是0的分佈= {0.9638458988630731,0.03615410113692686}。

最後,您可以將類名稱設爲true或false,而不是類索引。

new_instance.setClassValue(classifiedIndex); //firstly, assigned classified index to new_instance. 
String classifiedText = new_instance.stringValue(new_instance.numAttributes()); 

該代碼塊產生假。

您可能會檢查此GitHub project迴歸和分類。