嵌套交叉验证--学习笔记

  1. 区分K-Fold交叉验证和嵌套K-Fold交叉验证的区别:
    1. K-Fold交叉验证:只有一个loop(循环),即内层循环
      1. 将数据集切分为k-折叠;
      2. 对于任意i in [1; k],在第i个折叠上测试模型,并且在剩余的折叠上训练模型;
      3. 最后的结果是计算k个验证结果的均值。
  2. 嵌套K-Fold交叉验证:
    1. 有两个loops(循环),即内层循环和外层循环:对于在K-Fold中每一个i,都有一个嵌套的K-Fold交叉验证。
    2. 嵌套交叉验证包含于交叉验证,并用在训练模型的步骤中,如果模型的超参数需要被优化,则应该选择嵌套交叉验证方法
    3. 嵌套交叉验证是通过对基础模型泛化误差的估计来进行超参数的搜索,以得到模型最佳参数。”
    4. 内置的交叉验证是传统交叉验证法(这里常指K-Fold交叉验证)的延伸,传统的交叉验证仅是将数据集拆分为训练集和测试集,无法解决最优模型的选择及模型调参问题
    5. 弊端:
      1. 可能会造成信息泄漏;
      2. 由于是对相同数据进行误差估计,所以会导致较高的偏差(当用可能的模型最佳超参数对相同的训练集和测试集进行误差的计算时,模型是有偏的,会导致较大偏差) 。 模型选择看重偏差和方差,因此一个好的评估模型真实误差的方法应是结合无偏和低方差两个方面。
    6. 运行流程包含两个循环,即外层循环和内层循环:
      1. 内层循环是指带有搜索模型最佳超参数功能的交叉验证,目的是给外层循环提供模型的最佳超参数。例如,随机搜索或者网格搜索。
      2. 外层循环是给内层循环提供训练数据,同时保留部分数据,以作对内层循环模型的测试。通过这样的方式,可以防止数据的信息泄漏,以得到相对较低的模型评分偏差。
    7. 使用随机搜索的K-fold 内嵌交叉验证算法流程:
      要提供的超参数:k1(外层循环的折数),k2(内层循环的折数),D(包含输入特征x,输出特征y的数据集),P_sets(不同的超参数集合),M(一个估计器模型)
      for i=1 to K1 :
          将第i折数据切分为训练集train_i和测试集test_i
          for j=1 to K2:
              将第j折数据切分为训练集train_j和测试集test_j
              for each p in randomsample(P_set):
                  使用p超参数集在train_j上进行训练模型M
                  使用M在test_j上计算测试误差    
          根据测试误差从p_set中选择最优的超参数集p*
          使用p*在train_i上训练模型
          使用M在test_i上计算测试误差    
    8. 何时使用嵌套的交叉验证:
      1. 如果数据集非常大时,使用内置交叉验证法的计算成本会很高。如果数据集包涵几千个样本,会发现计算过程是较漫长的。 内置交叉验证的使用场景较为有限,尤其应用在数据量不会很大的领域,如生物领域(数据量不会很大,一般指小于几千个样本的数据)。
      2. 当计算成本不是很大时,需要考虑可以提供的硬件条件。 如果满足以上两个标准,就可以考虑使用嵌套交叉验证来计算数据,得到几乎无偏的估计误差,从而对比不同算法的表现。
      3. “在使用随机森林,支持向量机(Gaussian kernel),和梯度提升等算法时,很可能不需要使用嵌套交叉验证。” (这里说的是“很可能”,不是一个绝对的表达,因此,如果计算成本是可支付的,那么嵌套交叉验证仍是需要的)
      4. “当使用任何分类算法时,内置交叉验证过程很可能是不需要使用的。” (这里说的仍是“很可能”,但如果需可以使用的超参数是有限的,即不需要如何费力调节,那么使用嵌套交叉验证就会很浪费时间)。
    9. 嵌套交叉验证可以应用于时间序列数据

      1. 在熟悉嵌套交叉验证方法和其优良的性质后,可以发现嵌套交叉验证可以用于时间序列数据的模型选择和参数优化。对于包含时间信息的数据,如果使用传统的交叉验证方法,单纯的将数据集随机拆分为训练集和测试集,则模型在测试集的表现很可能不好,即出现过拟合的情况。

      2. 因此,传统的交叉验证方法在处理时间序列数据时具有一定的局限性。(其中:时间序列数据指的是在每一个样本中,至少含有一个时间戳字段)

      3. 为避免对时间序列数据集不当的拆分,模型在训练集上表现较佳,而在测试集表现较差,即出现过拟合现象。传统的交叉验证方法不适用于时间序列数据。

      4. 针对时间序列数据应着重解决如下三个问题:

        1. 拆分时间序列数据不会造成信息的泄漏;

        2. 在使用内置的交叉验证时,可以在独立的测试集上获得误差的无偏估计;

        3. 数据集可以对多时间序列数据进行验证。     

  3. 后嵌套交叉验证步骤:
    1. 如果模型结果稳定(例如,一些超参数的设置基本得到相同的误差估计结果),接下来可以使用传统的交叉验证。
    2. 运行步骤总结如下:
      1. 将所有希望使用的算法放到嵌套交叉验证中计算模型误差。 a. 如果结果稳定就进入到下一步,结果不稳定就就该结果不稳定的模型。
      2. 选择泛化误差最小的模型。
      3. 将该算法在带有网格搜索或随机搜索的交叉验证中运行(不提供任何最佳的超参数)。
      4. 将模型在嵌套交叉验证中的得分与上一步中使用的交叉验证得分进行比较。 从而,可以检验传统的交叉验证方法是否可以对模型进行无偏估计。如果结果相差很大,将嵌套交叉验证的得分作为传统交叉验证的指标,并在传统的交叉验证中引入误差估计。

猜你喜欢

转载自blog.csdn.net/weixin_45647721/article/details/127277320
今日推荐