3.1. Cross-validation(交叉验证): evaluating estimator performance(一)

3.1. Cross-validation: evaluating estimator performance

一、简介

这一段我反反复复修改了很多次,最后,我发现,我很难靠自己的语言细致的阐述这部分内容。所以,我先把自己的理解呈现出来,最后再给出对sklearn文档的翻译。

1.1 最本质的理解

我们知道,统计(观测)存在误差。为了尽可能的消除误差,我们会选择多次观测,并对统计值取平均。(这个应该很好理解)但是在机器学习中,我们发现,如果在同一个数据集上不断测试,会造成过拟合(并且,反复测试同一组数据会使得测试结果天然的倾向于更乐观,从而造成假象),所以,我们采用交叉验证。

即,将数据分成几部分,每次,选取一部分作为训练集,另一部分作为测试集,最后在对结果“取平均”,从而避免以上提到的问题。

1.2 最常见的应用:调参

无论是机器学习还是深度学习,绝大多数的模型使用时都会涉及的参数的选择。

俗话说的好,实践是 检验真理的唯一标准。所以,为了验证什么样的参数最符合要求,我们需要新的数据的集合来对模型进行测试。

但是,这所谓的“数据的集合”不能是最后的测试集,因为那样会影响到最后测试的准确性和降低模型的性能。

所以,在将最初数据集划分为“训练集”和“测试集”之后,我们通常会在训练集内再次对数据进行划分(分出用于训练模型的和测试参数的)。而面对这个问题,我们最常采用交叉验证的方式。

所以说,交叉验证在调参上的应用及其广泛。

1.3 sklearn文档(我有给出自己的注释)

学习预测函数的参数并在同一数据上进行测试是一个方法错误:一个模型,只需重复它刚刚看到的样品的标签,就会有一个完美的分数,但无法预测任何有用的尚未看到的数据。
这种情况被称为过度拟合。为了避免这种情况,在进行(监督)机器学习实验时,通常的做法是将部分可用数据作为测试集X_test、y_test。
请注意,"实验"一词并非仅表示学术用途,因为即使在商业环境中,机器学习通常也是从实验开始的。最佳参数可通过网格搜索技术确定。

在模型设置不同“超参数”时(超参数是指需手动调的参数,与模型训练过程中自己学习的参数相区分),例如必须手动为 SVM 设置参数 C 时,测试集仍有过度拟合的风险,因为在调参(超参数)过程中,模型仍在被训练(参数也会在模型相对稳定,也就是趋于最优前,不断的调整)。
这样,有关测试集的知识可以"泄漏"到模型中,评估指标不再报告概括性能。
为了解决这个问题,数据集的另一部分可以作为所谓的"验证集"进行:培训在培训集上进行,之后在验证集上进行评估,当实验似乎成功时,可以在测试集上进行最终评估。

但是,通过将可用数据分成三组,我们大幅减少了可用于学习模型的样本数量,结果可以取决于对(训练、验证)集的特定随机选择(因为我们减少了“可用于学习模型的样本数量”,所以在我们得到的,通过训练集训练出的模型,和整个样本上所得的模型是有差异的。因此,我们的“结果”,也会收到对训练集、验证集选取的影响)。

解决这个问题的办法就是进行交叉验证(简称 CV)。测试集仍应进行最终评估,但在进行 CV(交叉验证) 时不再需要验证集。在称为k折交叉验证的基本方法中,培训集被拆分为k份(也有不同的形式会在后面介绍,但通常遵循相同的原则)。每个“ k折交叉验证”都遵循以下程序:

  1. 将初始训练集划分为K份;
  2. 使用k−1份数据作为训练集对模型进行训练; 生成的模型在数据的剩余部分得到验证(这种情况下);
  3. 然后,k折交叉验证报告的性能度量是循环中计算值的平均值。

这种方法的计算成本很高,但不会浪费太多数据(它会弥补单独划分验证集所造成的损失),
这在诸如样本数量非常少的“不利推断”等问题中是一个主要优势。

