2013-02-04 17 views
11

Napisałem kod, aby utworzyć model i zapisać go. To działa dobrze. Moje zrozumienie to domyślnie dane podzielone na 10 fałd. Chcę, aby dane zostały podzielone na dwa zestawy (szkolenie i testowanie) podczas tworzenia modelu. W interfejsie Weka mogę to zrobić za pomocą przycisku radiowego "Podział procentowy". Chcę wiedzieć, jak to zrobić za pomocą kodu. Chcę podzielić go na dwie części: 80% to szkolenie, a 20% to testy. Oto mój kod.Java Weka: Jak określić procent podziału?

 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 tutaj jest już wypełniony obiekt Instances. Czy ktoś może mi w tym pomóc?

Z góry dziękuję!

Odpowiedz

19

W klasie UI ClassifierPanel „s metody startClassifier(), znalazłem następujący kod:

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

więc po randomizacji zbioru danych ...

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

... Proponuję podzielić swoje trainingSet w ten sam sposób:

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

następnie użyj Classifier#buildClassifier(Instances data) trenować klasyfikatora z 80% swoich ustalonych przypadkach:

model.buildClassifier(train); 

UPDATE: dzięki użytkownika @ ChengkunWu odpowiedź, dodałem krok losowanie powyżej.

+1

Przetestowano i działało zgodnie z oczekiwaniami. Dzięki! – rishi

+0

Odpowiedź jest właściwa. Ale w takim przypadku podział na pociąg i zestaw testów nie jest losowy. Jak mogę podzielić zestaw danych na pociąg i losowo przetestować test? Mam na myśli ... Losowe pobieranie danych z zestawu danych i tworzenie pociągu i zestawu testów. – Ronin

6

Możesz również chcieć dokonać losowego podziału również.

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

@Jan Eglinger Ta krótka, ale BARDZO ważna uwaga powinna zostać dodana do zaakceptowanej odpowiedzi – KidCrippler