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

use*_*838 15 machine-learning svm scikit-learn hyperparameters

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

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

换句话说,如何判断C100以上的值是否有意义和/或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_ )
Run Code Online (Sandbox Code Playgroud)

And*_*ler 14

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

因为kernel="gamma",我通常这样做

{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)}
Run Code Online (Sandbox Code Playgroud)

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

  • "如果你的数据是非负数,你可以试试MinMaxScaler." - >这个细节对我的数据产生了很大的影响.不仅适用于SVM,还适用于Lasso和RFE功能选择.非常有帮助,谢谢! (3认同)
  • 安德烈亚斯,你能不能提出一个重写离散集'gamma'的建议:np.logspace(-3,2,6)为连续的?在sklearn示例中经常使用的scipy.expon不具有足够的幅度,并且scipy没有原生日志均匀生成器.那么你最喜欢写'gamma'的方式是什么:np.logspace(-3,2,6)就随机数发生器而言,让我们跳过重新发明轮子?:-) (3认同)
  • 那不是我的意思.我建议不要将列表用于实际连续的参数,请参阅论文:https://encrypted.google.com/url?sa = t&rct = j&q =&esrc = s&source = web&cd = 1&cad = rja&uact = 8&ed = 0CB4QFjAA&url = http% 3A%2F%2Fwww.jmlr.org%2Fpapers%2Fvolume13%2Fbergstra12a%2Fbergstra12a.pdf&ei = -bpkVf839bWxBJ_Lg4gJ&usg = AFQjCNFKAQbDd5l0Q7WH36ejee4ahKlZQg&sig2 = ftE5PnFHyIvTKvIGGTS4xw&bvm = bv.93990622,d.cWc混合连续和离散是好的. (2认同)

Thi*_*hiS 5

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

C : float, optional (default=1.0)
    Penalty parameter C of the error term.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

tol : float, optional (default=1e-3)
   Tolerance for stopping criterion.
Run Code Online (Sandbox Code Playgroud)

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

我对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']},
]
Run Code Online (Sandbox Code Playgroud)

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

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

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