交叉验证后如何使用“测试”数据集?


25

在我见过的一些讲座教程中,他们建议将您的数据分为三个部分:培训,验证和测试。但是尚不清楚应如何使用测试数据集,也不清楚这种方法比整个数据集的交叉验证如何更好。

假设我们已经将20%的数据保存为测试集。然后,我们将其余部分分解为k折,然后使用交叉验证,找到可以对该数据集中的未知数据做出最佳预测的模型。假设我们发现的最佳模型可为我们提供75%的准确性。

各种问答网站上的各种教程和许多问题都表明,现在我们可以在保存的(测试)数据集中验证模型。但是我仍然不知道它是如何完成的,也没有意义。

假设我们在测试数据集上的准确性为70%那么我们下一步该怎么做?我们是否会尝试另一个模型,然后再尝试另一个模型,直到我们在测试数据集上获得高分?但是在这种情况下,实际上看起来我们只会找到适合我们有限的(仅20%)测试集的模型。这并不意味着我们会找到总体上最好的模型。

此外,如果仅根据有限的数据集计算该分数,我们如何将其视为模型的一般评估?如果该分数很低,则可能是我们很不幸并选择了“不良”测试数据。

另一方面,如果我们使用所拥有的所有数据,然后使用k倍交叉验证来选择模型,我们将找到对来自我们所拥有的整个数据集的未知数据进行最佳预测的模型。


1
您可以在该测试集上评估最佳模型,并报告其性能。这是对模型性能的最佳估计。我建议您阅读Yaser Abu-Mostafa撰写的出色著作“从数据中学习”的前两章。很简洁,很方便。work.caltech.edu/telecourse.html
Vladislavs Dovgalecs

1
感谢您建议的书!但是,关于问题的答案-您说这是“模型性能的最佳估算”,但实际上是在小型(20%)测试集上模型性能的估算,但并非如此表示模型的总体性能。
Serhiy 2015年

2
实际上,这通常是您对模型性能的最佳估计。您的模型可能有偏见和/或承受较大的方差,但是测试集上模型的性能是如何处理任何看不见的数据的最佳指示。
弗拉迪斯拉夫(Vladislavs Dovgalecs)2015年

感谢至强!我唯一不清楚的是,使用测试数据集评估模型后我们该怎么做
Serhiy 2015年

如果您对结果满意,可以提供模型,也可以找到更好的功能/算法/更多数据来改进模型。
Vladislavs Dovgalecs,2015年

Answers:


20

这类似于我回答的有关交叉验证和测试集的另一个问题。这里要理解的关键概念是独立的数据集。仅考虑两种情况:

  1. 如果您有很多资源,理想情况下,您将收集一个数据集并通过交叉验证来训练模型。然后,您将收集另一个完全独立的数据集并测试您的模型。但是,正如我之前所说,这对于许多研究人员来说通常是不可能的。

现在,如果我不是那么幸运的研究员,我该怎么办?好吧,您可以尝试模仿这种确切的情况:

  1. 在进行任何模型训练之前,您需要分割数据并将其留在一边(在交叉验证期间切勿触摸)。这是为了模拟上面理想情况中提到的相同的独立数据集。即使它来自同一数据集,模型训练也不会从这些样本中获取任何信息(在使用交叉验证的情况下,将使用所有数据)。训练完模型后,您便可以将其应用到测试集中,这也是训练期间从未见过的,并且可以得到结果。这样做是为了确保您的模型更具通用性,而不仅仅是学习您的数据。

要解决您的其他问题:

假设我们在测试数据集上的准确度达到70%,那么下一步该怎么做?我们是否尝试其他模型,然后再尝试其他模型,直到我们在测试数据集上获得最高分?

这样的想法是,您正在根据数据创建最佳模型,然后根据以前从未见过的更多数据对其进行评估。您可以重新评估交叉验证方案,但是一旦有了经过调整的模型(即超参数),您就可以继续使用该模型,因为这是您可以做到的最好的选择。关键是永远不要使用您的测试数据进行调整。测试数据的结果就是模型在“通用”数据上的表现。复制此过程将消除数据集的独立性(这是重点)。这也是关于测试/验证数据的另一个问题。

而且,如果该分数是在有限的数据集上计算的,我们如何将其视为模型的一般评估?如果该分数很低,可能是我们很不幸选择了“不良”测试数据。

如果正确分割了数据,则不太可能。您应该随机分割数据(尽管可能会因类平衡而分层)。如果数据集足够大,可以将数据分为三部分,则测试子集应该足够大,以至于您选择不良数据的机会非常小。您的模型更有可能过拟合。


