首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weka中使用预定义折叠的交叉验证

Weka中使用预定义折叠的交叉验证
EN

Stack Overflow用户
提问于 2014-04-01 23:21:42
回答 1查看 2K关注 0票数 3

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-04-01 23:59:28

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

第一步是创建拆分:

代码语言:javascript
复制
// 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];

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

代码语言:javascript
复制
// 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的调用。

代码语言:javascript
复制
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.get从所有实例的超集进行填充。

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

代码语言:javascript
复制
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

祝好运!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22790122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档