交叉验证是模型调参时常常借助的工具和方法,本文整理交叉验证相关内容。

定义和概念

训练集、验证集、测试集

  如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set) 、验证集(validation set)和测试集(test set)。其中:

  • 训练集用来训练模型
  • 验证集用于模型的选择
  • 测试集用于最终对学习方法的评估

  在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。但是,在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证方法。

经验误差和泛化误差

  先给出几个定义:

  • 误差(error):模型预测的y和样本真实的y的差异;不同的loss对"误差"有不同的定义
  • 经验误差(empirical error):模型在训练集上的误差,也称为训练误差(train error)
  • 泛化误差(generalization):模型在未知/新样本上的误差
  • 过拟合(overfitting):训练误差小而泛化误差大,可能是因为模型复杂度过高,把训练集自身的特点当成总体的特点
  • 欠拟合(underfitting):训练误差比较大

看个图:
交叉验证-原理小结

  一般而言,欠拟合可以通过增加模型复杂度解决,如增加树的深度、增加迭代次数。而过拟合比较困难,交叉验证是一种缓解过拟合和模型调优的方法。

交叉验证

  交叉验证的基本想法是重复地使用数据,把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型选择。此时,我们把测试误差当做泛化误差的一种近似(因为我们假设训练样本和测试样本独立同分布),一般情况下我们要求训练集和测试集不能有交集。

简单交叉验证/留出法(hand-out)

  简单交叉验证方法:

  • 首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如70%的数据为训练集,30%的数据为测试集)
  • 然后用训练集在各种条件下(例如, 不同的参数个数)训练模型,从而得到不同的模型
  • 最后在测试集上评价各个模型的测试误差, 选出测试误差最小的模型

  使用该方法需要注意:

  • 训练集和测试集的数据分布尽量一致,比如分类任务中保证正负样本比相似
  • 由于数据划分有多种方式,可能导致模型评估不稳定可靠,一般可以多次采样,也就是多次使用留出法,采用多次评估指标的均值
  • 如果训练集中数据占比较多,此时模型更贴近用全量数据训练的模型,但是测试集较小,评估结果可能不稳定
  • 如果训练集中数据较少,和原始数据差异较大。此时降低了评估指标的保真性(fidelity)
  • 通常做法,训练集占比2/3~4/5

K折交叉验证

  应用最多的是K折交叉验证(K-fold cross validation),方法如下:

  • 首先随机地将已给数据切分为K个互不相交的大小相同的子集,D1,D2...DkD_1,D_2...D_k
  • 然后利用K-1个子集的数据训练模型,利用余下的子集测试模型
  • 将这一过程对可能的K种选择重复进行
  • 最后选出K次评测中平均测试误差最小的模型

留一交叉验证

  K折交叉验证的特殊情形是K=N, 称为留一交叉验证(leave-one-out cross validation),往往在数据缺乏的情况下使用。这里,N是给定数据集的容量。工作其实不会用,10w数据要训练10w个模型,谁有那闲工夫~

训练集、验证集、测试集的概念
交叉验证相当于把训练集和验证集放在一起了?
测试集上检验模型效果,怎么检验?也只是看有没有过拟合吧,如果数据本身质量堪忧,那么效果本身就不好啊

自助法(Bootstrap)

  数据集较小时,可以采用自助法,其逻辑很简单:

  • 假设数据集共DDnn个样本,则有放回抽样nn次得到数据集DD^{\prime}
  • 用数据DD^{\prime}训练模型,36%左右没有被抽到DD^{\prime} 中的样本做测试集

其他问题

  • K-折交叉验证时,训练集被划分成K个数据集,每一次训练都是K1K-1大小的训练集和1个子集作为验证集,那么还需不需要在预留部分数据作为测试集?
  • 周志华:在我们选择好模型参数之后,需要再用全量的数据训练一次模型,有理论支持还是经验之谈?
    • 首先,交叉验证是为了选择合适的模型,使得泛化误差尽可能小
    • 当我们选择好模型参数时,模型的复杂度其实已经确定(即交叉验证所得最优模型)
    • 此时,训练数据越多,一般模型效果会更好,因此会再训练一次
  • 工作中,我们通常是训练集训练、验证集调参、测试集检验泛化能力,其实也是在做K-flod cv,无非同一组参数只训练一次而不是K次,否则训练时间太久了

Ref

[1] 李航《统计学习方法》Ch1.5.2
[2] 周志华《机器学习》Ch2.2.2

                                2020-03-01 于南京市栖霞区

相关文章:

猜你喜欢
  • 2022-01-20
  • 2022-12-23
  • 2021-08-19
  • 2021-10-23
  • 2022-01-18
相关资源
相似解决方案