通过GridSearchCV()探索svm.SVC()超参数的有效值范围是多少?

时间:2014-10-13 10:06:11

标签: machine-learning scikit-learn svm hyperparameters

我遇到的问题是svm.SVC()的超参数太宽,以致GridSearchCV()永远不会完成!一个想法是使用RandomizedSearchCV()代替。但同样,我的数据集相对较大,因此500次迭代需要大约1小时!

我的问题是,为了不再浪费资源,GridSearchCV(或RandomizedSearchCV)中有什么好的设置(就每个超参数的值范围而言)?

换句话说,如何判断是否例如 C 超过100的值是有意义的和/或1的步长既不大也不小?很感谢任何形式的帮助。这是我目前使用的设置:

parameters = {
    'C':            np.arange( 1, 100+1, 1 ).tolist(),
    'kernel':       ['linear', 'rbf'],                   # precomputed,'poly', 'sigmoid'
    'degree':       np.arange( 0, 100+0, 1 ).tolist(),
    'gamma':        np.arange( 0.0, 10.0+0.0, 0.1 ).tolist(),
    'coef0':        np.arange( 0.0, 10.0+0.0, 0.1 ).tolist(),
    'shrinking':    [True],
    'probability':  [False],
    'tol':          np.arange( 0.001, 0.01+0.001, 0.001 ).tolist(),
    'cache_size':   [2000],
    'class_weight': [None],
    'verbose':      [False],
    'max_iter':     [-1],
    'random_state': [None],
    }

model = grid_search.RandomizedSearchCV( n_iter              = 500,
                                        estimator           = svm.SVC(),
                                        param_distributions = parameters,
                                        n_jobs              = 4,
                                        iid                 = True,
                                        refit               = True,
                                        cv                  = 5,
                                        verbose             = 1,
                                        pre_dispatch        = '2*n_jobs'
                                        )         # scoring = 'accuracy'
model.fit( train_X, train_Y )
print( model.best_estimator_ )
print( model.best_score_ )
print( model.best_params_ )

2 个答案:

答案 0 :(得分:12)

哪种内核效果最好取决于您的数据。样品和尺寸的数量以及您拥有的数据类型是多少? 对于可比较的范围,您需要标准化您的数据,通常StandardScaler,它的零均值和单位方差,是一个好主意。 如果您的数据是非负数,则可以尝试使用MinMaxScaler。

对于kernel="gamma",我通常会

{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)}

这是基于什么,但在过去几年里我很好。 我强烈建议不使用非对数网格,甚至更多的建议使用离散参数进行随机搜索。随机搜索的一个主要优点是您可以使用连续分布[see the docs]实际搜索连续参数。

答案 1 :(得分:5)

要搜索超参数,最好先了解每个参数的作用......

C : float, optional (default=1.0)
    Penalty parameter C of the error term.

你应该尝试按数量级(0,0.1,1,10,100)改变它,然后可能会减少你的搜索幅度,但我认为它不会改善你的模型。

degree : int, optional (default=3)
   Degree of the polynomial kernel function (‘poly’). Ignored by all other kernels.

在这里你应该改变你进行网格搜索的方式,因为正如文档所示,度仅用于多项式内核,因此在使用'rbf'内核时你会浪费时间寻找每个度数。 另一点是,使用两个度数会使你的数据过度拟合。这里使用类似(1,2,3,4,5)的东西

coef0的相同注释,因为它仅用于'poly'内核

tol : float, optional (default=1e-3)
   Tolerance for stopping criterion.

我不会接触到这一点,你的价值范围确实没有任何意义。

我对gamma参数并不熟悉。

因此请使用此表示而不是您的(http://scikit-learn.org/stable/modules/grid_search.html#exhaustive-grid-search):

param_grid = [
 {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
 {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]

并尝试了解每个参数的含义:

http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html