K折交叉验证

交叉验证是一种用于估计机器学习模型技能的统计方法。

它通常在应用机器学习中用于比较和选择给定预测建模问题的模型,因为它易于理解、易于实现,并且所产生的技能估计通常比其他方法具有更低的偏差。

在本教程中,您将简要介绍用于估计机器学习模型技能的 k 折交叉验证过程。

完成本教程后,您将了解:

k 折交叉验证是用于估计模型在新数据上的技能的过程。

您可以使用一些常见策略来为数据集选择 k 值。

交叉验证有常用的变体,例如 scikit-learn 中提供的分层stratified和重复repeated 。

教程概述

本教程分为5部分;他们是:

1.k 折交叉验证

2.k的配置

3.工作示例

4.交叉验证API

5.交叉验证的变化

1.k 折交叉验证

交叉验证是一种重采样过程,用于评估有限数据样本上的机器学习模型。

如果您有机器学习模型和一些数据,您想知道您的模型是否适合。您可以将数据分为训练集和测试集。使用训练集训练模型并使用测试集评估结果。但你只评估了一次模型,你不确定你的好结果是不是运气。您需要多次评估模型,以便对模型设计更有信心。

该过程有一个称为 k 的参数,它指的是给定数据样本要分成的组数。因此,该过程通常称为 k 折交叉验证。当选择 k 的特定值时,可以使用它来代替模型参考中的 k,例如 k=10 成为 10 倍交叉验证。

交叉验证主要用于应用机器学习中,以评估机器学习模型对未见过的数据的技能。也就是说,使用有限的样本来估计模型在对模型训练期间未使用的数据进行预测时的总体预期表现。

它是一种流行的方法,因为它易于理解,并且与其他方法(例如简单的训练/测试分割)相比,它通常会导致对模型技能的偏差较小或不太乐观的估计。

请注意,k 折交叉验证是为了评估模型设计,而不是特定的训练。因为你用不同的训练集重新训练了相同设计的模型。

一般流程如下:

1.随机打乱数据集。

2.将数据集分成k组

3.对于每个独特的组:

将该组作为保留或测试数据集

将其余组作为训练数据集

在训练集上拟合模型并在测试集上评估它

保留评估分数并丢弃模型

4.使用模型评估分数样本总结模型的技能

重要的是,数据样本中的每个观察值都分配给一个单独的组,并在整个过程期间保留在该组中。这意味着每个样本都有机会在保留集中使用 1 次并用于训练模型 k-1 次。

同样重要的是,在拟合模型之前对数据的任何准备都发生在循环内的 CV 分配的训练数据集上,而不是在更广泛的数据集上。这也适用于任何超参数的调整。未能在循环内执行这些操作可能会导致数据泄漏和模型技能的乐观估计。

k 次交叉验证运行的结果通常用模型技能得分的平均值来总结。包含技能分数方差的度量也是一种很好的做法,例如标准差或标准误差。

2.k的配置

必须为您的数据样本仔细选择 k 值。

k 值选择不当可能会导致对模型技能的错误表述,例如具有高方差的分数(可能会根据用于拟合模型的数据而发生很大变化)或高偏差,(例如高估模型的技能)。

选择 k 值的三种常见策略如下:

代表性:选择 k 值,使得每个训练/测试数据样本组都足够大,能够在统计上代表更广泛的数据集。

k=10:k 的值固定为 10,该值是通过实验发现的,通常会产生具有低偏差和适度方差的模型技能估计。

k=n:k 的值固定为 n,其中 n 是数据集的大小,以使每个测试样本有机会在保留数据集中使用。这种方法称为留一交叉验证。

k=10 的值在应用机器学习领域非常常见,如果您很难为数据集选择一个值,则建议使用 k=10。

总而言之,在 k 折交叉验证中,存在与 k 的选择相关的偏差-方差权衡。通常,考虑到这些因素,人们会使用 k = 5 或 k = 10 执行 k 倍交叉验证,因为这些值已根据经验显示,可以产生既不会受到过高偏差也不会受到非常高方差影响的测试错误率估计。

如果选择的 k 值未均匀分割数据样本,则一组将包含其余示例。最好将数据样本分成k组,样本数相同,使得模型技能得分的样本都相等。