3
谢谢你这么详细的解释!我唯一不清楚的是,使用测试数据集评估模型后我们该怎么做?如果结果真的很低怎么办?我们会尝试其他模型吗?
Serhiy

如上所述,您可以重新评估交叉验证,看看是否可以改进您的方法,只要您不使用“测试”数据进行模型训练即可。如果结果很低,则可能是模型过拟合。您的数据集可能只有这么多的预测能力。
cdeterman,2015年

交叉验证不是简单地反复分为训练集和测试集(例如,测试集是前20%,然后是第二20%,然后是第三个,依此类推,或者全部随机抽取20%作为n次测试并计算平均准确度)并执行与测试集完全相同的操作?在测试之前完全不向算法显示它?
Zelphir Kaltstahl,2016年

2
@Zelphir不,每个超参数组合都会多次评估每个折叠。仅仅选择最佳结果可能比“独立”测试集报告更高的结果。这样做的目的是查看哪些参数可以在这些折叠中泛化,并在从未见过的测试集中使用该架构来确定模型的“可泛化”程度。
cdeterman

1
我要补充一点,实际上是在独立测试集上查看性能,然后决定返回并重新训练模型,这实际上会使测试集不再完全独立。实际上,您可以无限次执行此操作,直到获得完美的准确性为止。关于学术参考,我推荐这本书“从数据中学习”,作者还提供免费的在线课程(work.caltech.edu/telecourse.html)。
迈克尔

4

如果您要做的只是在原始数据集或经过最少预处理的数据集上训练具有默认设置的模型(例如,一次热编码和/或删除NA),则不需要单独的测试集,只需在您的训练上即可训练集并在您的验证集上进行测试,甚至更好,使用交叉验证对整个集进行训练以估计您的性能。

但是,一旦您对数据的了解导致您对原始策略进行了任何更改,现在您就“污染了”结果。一些示例包括:

  • 模型选择:您测试了逻辑,套索,随机森林,XGBoost和支持向量机,并选择了最佳模型

  • 参数调整:您调整了XGBoost以找到最佳的超参数

  • 特征选择:您使用了向后选择,遗传算法,boruta等方法来选择要包含在模型中的最优特征子集

  • 缺失插补:您使用均值或基于其他变量的简单模型插补缺失变量

  • 特征变换:将数值变量居中并缩放,以将其替换为z分数(均值的标准偏差数)

在上述所有情况下,使用单个保留集,甚至进行交叉验证都不会给您真实的实际性能估算值,因为您使用的是决策中不会掌握的有关未来数据的信息。相反,您正在为数据挑选最佳模型,最佳超参数,最佳功能集等,并且您可能会略微“过度拟合”您的数据策略。要真实评估实际效果,您需要对根本没有进入决策过程的数据进行评分,因此,通常的做法是使用独立于测试(建模)和验证的独立测试集(选择模型,特征,超参数等)集合。

作为提供测试集的替代方法,您可以使用一种称为嵌套交叉验证的技术。这要求您将整个建模策略(变换,归因,特征选择,模型选择,超参数调整)编码为非参数函数,然后对该整个函数执行交叉验证,就好像它只是一个模型拟合函数一样。在大多数ML软件包中很难做到这一点,但是可以通过使用包装器定义您的训练策略然后对包装的学习者重新采样,使用mlr软件包在R中很容易实现。

https://mlr.mlr-org.com/articles/tutorial/nested_resampling.html


1

我假设您正在分类。

提取数据并将其70/30拆分为trainingData / testData子集。取trainingData子集,然后将其70/30再次拆分为trainingData / validateData子集。现在,您具有原始数据的3个子集-trainingData(.7 * .7),validateData(.7 * .3)和testData(.3)。

您可以使用trainingData训练模型。然后,您使用validateData来检查模型的性能,我们可以将其视为独立于trainingData的模型,因此可以很好地评估模型的一般化程度。假设您达到了75%的准确性。

现在,您可以任意多次训练模型。每次重新训练时,您都在评估不同的超参数集(首先将参数馈入模型,而对模型进行优化的参数),但仍使用trainingData子集。每次重新培训时,您还需要通过检查validateData的性能来再次检查新模型的概括性。

一旦检查了要评估的超参数的每种组合,就可以选择一组可以在validateData上获得最佳性能的超参数-假设在validateData上的最佳性能为80%的准确性。这些是您最终的超参数,由这些超参数定义的模型是您将用于下一步的模型。