二、各类交叉验证涉及的思想

  1. 重复repeat:进行多次交叉验证,每次采取不同的划分
  2. 随机shuffle:传统的交叉验证是直接按照索引分块划分验证集的,但是我们也可以随机的进行划分
  3. 分层Stratified:根据样本的标签分层划分(即尽量满足训练集和验证集中,不同类的比例一致)

三、Cross validation iterators(交叉验证迭代器)

3.1 独立同分布(Cross-validation iterators for i.i.d. data)

  1. K折交叉验证(K-fold):最普通的交叉验证方式(因为数据是独立同分布的,所以其不会收到类别和组别[组别的概念会在之后介绍]的影响。)
  2. Repeated K-Fold :重复K折交叉验证,就是对K折交叉验证的重复,不过,因为每进行一次交叉验证集的划分时,划分的验证集都不一样,所以最后得到的评估指标也更稳定。
  3. 留一法 Leave One Out (LOO):每次留出一个样本用于测试,是K折交叉验证的特例,比较极端。
  4. “留P法”Leave P Out (LPO):同留一法一样,不过是手动定义了每次验证的验证集大小,本没有改变交叉验证的本质。
  5. Random permutations cross-validation a.k.a. Shuffle & Split(随机参数交叉验证):依然是交叉验证,但不再分成k份,而是每次验证通过随机的方式选择验证集。

3.2 基于类别的交叉验证

在处理实际的分类问题是,我们经常会发现类别不平衡的现象,所以,基于类别,我们可以选取不同的交叉验证策略。

  1. Stratified k-fold(分层交叉验证):我们基于样本的“标签”对数据集进行分层抽样,从而划分出合适的验证集
  2. Stratified Shuffle Split:是 "Shuffle Split"的变体。在尽可能满足训练集和数据集中,不同样本的标签比例一样的条件下,随机的划分数据集。

3.3 基于组别的交叉验证

在这里插入图片描述

先大致翻译一下sklearn的阐述:

如果我们的样本是根据不同的组别采样得到,则i.i.d. (独立同分布)假设被打破。

这样的数据分组是特定于域的。例如,从多个患者那里收集了医疗数据,从每个患者身上采集了多个样本。这些数据可能取决于各个群体。在我们的示例中,每个样本的患者 ID 将是其组标识符。

在这种情况下,我们想知道,在特定组上训练的模型是否很好地概括到看不见的群体。为了衡量这一点,我们需要确保交叉验证中的所有样本都来自在训练集中完全没有表示的组(简单理解就是训练集和验证集来自不同的组)。

以下交叉验证拆分器可用于该点。样品的分组标识符通过组参数指定。

  1. Group k-fold:在保证训练集和验证集来自不同的组的情况下进行交叉验证划分。(如果训练集和验证集出现同一个组别,则模型倾向于应用该组别的特征,从而影响到模型的泛化性能)
  2. StratifiedGroupKFold:K折分层组验证,同时考虑到了标签和组别的分布

实施说明:

在当前实现的情况下,在大多数情况下,完全洗牌是不可能的。当 shuffle=True 时,将发生以下情况:

  • 所有组都进行了洗牌。
  • 使用稳定排序按类的标准差对组进行排序。
  • 对已排序的组进行迭代并分配给折叠。

这意味着只有具有相同类分布标准差的组才会被洗牌,当每个组只有一个类时,这可能很有用。

该算法贪婪地将每个组分配给n_splits测试集之一,选择的测试集可以最大程度地减少测试集之间类分布的差异。组分配从类频率从最高到最低的组开始,即首先分配一个或几个类中达到峰值的大型组。

从某种意义上说,这种分裂是次优的,即使完美的分层是可能的,它也可能会产生不平衡的分裂。如果每个组中的类分布相对接近,则最好使用 GroupKFold。

  1. Leave One Group Out
  2. Leave P Groups Out(3和4听名字也知道是干啥的)
  3. Group Shuffle Split:是 ShuffleSplitLeavePGroupsOut 的组合,它生成一个随机划分分区的序列,其中为每个分组提供了一个组子集。(当我们需要采用 LeavePGroupsOut ,但是受限于其过大的计算规模时,我们可以借助一个随机(可重复)的训练 / 测试划分采样。)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值