训练集、测试集、验证集与交叉验证

引言

训练集与测试集

当我们训练好一个模型时,我们不只希望这个模型只在训练集上表现的好,更重要的是希望这个模型后续能表现的好,这时候就需要测试集,用于评估这个模型的泛化能力。
通常情况下,我们将数据以8:2的比例分割训练集和测试集。

验证集

在算法模型中,我们还要使用正则化技术,避免过拟合。其中一个做法就是使用100个不同超参数训练100个模型,这时候,我们得到了最佳超参数,生成的泛化误差也是最小的,假设只有2%,而当你将这个算法投入的生产环境中却发现,误差高达12%,这是为什么呢?
这是因为你对测试集的发话误差做了多次度量,并调整模型和参数来拟合测试集得到的最佳模型,也就是说这个算法模型更多是为了测试集准备的,因此在新数据前面往往得不到良好的表现。
解决这个方法,就是通过分层采样在训练集中分出一个验证集。这样,我们同样适用多个不同的超参数,然后通过验证集,选择最好的模型及其超参数,最后使用测试集进行一遍测试,并且得到泛化误差的估值。
在这里插入图片描述

  • 训练数据:用于构建模型
  • 验证数据:可选,用于辅助模型构建,可重复使用
  • 测试数据: 用于检测模型构建,此数据只在模型检验时使用,用于评估模型的准确率,绝对不允许用于模型构建过程,否则会导致过拟合。
    一般验证集在交叉验证中应用比较多,利用交叉验证方法选择模型的思路是: 使用训练集对所有候选模型进行参数估计,使用验证集为检验样本,然后计算预测均方误差,比较各个模型的预测均方差,选择均方差最小的拟合模型。
    常见的做法: 将大约2/3~4/5的样本用于训练,剩余样本用于测试,当数据集在万数量级时可以用6:2:2(训练集:预测集:验证集)的比例,当数据集在百万级时,即使拿1%的数量做测试也有1w以上,也是足够的了,这时可以用98:1:1,甚至是99.5:0.4:0.1等。

注意:

  1. 比较不同模型时,只能通过相同测试集进行比较。
  2. 训练集、测试集、验证集三者最好不要重叠。

交叉验证

k k k折交叉验证的目的是:

  1. 根本原因:数据有限,单一的把数据都用来训练模型,容易过拟合。(反之,如果数据够多,可以不使用交叉验证)。
  2. 理论上,使用交叉验证,模型方差“应该是降低了”,即,理想情况下,认为 k k k折交叉验证可以降低模型方差,从而提高模型泛化能力。

为了避免验证集浪费太多训练数据,我们常用的技术就是K折交叉验证。

  1. 步骤:
    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=D1D2D3D4...Dk,同时 D i ∩ D j = ∅ ( i ≠ j ) D_i∩D_j=∅(i≠j) DiDj=(i=j),每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从 D D D中通过分层采样得到。
    Step2:用 k − 1 k-1 k1个子集的并集作为训练集,余下的子集作为验证集,这样就可以获得 k k k组训练集/测试集,从而可进行 k k k次训练和测试,最终返回的是这 k k k个测试结果的均值。
    图片来自https://www.cnblogs.com/sddai/p/8379452.html
    图片来自: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次 训练/测试)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值