【问题标题】:Cross validation in Weka using predefined folds使用预定义折叠在 Weka 中进行交叉验证
【发布时间】:2014-05-12 11:27:10
【问题描述】:

我想使用 Weka 在已划分为 10 个折叠的数据集上运行 10 折叠交叉验证训练/测试实验(即每个实例已分配到一个折叠)。我知道如果你给 Weka 一个完整的数据集,它可以为你创建折叠并运行 10 折叠 CV,但是有没有办法告诉它哪些实例应该属于哪个折叠,而不是手动将数据集拆分为 10 列/test 集并独立运行 10 个实验中的每一个?

谢谢

【问题讨论】:

    标签: machine-learning weka cross-validation


    【解决方案1】:

    你会使用 Java 吗?这里给出了一个使用 Java 接口训练和评估分类器的简单示例,摘录如下: http://www.programcreek.com/2013/01/a-simple-machine-learning-example-in-java/

    第一步是创建拆分:

    // Do 10-split cross validation
    Instances[][] split = crossValidationSplit(data, 10);
    
    // Separate split into training and testing arrays
    Instances[] trainingSplits = split[0];
    Instances[] testingSplits = split[1];
    

    然后进行典型的培训/评估:

    // For each training-testing split pair, train and test the classifier
    for (int i = 0; i < trainingSplits.length; i++) {
        Evaluation validation = classify(models[j], trainingSplits[i], testingSplits[i]);
    
        predictions.appendElements(validation.predictions());
    }
    

    相比之下,我之前的一些代码使用trainCV/testCV 函数来获取这些实例集。您可以编写一个新函数,返回这些已知折叠的数据子集。

    也许 Instances.trainCV 的源代码是如何构建实例集的一个很好的例子: http://grepcode.com/file/repo1.maven.org/maven2/nz.ac.waikato.cms.weka/weka-stable/3.6.7/weka/core/Instances.java

    关键行是对copyInstances的调用。

    copyInstances(0, train, first);
    copyInstances(first + numInstForFold, train,
          numInstances() - first - numInstForFold);
    return train;
    

    也许还可以使用new Instances(java.lang.String name, java.util.ArrayList&lt;Attribute&gt; attInfo, int capacity) 简单地创建一个空实例,并使用所有实例的超集中的Instances.get 进行填充。

    另一种方法是使用过滤器,例如以下摘录的示例,当时我正在训练具有相同拆分的多个分类器(在 Matlab/java 中):

    filterRand = Randomize();
    filterRange = RemoveRange();
    
    %if the filterInst parameter is active, take a subsample of training
    if doFilterTrain
        rangeStr = sprintf('%g-%g', 1, learnParams.trainSizeMax );
        filterRange.setInstancesIndices( rangeStr );
        filterRange.setInvertSelection( 1 );
    end
    
    if doFilterTrain
        filterRand.setInputFormat( instTrain );
        filterRange.setInputFormat( instTrain );
    
        instTrainSub = Filter.useFilter(instTrain, filterRand);
        instTrainSub = Filter.useFilter(instTrainSub, filterRange);
    end
    

    祝你好运!

    【讨论】:

    • 实际上我正在使用 python(是的,我知道我应该使用 scikitlearn,我最终会做到这一点)。基本上我的问题是,是否有一种简单的方法可以告诉 Weka 折叠在哪里,而不是编写自己的 trainCV 函数。如果没有,我猜我可以使用 python 创建 10 个训练/测试拆分并在每个拆分上分别运行 Weka..
    • 为训练/测试指定实例应该足以告诉 Weka 折叠在哪里,并自己运行训练/评估。从你的角度来看,这更需要管理(事实上,这很痛苦),但这是我知道的唯一方法(有一段时间没有使用 Weka)。
    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 2014-09-13
    • 2013-08-16
    • 2015-07-18
    • 1970-01-01
    • 2013-08-17
    • 2020-02-06
    • 2017-05-04
    相关资源
    最近更新 更多