我在理解使用交叉验证进行超参数调优和评估的标准方法上遇到了些困难。我尝试进行10折交叉验证。以下哪种方法是正确的?
-
所有的数据都用于参数调优(例如,使用带有交叉验证的随机网格搜索)。这会返回最佳超参数。然后,使用这些超参数构建一个新的模型,并通过执行交叉验证(九折用于训练,一折用于测试,最终平均精度或混淆矩阵等指标)来评估它。
-
我找到的另一种方法是首先将数据分为训练集和测试集,然后仅在训练集上进行交叉验证。然后使用测试集进行评估。然而,据我所知,这会破坏交叉验证的整个概念,因为其背后的理念是独立于分割的,对吗?
-
最后,我的导师告诉我,我应该使用八折进行训练,一折用于超参数估计,一折用于测试(因此用于评估)。然而,我找不到任何使用这种方法的资料。这是标准程序还是我理解错了什么?
回答:
一般来说,你可以将数据分为三组。
- 训练集
- 验证集
- 测试集
测试集:
测试集是最容易解释的。
一旦你创建了测试集(数据的15-30%),你就把这个数据集存储起来,直到你认为你已经完成之前,绝对不要碰这个数据集。
– 这样做的原因很简单,一旦你开始关注这个数据集(例如,为了提高AUC或…),那么你就开始过度拟合数据…
同样的情况也适用于验证集(+/-)。当你进行超参数调优等时,你开始关注这个集合…这意味着你不再进行泛化。(一个好的模型,应该适用于所有数据,而不仅仅是测试集和验证集)。
话虽如此,现在你只剩下训练集和验证集了。
交叉验证:使用交叉验证的一些动机是获得更好的泛化和对模型/数据的更全面了解(想象一下,有些特殊情况只存在于验证集中等等+你不会轻易做出单一决定。-例如,10折交叉验证的主要缺点是…完成需要10倍的时间…但它会给你更可靠的结果…(例如,如果你进行10折交叉验证,你的AUC在80、85、75、77、81、65之间波动…–>那么你可能有一些数据问题…在完美的情况下,AUC之间的差异应该是很小的…
尽管如此…我会怎么做(这也取决于你的资源、模型、时间、数据集大小)
-
创建10个随机折。(并记录它们)
-
如果可能的话,进行10折网格搜索,以全面了解每个参数的重要性,(你不必采取小步…例如,随机森林有一个max_features参数,但如果你注意到当该值为log2时,所有模型的表现都较差,那么你可以直接排除该超参数)
- 检查哪些超参数表现良好
- 在表现良好的区域进行10折随机搜索或网格搜索
但在每次新实验中始终使用相同的折,这样你就可以将模型相互比较。+通常你会发现某些折比其他折更难,但它们对所有模型来说都是难的