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

Posted

技术标签:

【中文标题】Java Weka:如何指定拆分百分比?【英文标题】:Java Weka: How to specify split percentage? 【发布时间】:2013-01-18 21:01:39 【问题描述】:

我已经编写了代码来创建模型并保存它。它工作正常。我的理解是,默认情况下,数据被分成 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 这里已经填充了 Instances 对象。有人可以帮我解决这个问题吗?

提前致谢!

【问题讨论】:

【参考方案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));

【讨论】:

@Jan Eglinger 这个简短但非常重要的注释应该添加到接受的答案中 为什么我们需要随机分割?!您能否在答案中指定这一点。谢谢 @F505 我在拆分之前随机化了我的整个数据集,这样我就可以更有信心,更好的类分布最终会出现在拆分集中。如果输入数据集按标签排序,这很重要(例如),尽管它对严重偏斜的数据效果较差。

以上是关于Java Weka:如何指定拆分百分比?的主要内容,如果未能解决你的问题,请参考以下文章

使用自己的 Java 代码和模型在 WEKA 中获取预测百分比

Weka 预测(百分比置信度) - 这是啥意思?

Weka 中 SMO、NaiveBayes 和 BayesNet 分类器的不同结果

如何按没有的百分比拆分文件。行数?

如何按百分比将 CSV 数据集拆分为训练集和测试集,并将拆分后的数据集与 pandas 一起保存到本地文件夹中? [复制]

weka中的不平衡数据集?不工作