machine-learning - 通过 GridSearchCV() 探索 svm.SVC() 超参数的最佳值范围是多少?

标签 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_ )

最佳答案

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

对于 kernel="gamma",我通常这样做

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

这毫无根据,但在过去几年里对我很有帮助。 我强烈建议不要使用非对数网格,甚至更不要使用离散参数的随机搜索。随机搜索的主要优点之一是您实际上可以使用连续分布搜索连续参数 [see the docs] .

关于machine-learning - 通过 GridSearchCV() 探索 svm.SVC() 超参数的最佳值范围是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337403/

相关文章:

python - 为 onehotencoded 变量创建管道不起作用

python - SVC 分类器支持 python Sklearn 中的向量类

python-2.7 - 在 Python 上使用 Mxnet 库运行深度学习图像分类示例时出错

algorithm - 如何在不使用 Google 的情况下估算 "Did you mean?"?

python - Scikit-learn 随机森林占用内存过多

python-3.x - 在 SVC 中出现 ValueError

python - 如何将包含字符串值的 pandas 数据框的列转换为 int/float?

python - 如何使用 scikit-learn 训练/升级非常大的数据集?

python - 是否可以使用 scikit-learn 而不是二元分类来预测变量(如果可以)而不是如何预测

python - 结合 GridSearchCV 和 StackingClassifier