您将必须运行 StratifiedRemoveFolds 过滤器十次,分别生成 10 个折叠(-N 命令行选项,GUI 中的 numFolds 属性),因为您需要分别提取 10 个折叠中的每一个(-F 命令-line 选项,fold GUI 中的属性)。
然后,您可以将其中的七个合并到您的 70% 拆分中,将其余的合并到您的 30% 拆分中。
可以从命令行调用 weka.core.Instances 类以将两个 ARFF 文件附加到一个新文件中(输出到标准输出,使用 > 重定向到第三个文件):
java -cp weka.jar weka.core.Instances append FILENAME1 FILENAME2 > FILENAME3
如果您熟悉 Python,则可以使用 python-weka-wrapper3 库并编写这个乏味过程的脚本:
import weka.core.jvm as jvm
from weka.core.converters import load_any_file, save_any_file
from weka.core.dataset import Instances
from weka.filters import Filter
jvm.start()
# load data
data = load_any_file("some/where/data.arff", class_index="last")
# generate folds
folds = []
for i in range(10):
remove_folds = Filter(classname="weka.filters.supervised.instance.StratifiedRemoveFolds",
options=["-N", "10", "-F", str(i+1)])
remove_folds.inputformat(data)
fold = remove_folds.filter(data)
folds.append(fold)
# combine folds
train = Instances.template_instances(data)
for i in range(0, 7):
train = Instances.append_instances(train, folds[i])
test = Instances.template_instances(data)
for i in range(7, 10):
test = Instances.append_instances(test, folds[i])
# save splits
save_any_file(train, "/some/where/train.arff")
save_any_file(test, "/some/where/test.arff")
jvm.stop()
使用 Groovy 也可以实现类似的过程(您需要安装kfGroovy威卡包)。您可以在 Weka 中运行以下脚本Groovy 控制台(来自工具菜单):
import weka.core.converters.ConverterUtils.DataSource
import weka.core.converters.ConverterUtils.DataSink
import weka.core.Instances
import weka.filters.Filter
import weka.filters.supervised.instance.StratifiedRemoveFolds
// load data
def Instances data = DataSource.read("/some/where/data.arff")
data.setClassIndex(data.numAttributes() - 1)
// generate folds
def folds = []
for (i in 1..10) {
def removeFolds = new StratifiedRemoveFolds()
removeFolds.setOptions(["-N", "10", "-F", "" + i] as String[])
removeFolds.setInputFormat(data)
fold = Filter.useFilter(data, removeFolds)
folds.add(fold)
}
// combine folds
def train = null
for (i in 0..6) {
if (train == null) {
train = folds[i]
}
else {
for (inst in folds[i])
train.add(inst)
}
}
def test = null
for (i in 7..9) {
if (test == null) {
test = folds[i]
}
else {
for (inst in folds[i])
test.add(inst)
}
}
// save splits
DataSink.write("/some/where/train.arff", train)
DataSink.write("/some/where/test.arff", test)