有关如何配置 k 折交叉验证的更多信息,请参阅教程:https://machinelearningmastery.com/how-to-configure-k-fold-cross-validation/

3.工作示例

为了使交叉验证过程具体化,让我们看一个有效的示例。

假设我们有一个包含 6 个观察值的数据样本:

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]

第一步是选择 k 值,以确定用于分割数据的折叠数。在这里,我们将使用 k=3 的值。这意味着我们将打乱数据,然后将数据分成 3 组。因为我们有 6 个观察值,所以每组将有相等数量的 2 个观察值。

Fold1: [0.5, 0.2]
Fold2: [0.1, 0.3]
Fold3: [0.4, 0.6]

然后我们可以利用该样本,例如评估机器学习算法的技能。每次折叠都会训练和评估三个模型,并有机会成为测试集。

例如:
Model1:在 Fold1 + Fold2 上训练,在 Fold3 上测试

Model2:在 Fold2 + Fold3 上训练,在 Fold1 上测试

Model3:在 Fold1 + Fold3 上训练,在 Fold2 上测试

这些模型在经过评估后会被丢弃,因为它们已达到其目的。

收集每个模型的技能分数并进行汇总以供使用。

4.交叉验证API

我们不必手动实现 k 折交叉验证。 scikit-learn 库提供了一个实现,可以分割给定的数据样本。

可以使用 KFold() scikit-learn 类。它将分割数、是否对样本进行洗牌以及洗牌之前使用的伪随机数生成器的种子作为参数。

例如,我们可以创建一个实例,将数据集拆分为 3 部分,在拆分之前进行洗牌,并为伪随机数生成器使用值 1。

Kfold = Kfold(n_splits=3, shuffle=True, random_state=1)

然后可以在将数据样本作为参数提供的类上调用 split() 函数。重复调用,分割将返回每组训练集和测试集。具体来说,返回的数组包含原始观察数据样本的索引,以用于每次迭代的训练和测试集。

例如,我们可以使用创建的 KFold 实例枚举数据样本的索引分割,如下所示:

#enumerate splits
for train, test in Kfold.split(data):
    print('train: %s, test: %s' % (train, test))

我们可以将所有这些与上一节的工作示例中使用的小数据集联系在一起。

运行该示例会打印为每个训练集和测试集选择的特定观察结果。索引直接用于原始数据数组来检索观察值。

# scikit-learn k-fold cross-validation
from numpy import array
from sklearn.model_selection import KFold
# data sample
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# prepare cross validation
kfold = KFold(3, shuffle=True, random_state=1)
for train, test in kfold.split(data):
	print('train: %s, test: %s' % (data[train], data[test]))
train: [0.1 0.4 0.5 0.6], test: [0.2 0.3]
train: [0.2 0.3 0.4 0.6], test: [0.1 0.5]
train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]

有用的是,scikit-learn 中的 k 重交叉验证实现作为更广泛方法中的组件操作提供,例如网格搜索模型超参数和对数据集上的模型进行评分。

尽管如此,可以直接使用 KFold 类,以便在建模之前分割数据集,以便所有模型都将使用相同的数据分割。如果您正在处理非常大的数据样本,这尤其有用。在算法之间使用相同的分割可以为您稍后可能希望对数据执行的统计测试带来好处。

5.交叉验证的变化

k 折交叉验证过程有许多变体。

三种常用的变体如下:

训练/测试分割:在一个极端情况下,k 可以设置为 2(而不是 1),以便创建单个训练/测试分割来评估模型。

LOOCV:采取另一个极端,k 可以设置为数据集中的观察总数,以便每个观察都有机会被保留在数据集中。这称为留一交叉验证,简称 LOOCV。

分层:将数据分割为折叠可能受标准控制,例如确保每个折叠具有相同比例的具有给定分类值(例如类别结果值)的观察值。这称为分层交叉验证stratified cross-validation.。

重复:这是 k 折交叉验证过程重复 n 次的地方,重要的是,数据样本在每次重复之前都会被打乱,这会导致样本的不同分割。

嵌套:这是在每次交叉验证中执行 k 次交叉验证的地方,通常是为了在模型评估期间执行超参数调整。这称为嵌套交叉验证或双重交叉验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值