通常情况下,我们通过将学习器在测试集上进行测试,收集泛化误差,来对模型进行评估和选择,那么,当我们只有一个包含 m 个 example 的数据集时,如何划分出 training set 和 testing set 呢?
Hold-out Method留出法
留出法 (hold-out method) 指的是我们直接将数据集 D 划分为两个互斥的集合,训练集 S 以及测
试集 T,
但必须要注意的是,测试集和训练集的分布应该尽可能保持一致,避免在数据划分的过程中引入额外的偏差,对最终的实验结果产生影响。
比如,在分类任务中,我们应该保证在训练集和测试集中的样本比例一致,此时通常采用分层抽样(sampling stratified)的方式对原始数据集进行处理,下面举例说明:如果数据集 D 有 500 正例 500 负例,并且我们将 70% 划分为训练集,30% 划分为测试集,那么训练集中就应当有 350 正例 350 负例,测试集中有 150 正例,150 负例。
然而可以发现,在分层划分数据集时,有几乎无数种划分的方法,不同的划分方法往往会导致模型不同,因此我们通常采用若干次随机划分,重复实验,评估实验结果,以所有合格的实验结果的平均值作为留出法的评估结果。
同时,如何控制训练集和测试集的大小也是一个难题,如果训练集太大,测试集太小,测试结果的
变化就会比较大,测试结果的方差会比较大;如果训练集较小,测试集较大,模型的偏差就会比较
大,我们无法确定评估结果的保真性。通常我们把 2/3 ∽ 4/5 用于训练,其余用于测试。
Cross Validation交叉验证法
交叉验证法 (cross validation) 使先将数据集划分为 K 个大小近似,数据分布相同(stratified sampling)的互斥子集,每次使用 k-1 个子集的并集作为训练集,剩下的一个子集作为测试集,重复 k 次,直到每一个子集都被作为测试集使用过,最后取 k 次测试结果的平均值作为实验结果。这种测试方法也被称为”k 折交叉验证”(k-fold cross validation).Figure 2.2形象说明了 10 折交叉验证
与 hold-out method 类似的是,把数据集划分为 k 个子集也存在许多种划分的办法,因此为了减少因为数据划分不同带来的误差,随即使用不同的划分方式重复进行 p 次,最终的评估结果就是这 p次 k 折交叉验证的平均结果(一共要进行 p*k 次训练和测试)。
Bootstrapping自助法
在留出法和交叉验证法中,由于我们保留了一部分数据用于测试,因此训练出的模型拟合的训练集始终不会是整个数据集 D,这会在一定程度上带来不可避免地因为训练规模不同而带来的误差,自助法(bootstrapping)能比较好的解决这个问题
假设有数据集 D 有 m 个 instance,我们每次从数据集 D 中抽取一个样本,拷贝放入数据集 D’ 中,这个样本还在数据集 D 中,我们重复这个过程 m 次就可以得到有 m 个 instance 的数据集 D’,D中会有部分样本出现在 D’中,一部分样本未出现,样本在 m 次采样中都不出现的概率是
通过自助法,大概有 36.8% 的数据没有出现在 D’ 中,我们可以用 D’作为训练集,D-D’ 作为测
试集
自助法在数据集较小,难以划分训练/测试集时很有用,但会破坏数据集的初始分布,带来误差,但是在数据量比较大的情况下,还是使用留出法和交叉验证更好。