雷锋网 ai 科技评论按:文章的作者 georgios drakos 是一名数据科学家,通过本文作者向我们介绍了交叉验证的基本概念、作用以及如何使用。雷锋网 ai 科技评论根据原文进行了编译。
验证可能是数据科学家们所使用的最重要的技术之一,因为验证操作有助于我们了解模型的稳定性——用来探索模型对新数据的泛化能力。我们需要确保模型从数据中正确学习到了大部分的模式,并且没有被数据中的噪声过度干扰,也就是说,模型的偏差和方差都能保持在一个较低值。而本文的目的正是要介绍一下有关于交叉验证(cross-validation)的概念。
franck v 拍摄,来自于 unsplash
什么是交叉验证?
「交叉验证」是一种模型验证技术,可用于评估统计分析(模型)结果在其它独立数据集上的泛化能力。它主要用于预测,我们可以用它来评估预测模型在实践中的准确度。
交叉验证的目标是定义一个数据集,以便于在训练阶段(例如,验证数据集)中测试模型,从而限制模型过拟合、欠拟合等问题,并且帮助我们了解模型在其它独立数据集上的泛化能力。值得一提的是,验证集和训练集必须满足独立同分布条件,否则交叉验证只会让结果变得更加糟糕。
为什么交叉验证会有这些助益?
验证有助于我们评估模型的质量验证有助于我们挑选出那些能够在预测数据集上取得最好性能的模型验证有助于我们避免过拟合与欠拟合
什么是过拟合/欠拟合?
欠拟合指的是模型没能够从训练数据中学习到足够的模式。此时,模型在训练集和测试集上的表现都非常差。过拟合则有两种情况:第一种,模型学习到过多的噪声;第二种,模型学习到的模式泛化能力差。此时,模型在训练集上表现很好,但是在测试集上表现则非常差(对于分类任务而言,可以看作是模型学习到了同类别的不同实例之间的区别,并把它们作为分类依据,所以面对新的实例时分类性能不佳)。
而最佳的模型应该能够在训练集和测试集上都表现得很好。
不同的验证策略
通常,依据数据集中分割方式的不同,会有不同的验证策略。
训练测试集划分/holdout 验证 —— 组数为 2
在该策略中,我们简单地将数据集划分成两组:训练集和测试集,并且要求训练集和测试集之间的样本不存在任何重叠,如果存在重叠,那么验证手段将失效。在准备发布最终模型之前,我们可以在整个数据集上重新训练模型,而不需要更改任何超参数。
但是这种划分方式存在一个主要的缺陷:
如果我们的划分方式并不是随机的呢?比如,我们数据的某个子集只有来自于某个州的人,或者某个子集中只含有某一特定水平收入的员工,又或者子集中只含有女性或特定年龄的人,这时我们该怎么办?尽管我们一直在极力避免,但是这些情况都将导致模型的过拟合,因为此时无法确定哪些数据点会出现在验证集中,并且针对不同的数据集,模型的预测结果也可能完全不同。因此,只有当我们拥有充足的数据时,这种做法才是合适的。
python 的实现方式:sklearn.model_selection.train_test_split
k 分划分 —— 组数为k
由于永远不会有充足的数据来训练模型,因此如果将数据集中的某一部分划分出来用于验证还会导致模型出现欠拟合的问题。由于训练数据样本减少,我们的模型面临着丢失掌握重要模式/趋势机会的风险,从而增加偏差引起的误差。因此,我们需要一种方法,它既能够为训练模型提供充足的数据样本,又能够为验证步骤保留一定数量的数据。k 分(k-fold)交叉验证正是我们所需要的。
k 分交叉验证可以看做是执行了多次的简单二分划分验证,然后我们在执行了 k 次不同的简单划分验证之后继续简单地将得分进行平均。数据集中的每个数据点只能在验证集中出现一次,并且在训练集中出现 k-1 次。这种做法将大大减轻欠拟合现象,因为我们使用了几乎所有的数据来训练模型,同时还能显著减少过拟合现象,因为大部分数据也被用来做验证。
当我们的数据量较小时,或者在不同的划分数据集中,我们的模型性能或者最优参数存在较大的区别时,k 分交叉验证是一种很好的选择。通常情况下,我们设置 k=5 或 k=10,这些值来自于经验总结,大量实验证明当 k 取这些值时,验证结果不会存在过高的偏差或者方差。
python 实现代码:sklearn.model_selection.kfold
留一法 —— 组数训练数据集大小
当 k 等于数据集中的样本数时,留一法(leave one out)实际上可以看做 k 分交叉验证的一个特例。这意味着每次使用 k-1 个样本作为训练样本而剩下 1 个样本作为验证样本,然后照此遍历数据集。
如果我们的数据量非常小并且模型的训练速度非常快,那么可以考虑该方法。
python 实现代码:sklearn.model_selection.leaveoneout
额外补充 —— 分层法(stratification)
通常,在使用训练集/测试集划分或者是 k 分交叉验证的时候,我们会将数据集进行随机重排,以便于得到随机的训练/验证集划分。在这种情况下,可以将不同的目标分布应用于不同的划分区域中。通过分层法,当我们在分割数据时,我们可以在不同的划分区域中获得相似的目标分布。
该方法对以下情况有效:
小数据集数据不平衡多分类问题
通常而言,对于一个类别平衡的大型数据集,分层划分法和简单的随机划分基本一样。
什么时候使用?
如果我们有充足的数据,并且对于不同的划分方式,我们都能获得相近的成绩以及最优参数模型,那么训练集/测试集二分划分是一种不错的选择。而如果恰恰相反,也就是对于不同的划分方式,模型的测试成绩和最优参数都存在着较大的差异时,我们可以选择 k 分交叉验证。如果数据总量非常少,则可以考虑使用留一法。此外,分层法有助于使验证结果更加稳定,并且对于小型且类别不平衡的数据集尤其管用。
k 分交叉验证的 k 该取多少?
当 k 的取值越大时,由偏差导致的误差将减少,而由方差导致的误差将增加,此外计算的代价也将上升。显然,你需要更多的时间来计算,并且也会消耗更多的内存。
当 k 的取值越小时,由方差导致的误差将减少,而由偏差导致的误差将增加。此外,这时所需的计算资源也将减少。
针对大型数据集的时候,我们通常将 k 设置为 3 或者 5,但是对于小型数据集我们还是建议采用留一法。
总结
交叉验证是数据科学家评估模型有效性的一个非常有用的工具,特别是用于解决过拟合和欠拟合问题。此外,在确定模型最优超参数问题上,它也是非常有帮助的。
via 《cross-validation》,由雷锋网 ai 科技评论编译。