有没有更快的方式运行GridsearchCV

bid*_*dby 8 python time svc scikit-learn grid-search

我正在为sklearn中的SVC优化一些参数,这里最大的问题是在我尝试任何其他参数范围之前必须等待30分钟.更糟糕的是,我想在相同的范围内尝试更多的c和gamma值(所以我可以创建一个更平滑的表面图)但我知道它只需要更长更长的时间...当我今天运行它时我将cache_size从200更改为600(不知道它的作用),看它是否有所作为.时间减少了大约一分钟.

这是我可以帮助的吗?或者我只是需要处理很长时间?

clf = svm.SVC(kernel="rbf" , probability = True, cache_size = 600)

gamma_range = [1e-7,1e-6,1e-5,1e-4,1e-3,1e-2,1e-1,1e0,1e1]
c_range = [1e-3,1e-2,1e-1,1e0,1e1,1e2,1e3,1e4,1e5]
param_grid = dict(gamma = gamma_range, C = c_range)

grid = GridSearchCV(clf, param_grid, cv= 10, scoring="accuracy")
%time grid.fit(X_norm, y)
Run Code Online (Sandbox Code Playgroud)

收益:

Wall time: 32min 59s

GridSearchCV(cv=10, error_score='raise',
   estimator=SVC(C=1.0, cache_size=600, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
kernel='rbf', max_iter=-1, probability=True, random_state=None,
shrinking=True, tol=0.001, verbose=False),
   fit_params={}, iid=True, loss_func=None, n_jobs=1,
   param_grid={'C': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0], 'gamma': [1e-07, 1e-06, 1e-05, 0.0001, 0.001, 0.01, 0.1, 1.0, 10.0]},
   pre_dispatch='2*n_jobs', refit=True, score_func=None,
   scoring='accuracy', verbose=0)
Run Code Online (Sandbox Code Playgroud)

Ran*_*ndy 11

一些东西:

  1. 10倍CV是过度杀伤,使您可以为每个参数组拟合10个模型.通过切换到5或3倍CV(即cv=3GridSearchCV通话中),您可以立即获得2-3倍的加速,而在性能估计方面没有任何有意义的差异.
  2. 每轮尝试更少的参数选项.使用9x9组合,您每次运行时都会尝试81种不同的组合.通常情况下,你会在规模或其它的一端找到更好的性能,所以也许有3-4个选项的粗格栅开始,然后再去细当你开始确定这是为您的数据更有趣的区域.3x3选项意味着你现在所做的速度提高了9倍.
  3. 您可以通过njobsGridSearchCV通话中设置为2+ 来获得微不足道的加速,这样您就可以同时运行多个模型.根据您的数据大小,您可能无法将其增加得太高,并且您不会看到改进超过您正在运行的核心数量,但您可能会减少一些时间.

  • 将 njobs 设置为 -1 将自动为每个核心创建 1 个作业。根据您的型号,内存可能会成为问题,但通常不会! (9认同)

Ana*_*eev 7

您也可以在 SVC 估计器内设置概率 = False 以避免在内部应用昂贵的 Platt 校准。(如果具有运行 predict_proba 的能力至关重要,请使用 refit=False 执行 GridSearchCv,并且在根据测试集上的模型质量选择最佳参数集后,只需在整个训练集上以概率 = True 重新训练最佳估计器。)

另一个步骤是使用 RandomizedSearchCv 而不是 GridSearchCV,这将允许您大致同时达到更好的模型质量(由 n_iters 参数控制)。

并且,如前所述,使用 n_jobs=-1