现在,您将使用使用最终超参数的模型并评估testData。自从整个过程开始以来,这是第一次接触testData!如果您获得的testData性能与validateData的性能相当(尽管通常会稍低一些),那么您可以确信您的模型能够按预期工作并且可以很好地推广!如果发生这种情况,这就是您的最终模型!

为什么所有这些呢?您正在尝试避免过度拟合。在训练和调整(即验证)模型时,始终存在过度拟合所使用数据的风险。如果仅使用一个数据集进行训练,调整(验证)和测试,则很有可能会过度拟合该数据,并且无法很好地推广。通过将训练和测试数据集分开(并假设您使用测试数据进行了调优),您就有机会在内部进行自我检查,但是现在仍然有可能只是过度拟合了测试数据。这就是为什么我们需要分解第三个数据集并进行验证的原因,所以我们还有一层可以保持内部诚实。使用validateData进行调整可防止我们过度适应trainingData。使用testData进行的最终测试可避免我们过度适合validateData。


这个答案与接受的答案有什么不同?
Jan Kukacka,

最初的问题是明确询问不包含交叉验证的工作流程。我读了他的问题,问它如何工作以及为什么可靠。接受的答案讨论了仍包含交叉验证的工作流程。我想解释一下人们是如何做的,而不必使用交叉验证,以防某人是一个初学者,也许还不是那时。抱歉,如果发布这是错误的-我是新用户,并不意味着违反了规则。
John D

0

让我们通过以下方式看一下

  1. 惯常做法

    a)训练数据-用于选择模型参数。

     i) E.g., finding intercept and slope parameters for an ordinary linear 
        regression model. 
    
     ii) The noise in the training data-set is used in some extent 
         in over-fitting model parameters. 
    

    b)验证数据-用于选择超参数。

     i)  E.g., we may want to test three different models at step 1.a, say 
         linear model with one, two or three variables.   
    
     ii) The validation data-set is independent from training data, and thus, they provide 
         'unbiased' evaluation to the models, which help to decide which 
         hyper-parameter to use. 
    
     iii) We note that, a model trained in 1.a, say y = b_0+b_1*x_1, does 
         not learn anything from this data-set. So, the noise in this data- 
         set is not used to over-fit the parameters (b_0, b_1), but, over- 
         fit exists in choosing which linear model to use (in terms of 
         number of variables). 
    

    c)测试数据-用于从上述两个步骤获得输出的置信度

    i) Used once a model is completely trained
    
  2. 另一种看待第1部分的方法

    a)我们的候选模型池是一个5维数集,即

    i) Dimension 1: number of variables to keep in the regression model, 
       e.g., [1, 2, 3].
    
    ii) Dimension 2-5: (b_0, b_1, b_2, b_3). 
    

    b)步骤1a将候选模型从5维减少到1维。

    c)步骤1b将模型候选对象从一维减少到0维,即单个模型。

    d)但是,OP可能认为上面的“最终”输出在测试数据集上的表现不够好,因此再次重做了整个过程,比如说使用脊回归而不是普通的线性回归。然后,多次使用测试数据集,因此该数据中的噪声可能会在确定使用线性回归还是岭回归时产生一些过拟合。

    e)为了处理具有参数,超参数,模型类型和预处理方法的高维模型池,对我们可用数据的任何拆分本质上都定义了决策过程,

    i)  Sequentially reducing the model pool to zero-dimension.
    
    ii) Allocating data noise overfitting to different steps of dimension 
        reductions (overfitting the noise in the data is not avoidable but 
        could be allocated smartly). 
    
  3. 结论和对OP问题的回答

    a)两分割(训练和测试),三分割(训练,验证和测试)或更大量的分割实质上是关于减少维数和分配数据(尤其是噪声和过度拟合的风险)。

    b)在某个阶段,您可能会提出一个“最终”模型候选库,然后,您可以考虑如何设计按顺序减小维数的过程,以便

    i) At each step of reducing the dimensions, the output is satisfactory, 
      e.g., not using just 10 data points with large noise to estimate a 
      six-parameter liner model. 
    
    ii) There are enough data for you to reduce the dimension to zero 
       finally. 
    

    c)如果无法实现b

    i) Use model and data insight to reduce the overall dimensionality of 
      your model pool. E.g., liner regression is sensitive to outliers thus 
      not good for data with many large outliers. 
    
    ii) Choose robust non-parametric models or models with less number of 
       parameter if possible. 
    
    iii) Smartly allocating the data available at each step of reducing the 
        dimensionality. There is some goodness of fit tests to help us decide 
        whether the data we use to train the model is enough or not. 
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.