Python:GridSearchCV 运行时间太长

5

我想进行一次网格搜索来优化我的模型,但执行时间太长了。我的全部数据集只有大约15,000个观测值和30-40个变量。我已经成功地通过网格搜索运行了一个随机森林,用了一个半小时左右,但现在我转向了SVC,它已经运行了超过9个小时,还没有完成。以下是我的交叉验证代码示例:

from sklearn.model_selection import GridSearchCV
from sklearn import svm
from sklearn.svm import SVC

SVM_Classifier= SVC(random_state=7)



param_grid = {'C': [0.1, 1, 10, 100],
              'gamma': [1,0.1,0.01,0.001],
              'kernel': ['linear', 'poly', 'rbf', 'sigmoid'],
              'degree' : [0, 1, 2, 3, 4, 5, 6]}

grid_obj = GridSearchCV(SVM_Classifier,
                        
                        return_train_score=True,
                        param_grid=param_grid,
                        scoring='roc_auc',
                        cv=3,
                       n_jobs = -1)

grid_fit = grid_obj.fit(X_train, y_train)
SVMC_opt = grid_fit.best_estimator_

print('='*20)
print("best params: " + str(grid_obj.best_estimator_))
print("best params: " + str(grid_obj.best_params_))
print('best score:', grid_obj.best_score_)
print('='*20)

我已经将交叉验证从10减少到3,并且使用了n_jobs=-1,这样我就可以利用所有的核心。除此之外,还有什么其他措施可以加速处理过程吗?


1
网格搜索从我的经验来看总是需要很长时间。但是,有方法可以加快速度。 - Flow
https://dev59.com/XlsV5IYBdhLWcg3w4iT- - Flow
1
谢谢,但我已经参考了这篇文章。因此我已经将n_jobs设置为-1,并将cv从10减少到3。除了设置EC2实例并尝试在云上运行之外,我不确定是否还有其他更多的事情可以做。我正在尝试保持本地化。 - Benjamin Diaz
好的,我明白了。 - Flow
2个回答

3

遗憾的是,SVC的拟合算法在最好情况下是O(n^2),因此它确实非常缓慢。即使文档建议使用LinearSVC处理10k个样本以上的数据,你的数据量也在这个范围内。

或许可以尝试增加核心cache_size。我建议测试不同缓存大小的单个SVC拟合时间,以查看是否可以提高性能。

编辑:顺便说一句,您正在无谓地计算大量具有不同degree参数值的SVC拟合,其中这些值将被忽略(除了poly核)。我建议将poly核和其他核的运行分开,这样可以节省大量时间。


由于算法的复杂度是指数级别的,使用RandomizedSearchCV是否会是更好的方法? - Benjamin Diaz
那也是一个选项,没错。但无论如何,请确保您不会优化与param_grid中的某些内核无关的超参数。在这种情况下,拆分为多个网格搜索。 - user2246849
另外,我会计时单个适配器,以了解所需时间并尝试不同的内核缓存。 - user2246849

2

虽然探索LinearSVC可能是一个不错的选择(你应该像其他答案中提到的那样清理参数组合),但你也可以在支持GPU的云实例(或如果你有NVIDIA GPU的话,本地)上使用RAPIDS cuML中的GPU加速SVC估计器。如果你使用默认的n_jobs=1,这个估计器可以直接放入你的GridSearchCV函数中。(免责声明:我参与了这个项目)。

例如,我在我的本地机器上运行了以下代码[0]:

import sklearn.datasets
import cuml
from sklearn.svm import SVC

X, y = sklearn.datasets.make_classification(n_samples=15000, n_features=30)
%timeit _ = SVC().fit(X, y).predict(X)
%timeit _ = cuml.svm.SVC().fit(X, y).predict(X)
8.68 s ± 64.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
366 ms ± 1.26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

[0] 系统

  • CPU: Intel(R) Xeon(R) Gold 6128 CPU @ 3.40GHz,CPU核心数:12
  • GPU: Quadro RTX 8000

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