交叉验证是如何执行的以及 GridSearchCV() 具体是如何执行的?

Posted

技术标签:

【中文标题】交叉验证是如何执行的以及 GridSearchCV() 具体是如何执行的?【英文标题】:How is Cross Validation performed and how GridSearchCV() specifically? 【发布时间】:2020-02-11 22:26:52 【问题描述】:

GridSearchCV()(和或RandomizedSearchCV())如何在 scikit 中实现?我想知道以下几点:在使用其中一种技术时,如何考虑以下方面:

验证集 型号选择 超参数调优 预测

?这是一张总结我困惑的图片:

什么时候发生什么,多久发生一次?也许为了简单起见,让我们假设一个单一的神经网络作为我们的模型。 到目前为止我的理解:

在第一次迭代中,模型适合训练折叠,分成不同的折叠。在这里我已经很挣扎了:模型是在单折上训练然后在验证折上测试的吗? 那么下一个折叠会发生什么?模型是否保持其第一次训练折叠所获得的权重,还是会为下一次训练折叠重新初始化?

更准确地说:在第一次迭代中,模型是否在所有折叠之间独立地在验证集上拟合了四次并测试了四次?

当下一次迭代开始时,模型不会保留第一次迭代的信息,对吧? 因此,所有迭代和所有折叠都是相互独立的吗? 这里的超参数是如何调整的?

在上面的例子中,总共有 25 个折叠。具有一组恒定超参数的模型是否适合并测试了 20 次? 假设我们有两个超参数需要调整:学习率和辍学率,都有两个级别:

learning_rate = [0.3, 0.6] 和 dropout_rate = [0.4, 0.8]。

神经网络现在能拟合 80 次吗?当不仅有一个模型,而且例如两个模型(神经网络和随机森林),整个过程会执行两次?

有没有可能看看GridSearchCV()会考虑多少折?

我见过Does GridSearchCV perform cross-validation?、Model help using Scikit-learn when using GridSearch 和scikit-learn GridSearchCV with multiple repetitions,但我看不到对我的问题的清晰准确的答案。

【问题讨论】:

是的,您的 NN 将被安装 80 次,是的,如果您在另一个模型上测试,它将是 x2 【参考方案1】:

所以k-folds方法:

您将训练集分成 n 部分(k 折),例如 5。您将第一部分作为验证集,将其他 4 部分作为训练集。您进行培训,这将为您提供培训/简历表现。您这样做 5(折叠次数)次,每个折叠成为验证集,其他折叠成为训练集。最后,您对性能进行平均以获得模型的 cv 性能。这是用于 k 折的。

现在,GridSearchCV 是一个使用 k-folds 方法的超参数调谐器。原则是你给gridsearch一个包含你想要测试的所有超参数的字典,然后它会测试所有的超参数(字典)并选择最好的超参数集(那些具有最佳模型cv性能的)。这可能需要很长时间。

您在 gridsearch 中传递一个模型(估计器)、一组参数以及是否需要 k-folds 的数量。

例子:

GridSearchCV(SVC(), parameters, cv = 5)

其中SVC() 是估计器,parameters 是您的超参数字典,cv 是折叠数。

【讨论】:

谢谢,但是具体是怎么执行的我还是不知道。模型在第一次迭代中拟合一次还是四次?在第二次迭代中除了折叠会有什么变化? 在第一次迭代中,它将被拟合一次,然后是有效折叠变化和模型拟合一次,然后是有效折叠变化等等 然后我会以不同的方式制作所有图像......谢谢!超参数会从一次迭代更改为另一次迭代吗? 每改变一个超参数,模型就会被测试 k 次。 k-folds 方法是在超参数更改后完成的。这是拟合过程。该算法定义了一个超参数集,然后对其进行 k 次拟合。 谢谢!最终确定:给定两个具有两个级别的参数(如上)和 k=5 倍。这将导致 20 次拟合,对吗?

以上是关于交叉验证是如何执行的以及 GridSearchCV() 具体是如何执行的?的主要内容,如果未能解决你的问题,请参考以下文章

您是不是预测交叉验证后的测试数据(gridsearchcv w/KFold)以及如何预测?

如何仅使用 GridSearchCV 进行简单的交叉验证

如何在交叉验证和 GridSearchCV 中实现 SMOTE

使用 Scikit-Learn GridSearchCV 与 PredefinedSplit 进行交叉验证 - 可疑的交叉验证结果

如何使用 GridSearchCV 测试回归交叉验证中的过度拟合?

嵌套交叉验证:cross_validate 如何处理 GridSearchCV 作为其输入估计器?