如何估计 GridSearchCV 计算时间?

数据挖掘 交叉验证 网格搜索
2021-09-25 10:40:50

如果我知道使用设定值进行给定验证的时间,我可以估计 GridSearchCV 将花费我想要交叉验证的 n 个值的时间吗?

2个回答

您可以一次将您的模型/管道(使用默认参数)拟合到您的数据中,然后查看训练需要多长时间。然后你可以乘以你想通过网格搜索训练模型的次数。

例如,假设您想使用网格搜索来选择管道的超参数abc

params = {'a': [1, 2, 3, 4, 5],
          'b': [1, 2, 3, 4],
          'c': [1, 2, 3]}

cv = GridSearchCV(pipeline, params)

默认情况下,这应该运行搜索网格543=60不同的参数组合。默认的交叉验证是 3 倍 cv,所以上面的代码应该训练你的模型603=180次。默认情况下,GridSearch 在您的处理器上并行运行,因此根据您的硬件,您应该将迭代次数除以可用处理单元的数量。假设我有 4 个处理器可用,每个处理器都应该适合模型180/4=45次。现在,如果我的模型平均需要10sec训练,我估计4510/60=7.5min训练时间。在实践中应该更接近8min由于开销。

最后,由于某些参数严重影响该算法的训练时间,我建议max_iter尽可能使用该参数,以便您的估计不会偏离太远。

请注意:截至 2021 年 7 月,默认折叠数为 5。

来自 sklearn 文档:在 0.22 版中更改:如果 None 从 3 倍更改为 5 倍,则 cv 默认值。

让搜索完成,然后您可以使用cv_results_属性来计算经过的时间,如下所示。

mean_fit_time= search_cv.cv_results_['mean_fit_time']
mean_score_time= search_cv.cv_results_['mean_score_time']
n_splits  = search_cv.n_splits_ #number of splits of training data
n_iter = pd.DataFrame(search_cv.cv_results_).shape[0] #Iterations per split

print(np.mean(mean_fit_time + mean_score_time) * n_splits * n_iter)