交叉验证将语料库分成大致相等的几部分,称为fold。将其中的一份作为测试数据,其余部分作为训练数据。
典型的fold数量为10,也就是90%的数据为训练数据,10%为测试数据。
fold数量在构造函数中设置。
默认取第0份fold为测试数据,可以通过setFold来修改。
package chapter2;
import java.util.Set;
import java.util.TreeSet;
import com.aliasi.corpus.ObjectHandler;
import com.aliasi.corpus.XValidatingObjectCorpus;
public class CrossValidatingDemo {
public static void main(String[] args) {
//将corpus分成训练集与测试集。
//在构造函数中设置总共分成多少分(numFolds)
//选择其中一份为测试集
//具体选择哪一份,由参数fold制定,默认值为0
XValidatingObjectCorpus<String> corpus = new XValidatingObjectCorpus<String>(1000);
for(int i = 0; i < 1000; i++) {
corpus.handle(Integer.toString(i));
}
System.out.println(corpus.fold());//0
corpus.setFold(300);//选择序号为300那个fold为测试集
final Set<String> testSet = new TreeSet<String>();
ObjectHandler<String> testHandler = new ObjectHandler<String>() {
@Override
public void handle(String e) {
testSet.add(e);
}
};
final Set<String> trainSet = new TreeSet<String>();
ObjectHandler<String> trainHandler = new ObjectHandler<String>() {
@Override
public void handle(String e) {
trainSet.add(e);
}
};
corpus.visitCorpus(trainHandler, testHandler);
System.out.println(trainSet.size());//999
System.out.println(testSet.size());//1
System.out.println(testSet);//[300]
}
}
程序输出结果为
0
999
1
[300]