我在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)
返回:
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)
答案 0 :(得分:11)
一些事情:
cv=3
通话中的GridSearchCV
)来获得2-3倍的加速,而在性能估算方面没有任何有意义的差异。njobs
来电中将GridSearchCV
设置为2+,从而获得一个微不足道的加速,这样您就可以同时运行多个模型。根据您的数据大小,您可能无法将其增加得太高,并且您不会看到改进超过您正在运行的核心数量,但您可能会略微削减一些这样的时间。答案 1 :(得分:3)
此外,您可以在SVC估算器内设置probability = False,以避免在内部应用昂贵的Platt校准。 (如果能够运行predict_proba是至关重要的,那么使用refit = False执行GridSearchCv,并且在测试集上根据模型的质量选择最佳参数集后,只需在整个trainig集上重新训练最大估计值,概率= True。)
另一个步骤是使用RandomizedSearchCv而不是GridSearchCV,这将允许您在大致相同的时间(由n_iters参数控制)达到更好的模型质量。
并且,如前所述,使用n_jobs = -1
答案 2 :(得分:2)
添加到其他答案(例如不使用 10 倍 CV 和每轮使用更少的参数选项),还有其他方法可以加速模型。
并行化您的代码
Randy 提到可以使用 n_jobs 来并行化您的染色(这取决于您计算机上的内核数量)。与下面代码的唯一区别是它使用 n_jobs = -1
自动为每个核心创建 1 个作业。因此,如果您有 4 个内核,它将尝试利用所有 4 个内核。下面的代码在 8 核计算机上运行。在我的电脑上使用 n_jobs = -1
需要 18.3 秒,而没有使用时需要 2 分 17 秒。
import numpy as np
from sklearn import svm
from sklearn import datasets
from sklearn.model_selection import GridSearchCV
rng = np.random.RandomState(0)
X, y = datasets.make_classification(n_samples=1000, random_state=rng)
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", n_jobs = -1)
%time grid.fit(X, y)
请注意,如果您有权访问集群,则可以使用 Dask or Ray 分发您的训练。
不同的超参数优化技术
您的代码使用 GridSearchCV,它是对估算器的指定参数值的详尽搜索。 Scikit-Learn 还具有 RandomizedSearchCV,它从具有指定分布的参数空间中采样给定数量的候选者。对下面的代码示例使用随机搜索需要 3.35 秒。
import numpy as np
from sklearn import svm
from sklearn import datasets
from sklearn.model_selection import RandomizedSearchCV
rng = np.random.RandomState(0)
X, y = datasets.make_classification(n_samples=1000, random_state=rng)
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 = RandomizedSearchCV(clf, param_grid, cv= 10, scoring="accuracy", n_jobs = -1)
%time grid.fit(X, y)
图片来自documentation。
最近(scikit-learn 2021 年 1 月 24 日 0.24.1),scikit-learn 添加了实验性超参数搜索估计器,将网格搜索减半 (HalvingGridSearchCV) 和将随机搜索减半 (HalvingRandomSearch)。这些技术可用于使用连续减半来搜索参数空间。上图显示所有超参数候选者在第一次迭代时使用少量资源进行评估,并且在每次连续迭代中选择更有希望的候选者并给予更多资源。您可以通过升级您的 scikit-learn ({{1 }})