2013-02-04 54 views
11

我寫了代碼來創建模型並保存它。它工作正常。我的理解是數據,默認情況下,分爲10倍。我想在創建模型時將數據分成兩組(培訓和測試)。在Weka UI上,我可以通過使用「百分比分割」單選按鈕來完成。我想知道如何通過代碼來做到這一點。我希望它分成兩部分,80%是訓練,20%是測試。這是我的代碼。Java Weka:如何指定拆分百分比?

 FilteredClassifier model = new FilteredClassifier(); 
     model.setFilter(new StringToWordVector()); 
     model.setClassifier(new NaiveBayesMultinomial()); 
     try { 
      model.buildClassifier(trainingSet); 
     } catch (Exception e1) { // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     ObjectOutputStream oos = new ObjectOutputStream(
       new FileOutputStream(
         "/Users/me/models/MyModel.model")); 
     oos.writeObject(model); 
     oos.flush(); 
     oos.close(); 

這裏的trainingSet已經填充了Instances對象。有人可以幫我弄這個嗎?

在此先感謝!

回答

19

在UI類ClassifierPanel的方法startClassifier(),我發現下面的代碼:

// Percent split 

int trainSize = (int) Math.round(inst.numInstances() * percent 
    /100); 
int testSize = inst.numInstances() - trainSize; 
Instances train = new Instances(inst, 0, trainSize); 
Instances test = new Instances(inst, trainSize, testSize); 

所以隨機數據集中後...

trainingSet.randomize(new java.util.Random(0)); 

...我建議你拆你的trainingSet以相同的方式:

int trainSize = (int) Math.round(trainingSet.numInstances() * 0.8); 
int testSize = trainingSet.numInstances() - trainSize; 
Instances train = new Instances(trainingSet, 0, trainSize); 
Instances test = new Instances(trainingSet, trainSize, testSize); 

然後使用Classifier#buildClassifier(Instances data)與您的實例集80%的訓練分類:

model.buildClassifier(train); 

UPDATE:感謝@ ChengkunWu的回答,我說上面的隨機化的一步。

+1

測試和按預期工作。謝謝! – rishi

+0

答案是對的。但是在那種情況下,分裂成火車和測試集並不是隨機的。我怎樣才能將數據集分解成火車並隨機測試測試?我的意思是......隨機從數據集中獲取數據並形成火車和測試集。 – Ronin

6

您可能還想隨機化拆分。

data.randomize(new java.util.Random(0)); 
+3

@Jan Eglinger這個簡短但非常重要的筆記應該添加到接受的答案中 – KidCrippler