Another way of looking at it is that if you tune your hyperparameters on the test set, you are effectively using the test set as the training set, and therefore the performance you achieve on it will be too optimistic with respect to what you might actually observe when you deploy your model. But if you only use the test set once at end, it remains a good proxy for measuring the generalization of your classifier .
Luckily, there is a correct way of tuning the hyperparameters and it does not touch the test set at all. The idea is to split our training set in two: a slightly smaller training set, and what we call a validation set.
但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.
在 pattern recognition 与 machine learning 的相关研究中,经常会将 dataset分为 training 跟 test 这两个 subsets,前者用以建立 model,后者则用来评估该 model 对未知样本进行预测时的精确度,正规的说法是 generalization ability。在往下叙述之前,这边就必须点出一个极为重要的观念:只有 training data 才可以用在 model 的训练过程中,test data 则必须在 model 完成之后才被用来评估 model 优劣的依据。
怎么将完整的 dataset 分为 training set 与 test set 也是学问,必须遵守两个要点:
1. training set 中样本数量必须够多,一般至少大于总样本数的 50%。
2. 两组子集必须从完整集合中均匀取样。
其中第 2 点特别重要,均匀取样的目的是希望减少 training/test set 与完整集合之间的偏差(bias),但却也不易做到。一般的作法是随机取样,当样本数量足够时,便可达到均匀取样的效果。然而随机也正是此作法的盲点,也是经常是可以在数据上做手脚的地方。举例来说,当辨识率不理想时,便重新取样一组training set 与 test set,直到 test set 的辨识率满意为止,但严格来说这样便算是作弊了。
Cross-validation 正是为了有效的估测 generalization error 所设计的实验方法,可以细分为 double cross-validation、k-fold cross-validation 与leave-one-out cross-validation。Double cross-validation 也称 2-fold cross-validation(2-CV),作法是将 dataset 分成两个相等大小的 subsets,进行两回合的分类器训练。在第一回合中,一个 subset 作为 training set,另一个便作为 test set;在第二回合中,则将 training set 与 test set 对换后,再次训练分类器,而其中我们比较关心的是两次 test sets 的辨识率。不过在实务上 2-CV 并不常用,主要原因是 training set 样本数太少,通常不足以代表母体样本的分布,导致 test 阶段辨识率容易出现明显落差。此外,2-CV 中分 subset的变异度大,往往无法达到「实验过程必须可以被复制」的要求。
K-fold cross-validation (k-CV)则是 double cross-validation 的延伸,作法是将 dataset 切成 k 个大小相等的 subsets,每个 subset 皆分别作为一次 test set,其余样本则作为 training set,因此一次 k-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够大才能使各回合中的 training set 样本数够多,一般而言 k=10 算是相当足够了。
最后是 leave-one-out cross-validation (LOOCV),假设 dataset 中有 n 个样本,那 LOOCV 也就是 n-CV,意思是每个样本单独作为一次 test set,剩余 n-1个样本则做为 training set,故一次 LOOCV 共要建立 n 个 models。相较于前面介绍的 k-CV,LOOCV 有两个明显的优点:
每一回合中几乎所有的样本皆用于训练 model,因此最接近母体样本的分布,估测所得的 generalization error 比较可靠。
实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
但 LOOCV 的缺点则是计算成本高,因为需要建立的 models 数量与总样本数量相同,当总样本数量相当多时,LOOCV 在实作上便有困难,除非每次训练 model 的速度很快,或是可以用平行化计算减少计算所需的时间。
使用 Cross-Validation 时常犯的错误 :
由于实验室许多研究都有用到 evolutionary algorithms(EA)与 classifiers,所使用的 fitness function 中通常都有用到 classifier 的辨识率,然而把cross-validation 用错的案例还不少。前面说过,只有 training data 才可以用于 model 的建构,所以只有 training data 的辨识率才可以用在 fitness function 中。而 EA 是训练过程用来调整 model 最佳参数的方法,所以只有在 EA结束演化后,model 参数已经固定了,这时候才可以使用 test data。
那 EA 跟 cross-validation 要如何搭配呢?Cross-validation 的本质是用来估测(estimate)某个 classification method 对一组 dataset 的 generalization error,不是用来设计 classifier 的方法,所以 cross-validation 不能用在 EA的 fitness function 中,因为与 fitness function 有关的样本都属于 training set,那试问哪些样本才是 test set 呢?如果某个 fitness function 中用了cross-validation 的 training 或 test 辨识率,那么这样的实验方法已经不能称为 cross-validation 了。
EA 与 k-CV 正确的搭配方法,是将 dataset 分成 k 等份的 subsets 后,每次取 1份 subset 作为 test set,其余 k-1 份作为 training set,并且将该组 training set 套用到 EA 的 fitness function 计算中(至于该 training set 如何进一步利用则没有限制)。因此,正确的 k-CV 会进行共 k 次的 EA 演化,建立 k 个classifiers。而 k-CV 的 test 辨识率,则是 k 组 test sets 对应到 EA 训练所得的 k 个 classifiers 辨识率之平均值。
Inferrences:
http://cs231n.github.io/classification/
http://www.ilovematlab.cn/thread-49143-1-1.html