Подтвердить что ты не робот

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 здесь уже заполнен экземпляр объекта. Может кто-нибудь помочь мне с этим?

Спасибо заранее!

4b9b3361

Ответ 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));