如何进行交叉验证以及如何使用GridSearchCV()函数?

3
在scikit中,GridSearchCV()(和/或RandomizedSearchCV())是如何实现的?我想知道以下几点:使用这些技术时,如何考虑以下方面:
  • 验证集
  • 模型选择
  • 超参数调整
  • 预测
这是一张总结我的困惑的图片:

CV

发生什么事情以及多久发生一次?也许为了简单起见,我们假设一个单独的神经网络作为我们的模型。 我到目前为止的理解是:
在第一轮迭代中,模型在训练时被适应于分成不同折叠的训练集。在这里,我已经遇到了困难:模型是在单个折叠上进行训练,然后在验证折叠上进行测试吗? 接下来会发生什么?模型会保留其第一个训练折叠所达到的权重,还是会重新初始化下一个训练折叠? 更明确地说,在第一轮迭代中,模型是否适应四次并独立地在所有折叠之间测试四次验证集?
当下一轮迭代开始时,模型不会保留来自第一轮迭代的任何信息,对吗? 因此,所有迭代和所有折叠彼此独立吗? 这里如何调整超参数?
在上面的示例中,总共有25个折叠。模型使用恒定的超参数进行适应和测试20次吗? 假设我们有两个要调整的超参数:学习率和丢失率,每个超参数都有两个级别:
  • learning_rate = [0.3, 0.6]
  • dropout_rate = [0.4, 0.8]。

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

有没有可能看到GridSearchCV()将考虑多少个折叠(folds)?

我已经看到了Does GridSearchCV perform cross-validation?Model help using Scikit-learn when using GridSearchscikit-learn GridSearchCV with multiple repetitions,但我看不到对我的问题的明确和精确的答案。


是的,你的神经网络将被拟合80次,如果你在另一个模型上进行测试,它将会是x2。 - AdForte
1个回答

1
所以k折交叉验证方法:将训练集分成n个部分(k折),例如5。您将第一部分作为验证集,其他4部分作为训练集。进行训练并得到训练/CV性能。您重复这个过程5次(折数),每次折叠变成验证集,其他部分成为训练集。最后,对所有表现取平均值,以获得模型的CV性能。这是k-fold方法。
现在,GridSearchCV是一个使用k-folds方法的超参数调整器。原则是给GridSearch提供一个字典,其中包含您想要测试的所有超参数,然后它会测试所有超参数(字典)并选择具有最佳模型CV性能的最佳超参数组合。这可能需要很长时间。
您可以在gridsearch中传递一个模型(估算器)、一组参数和是否需要k-folds的数量。
例如:
GridSearchCV(SVC(), parameters, cv = 5)

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


谢谢,但我仍然不知道具体是如何执行的。在第一次迭代中,模型适合一次还是四次?除了折叠之外,第二次迭代会发生什么变化? - Ben
1
在第一次迭代中,它将被拟合一次,然后进行有效的折叠更改和模型拟合一次,然后进行有效的折叠更改,以此类推。 - AdForte
然后我会让所有的图像都不同...谢谢!而超参数会在每次迭代中改变吗? - Ben
1
每次超参数更改时,模型都会进行k次测试。在超参数更改后执行k折交叉验证方法。这是拟合过程。算法定义了一个超参数集,然后将其拟合k次。 - AdForte
谢谢!最终确定:给定两个具有两个级别的参数(如上所述),并且k=5倍交叉验证。这将导致20次拟合,对吗? - Ben
好的,谢谢!就像所描述的那样,有很多可能性来看待/理解/实现CV,我需要一些反馈来缩小范围...是的,实际上我正在使用仅CPU执行gridsearchcv(),它需要数小时甚至数天... - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接