Weka中使用预定义折叠进行交叉验证

3
我想在 Weka 上运行一个10折交叉验证的训练/测试实验,使用的数据集已经被划分成了10个fold(即每个实例已经被分配到一个fold中)。我知道如果将完整的数据集提供给Weka,它可以为您创建 folds 并运行10折 CV,但是否有一种方法告诉它哪些实例应该属于哪个 fold,而不是手动将数据集分成10个训练/测试集并独立地运行每个10次实验?
谢谢
1个回答

3

您会使用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 的源代码是构建 Instance 集合的好例子: 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<Attribute> attInfo, int capacity)创建一个空的Instances,然后使用来自所有实例的超集的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

祝你好运!


1
实际上我正在使用Python(是的,我知道我应该使用scikitlearn,但我最终会用到它)。基本上我的问题是是否有一种简单的方法告诉Weka折叠在哪里,而不是编写自己的trainCV函数。如果没有,我可以使用Python创建10个训练/测试拆分,并分别在每个拆分上运行Weka。 - jjs
指定训练/测试实例应该足以告诉Weka折叠在哪里,并且您可以自己运行训练/评估。从您的角度来看,这需要更多的管理(实际上,这很痛苦),但这是我知道的唯一方法(已经有一段时间没有使用Weka了)。 - Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接