23

我遇到的问题是我的超参数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_ )
4

2 回答 2

19

哪个内核效果最好在很大程度上取决于您的数据。样本和维度的数量是多少,你有什么样的数据?为了使范围具有可比性,您需要对数据进行归一化,通常是 StandardScaler,它执行零均值和单位方差,是一个好主意。如果你的数据是非负数,你可以试试 MinMaxScaler。

因为kernel="gamma",我通常会

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

这是基于什么,但在过去的几年里对我很有帮助。我强烈建议反对非对数网格,甚至更反对使用离散参数的随机搜索。随机搜索的主要优点之一是您实际上可以使用连续分布搜索连续参数[参见文档]

于 2014-10-13T18:30:16.450 回答
9

要搜索超参数,最好了解它们每个人在做什么......

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.

我不会碰那个,你的价值范围没有任何意义。

我对伽玛参数不太熟悉。

所以使用这个表示而不是你的(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

于 2014-10-13T12:06:10.440 回答