2013-02-04 10 views
11

モデルを作成して保存するコードを記述しました。それはうまく動作します。私の理解は、データはデフォルトで10倍に分割されているということです。モデルを作成するときに、データを2つのセット(トレーニングとテスト)に分割する必要があります。 WekaのUIで、私は "Percentage split"ラジオボタンを使ってそれを行うことができます。私はコードを通してそれをする方法を知りたい。私はそれを2つの部分に分けて欲しい。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ここにはすでにインスタンスオブジェクトが設定されています。誰かがこれで私を助けることができますか?

ありがとうございます! UIクラスで

答えて

19

ClassifierPanelの方法startClassifier()、私は次のコードが見つかりました:...ので、あなたのデータセットをランダム化した後

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

// 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

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); 

あなたのセットのインスタンスの80%と分類器を訓練する:

model.buildClassifier(train); 

UPDATE:ChengkunWuの答え@のおかげで、私は上記のランダム化ステップを追加しました。

+1

期待どおりに動作しています。ありがとう! – rishi

+0

答えは正しいです。しかし、その場合、列車とテストセットへの分割はランダムではありません。データセットを列車に分割し、ランダムにテストをテストするにはどうすればよいですか?つまり、データセットからデータをランダムに取り出し、列車とテストセットを形成します。 – Ronin

6

また、分割をランダム化することもできます。

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

@Jan Eglingerこの短いが、非常に重要なメモを受け入れられる回答に追加する必要があります – KidCrippler

関連する問題