2014-04-01 69 views
2

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

谢谢

回答

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是如何建立实例套一个很好的例子: 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.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

+0

指定火车/测试实例应该足以告诉Weka折叠的位置,并且运行培训/评估你自己。从你的角度来看,这更多是为了管理(事实上,这是一种痛苦),但这是我知道的唯一方式(没有使用Weka一段时间)。 – Graham