《数据科学与分析:Python语言实现》 —3.12 交叉验证
3.12 交叉验证
由于我们希望进行准确和有用的预测,因此需要确保创建的任何模型都能很好地分析训练集中所没有的外延数据。换句话说,要避免过度拟合。我们已经讨论了如何通过训练集和测试集的拆分来实现这一目标。尽管如此,我们使用单个训练数据集获得的参数可能最终反映了特定方式,这种方式是数据拆分所导致的。
针对这个问题的解决方案很简单:我们可以使用统计抽样来获得更准确的测量结果。此过程通常称为交叉验证。交叉验证通过将数据重复分成训练集和验证集,并且每次都重新执行模型训练和评估来提高统计效率。交叉验证的目的是使用数据集在训练阶段验证模型。
让我们看看为什么交叉验证能够提供帮助,考虑以下情况:我们已经进行了初步的训练/测试拆分。训练集用于建模,我们使用测试集进行评估。想象一下,现在已经使用了一种不同的随机状态来拆分数据。我们希望模型在训练期间看到不同的数据点。第二次拆分获得的泛化误差将与第一次拆分时不同。我们可以通过一遍又一遍地重复这种情况来减少可变性,使用不同的分区并对轮次中的验证结果进行平均。此外,当我们拥有大量但有限的数据点时,交叉验证是一个很好的工具。让我们看看如何通过k折交叉验证来完成。
k折交叉验证
常见的交叉验证技术是k折程序:原始数据被分成k个相等的集合。从k个子集中,保留单个分区用于验证模型,另外的k-1个子集用于训练。然后将该过程重复k次,逐个使用k个子集中的每个子集进行验证。因此,我们将共有k个训练模型。可以组合每个折叠的结果,例如通过平均,可以获得样本外误差的单个估计。k折交叉验证的示意图如图3.5所示,此处展示的是k=4的过程。
还有其他交叉验证程序,例如LOO(Leave-One-Out),其中一个数据样本用于验证,其余的M-1个数据点用于训练。如果要从整个数据集中删除p个样本,将可实现所谓的LPO(Leave-P-Out)程序。
Scikit-learn使我们能够借助KFold、LeaveOneOut和LeavePOut等函数进行交叉验证拆分。这些函数背后的想法是生成k个索引列表,可用于为每个折叠选择适当的数据点。例如,我们可以为Iris数据集创建10个折叠,如下所示:
图3.5 对于k=4,我们将原始数据集拆分为4个,并依次使用每个分区作为测试集。每个折叠的结果在最后阶段汇总(平均)
其中,KFold有效地维护一个索引,该索引跟踪进入每个训练集和测试集的数据实例。
交叉验证是一种有用且直接的方法,可以更准确地估计样本外错误,同时比单个训练/测试拆分可以更有效地使用数据。这是因为数据集中的每条记录都用于训练和验证。
交叉验证在特征和模型选择过程中也很有用。例如,它可以用于调整3.7节中引入的正则化参数λ:我们分出训练数据并训练固定值为λ的模型。然后我们可以在剩余的子集上测试它,并在改变λ的同时重复这个过程。最后,我们选择最适合的λ来最小化误差。
尽管有这些优点,但我们必须记住,交叉验证会增加需要完成的计算工作,如果过度使用,可能会导致过度拟合。不过鉴于上述优点,仍建议使用交叉验证。在本书中的一些例子中,我们不会把交叉验证步骤作为各种模型要解决的问题来介绍,但要记住,交叉验证是数据科学工作流程建模的一个组成部分。
- 点赞
- 收藏
- 关注作者
评论(0)