模型超参选择 之 交叉验证

1. 什么是交叉验证

将原始数据等分为若干组,一部分做为训练集来训练模型,另一部分做为验证集来测试模型的泛化性能。

2. 为什么要做交叉验证

在机器学习领域,模型在训练集上的效果固然很重要,但模型的泛化性能直接影响模型的可用性。此时,就需要将数据一分为二,一部分用于训练,一部分用于测试泛化性能。因此,交叉验证具有如下好处:

  • 可以用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
  • 可以从有限的数据中获取尽可能多的有效信息。

3. 什么时候需要交叉验证

交叉验证主要用于数据不是很充足的时候。

  • 如果数据样本量小于一万条,就会采用交叉验证来训练、优化、选择模型。
  • 如果样本大于一万条的话,一般会随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型用于测试集,最终决定使用哪个模型以及对应参数。

4. 如何做交叉验证

根据切分的方法不同,交叉验证分为以下几种:

  1. 第一种是简单交叉验证,所谓的简单,是和其他交叉验证方法相对而言的。首先,我们随机的将样本数据分为两部分(比如: 70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后我们选择损失函数评估最优的模型和参数。

  2. 第二种是K折交叉验证(K-Folder Cross Validation)。和第一种方法不同,K折交叉验证会把样本数据随机的分成K份。每次选择1份作为验证集,剩下的K-1份来训练数据。训练后得到一个模型,用这个模型在相应的测试集上测试,计算并保存模型的评估指标。重复上述过程 k 次,使得每个子集都有一次机会作为验证集。计算 k 结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。
    在这里插入图片描述

  3. 第三种是留一交叉验证(Leave-one-out Cross Validation),它是第二种情况的特例,此时K等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。
    此方法主要用于样本量非常少的情况,比如对于数据量普通适中的问题,N小于50时,一般采用留一交叉验证。在这里插入图片描述

  4. 此外还有一种比较特殊的交叉验证方式,也是用于样本量少的时候。叫做自助法(bootstrapping)。
    比如我们有m个样本(m较小),每次在这m个样本中随机采集一个样本,放入训练集,采样完后把样本放回。这样重复采集m次,我们得到m个样本组成的训练集。当然,这m个样本中很有可能有重复的样本数据。同时,用没有被采样到的样本做测试集。这样接着进行交叉验证。由于我们的训练集有重复数据,这会改变数据的分布,因而训练结果会有估计偏差,因此,此种方法不是很常用,除非数据量真的很少,比如小于20个。

5. 使用情形

通过反复的交叉验证,用损失函数来度量得到的模型的好坏,最终我们可以得到一个较好的模型。那这三种情况,到底我们应该选择哪一种方法呢?

一句话总结,如果只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以了。否则就用K折交叉验证。在样本量少的时候,使用K折交叉验证的特例留一交叉验证。

6. 注意事项

  • 当数据集的划分不是随机进行的,或者划分出的子集只包含了数据集的一部分特征时,因为无法确定哪些数据点会出现在验证集中,过拟合是无可避免的。因此,只有在拥有足够多的数据时,并且对于不同的划分方式都能得到类似的模型得分(误差平方和)和最佳模型参数,简单交叉验证才是一个不错的选择。

  • 当对于不同的划分,我们总是能得到不同的模型得分和最佳模型参数时,KFlod是一个好的选择。而当对小数据集进行处理时,留一法(LeaveOneOut)是更好的选择。分层法能使验证集更加稳定并且对于小而不平衡的数据集是有奇效的。

  • 通常对于大数据集k=3或k=5是建议首选的,而对于小数据集推荐使用留一法

在数据分析中,交叉验证是非常有用的用以评估模型效果的方法,特别是防止过拟合和欠拟合方面。此外,对于模型超参数的确定也是极其有效的。交叉验证选择的参数,得到的模型会有更小的测试误差。

猜你喜欢

转载自blog.csdn.net/SkullSky/article/details/106364642
今日推荐