引言
训练集与测试集
当我们训练好一个模型时,我们不只希望这个模型只在训练集上表现的好,更重要的是希望这个模型后续能表现的好,这时候就需要测试集,用于评估这个模型的泛化能力。
通常情况下,我们将数据以8:2的比例分割训练集和测试集。
验证集
在算法模型中,我们还要使用正则化技术,避免过拟合。其中一个做法就是使用100个不同超参数训练100个模型,这时候,我们得到了最佳超参数,生成的泛化误差也是最小的,假设只有2%,而当你将这个算法投入的生产环境中却发现,误差高达12%,这是为什么呢?
这是因为你对测试集的发话误差做了多次度量,并调整模型和参数来拟合测试集得到的最佳模型,也就是说这个算法模型更多是为了测试集准备的,因此在新数据前面往往得不到良好的表现。
解决这个方法,就是通过分层采样在训练集中分出一个验证集。这样,我们同样适用多个不同的超参数,然后通过验证集,选择最好的模型及其超参数,最后使用测试集进行一遍测试,并且得到泛化误差的估值。
- 训练数据:用于构建模型
- 验证数据:可选,用于辅助模型构建,可重复使用
- 测试数据: 用于检测模型构建,此数据只在模型检验时使用,用于评估模型的准确率,绝对不允许用于模型构建过程,否则会导致过拟合。
一般验证集在交叉验证中应用比较多,利用交叉验证方法选择模型的思路是: 使用训练集对所有候选模型进行参数估计,使用验证集为检验样本,然后计算预测均方误差,比较各个模型的预测均方差,选择均方差最小的拟合模型。
常见的做法: 将大约2/3~4/5的样本用于训练,剩余样本用于测试,当数据集在万数量级时可以用6:2:2(训练集:预测集:验证集)的比例,当数据集在百万级时,即使拿1%的数量做测试也有1w以上,也是足够的了,这时可以用98:1:1,甚至是99.5:0.4:0.1等。
注意:
- 比较不同模型时,只能通过相同测试集进行比较。
- 训练集、测试集、验证集三者最好不要重叠。
交叉验证
k k k折交叉验证的目的是:
- 根本原因:数据有限,单一的把数据都用来训练模型,容易过拟合。(反之,如果数据够多,可以不使用交叉验证)。
- 理论上,使用交叉验证,模型方差“应该是降低了”,即,理想情况下,认为 k k k折交叉验证可以降低模型方差,从而提高模型泛化能力。
为了避免验证集浪费太多训练数据,我们常用的技术就是K折交叉验证。
- 步骤:
Step1:先将数据集D划分成k个大小相似的互斥子集: D = D 1 ∪ D 2 ∪ D 3 ∪ D 4 ∪ . . . ∪ D k D=D_1∪D_2∪D_3∪D_4∪...∪D_k D=D1∪D2∪D3∪D4∪...∪Dk,同时 D i ∩ D j = ∅ ( i ≠ j ) D_i∩D_j=∅(i≠j) Di∩Dj=∅(i=j),每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从 D D D中通过分层采样得到。
Step2:用 k − 1 k-1 k−1个子集的并集作为训练集,余下的子集作为验证集,这样就可以获得 k k k组训练集/测试集,从而可进行 k k k次训练和测试,最终返回的是这 k k k个测试结果的均值。
图片来自:https://www.cnblogs.com/sddai/p/8379452.html
显然,交叉验证法评估结果的稳定性和保真性很大程度上取决于
k
k
k,因此也被称为“
k
k
k折交叉验证”。
k
k
k最常用的取值是10。
k
k
k越大,偏差越小,方差越大,模型学习效果差。
k
k
k越小,偏差越大,方差越小,模型容易过拟合。
与留出法类似,
k
k
k将数据集
D
D
D划分为
k
k
k个子集,同样存在多种划分方式,为减小因为样本划分不同而引入的差异,
k
k
k折交叉验证通常要随机使用不同的划分重复p次,最终评估结果是这
p
p
p次
k
k
k折交叉验证结果的均值,常见的有“10次10折交叉验证”(即进行了10*10=100次 训练/测试)。