Java Weka:如何指定拆分百分比?

2022-09-03 18:03:43

我已经编写了代码来创建模型并保存它。它工作正常。我的理解是,默认情况下,数据被分成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();

训练此处的设置是已填充的实例对象。有人可以帮我吗?

提前致谢!


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

然后使用 80% 的设置实例来训练分类器:Classifier#buildClassifier(Instances data)

model.buildClassifier(train);

更新:多亏了@ChengkunWu的答案,我在上面添加了随机化步骤。


答案 2

您可能还希望随机化拆分。

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

推荐