Java Weka: как указать долю в процентах?
Я написал код для создания модели и сохранил ее. Он работает нормально. Мое понимание данных, по умолчанию, разделено в 10 раз. Я хочу, чтобы данные были разделены на два набора (обучение и тестирование), когда я создаю модель. На Weka UI я могу сделать это, используя переключатель "Процентное разделение". Я хочу знать, как это сделать с помощью кода. Я хочу, чтобы он был разделен на две части: 80% - обучение, а 20% - тестирование. Вот мой код.
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 здесь уже заполнен экземпляр объекта. Может кто-нибудь помочь мне с этим?
Спасибо заранее!
Ответы
Ответ 1
В классе 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);
ОБНОВЛЕНИЕ: благодаря ответу @ChengkunWu, я добавил шаг рандомизации выше.
Ответ 2
Вы также можете рандомизировать раскол.
data.randomize(new java.util.Random(0));