数据集拆分

在机器学习中,通常将所有的数据划分为三份:训练数据集、验证数据集和测试数据集。它们的功能分别为

data set

不断使用测试集和验证集会使其逐渐失去效果。也就是说使用相同数据来决定超参数设置或其他模型改进的次数越多,对于这些结果能够真正泛化到未见过的新数据的信心就越低。请注意,验证集的失效速度通常比测试集缓慢。如果可能的话,建议收集更多数据来“刷新”测试集和验证集。重新开始是一种很好的重置方式。

为了划分这几种数据集,可以选择采用留出法、K-折交叉验证法或者自助法等多种方法。这些方法都对数据集有一些基本的假设,包括

陷阱:请勿对测试数据集进行训练。

留出法

留出法(hold-out)直接将数据集划分为互斥的集合,如通常选择 70% 数据作为训练集,30% 作为测试集。

需要注意的是保持划分后集合数据分布的一致性,避免划分过程中引入额外的偏差而对最终结果产生影响。通常来说,单次使用留出法得到的结果往往不够稳定可靠,一般采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

K-折交叉验证法

Kuhn 和 Johnson 在「Data Splitting Recommendations」中指出使用单独的「测试集」(或验证集)具有一定的局限性,包括

所以在实际应用中,可以选择 K-折交叉验证(k-fold cross-validation)的方式来评估模型,其偏差低、性能评估变化小。

K-折交叉验证法将数据集划分为 k 个大小相似的互斥子集,并且尽量保证每个子集数据分布的一致性。这样,就可以获取 k 组训练 - 测试集,从而进行 k 次训练和测试。

k 通常取值 10,此时称为 10 折交叉验证。其他常用的 k 值还有 5、20 等。

自助法

自助法(bootstrap method)以自助采样法为基础:每次随机的从初始数据 $D$ 中选择一个样本拷贝到结果数据集 $D’$ 中,样本再放回初始数据 $D$ 中;这样重复 $m$ 次,就得到了含有 $m$ 个样本的数据集 $D’$。这样就可以把 $D’$ 作为训练集,而 D\D'​作为测试集。这样,样本在 m 次采样中始终不被采集到的概率为

$$\lim_{m\to\infty} (1-\frac{1}{m})^{m} = 1/e = 0.368$$

自助法的性能评估变化小,在数据集小、难以有效划分数据集时很有用。另外,自助法也可以从初始数据中产生多个不同的训练集,对集成学习等方法有好处。

然而,自助法产生的数据集改变了初始数据的分布,会引入估计偏差。因而,数据量足够时,建议使用留出法和交叉验证法。

参考文档