Каков хороший диапазон значений для гиперпараметров svm.SVC() для изучения через GridSearchCV()?

Я сталкиваюсь с проблемой, что гиперпараметры моего 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_ )

Ответ 1

Какое ядро ​​работает лучше всего, зависит от ваших данных. Каково количество образцов и размеров и какие данные у вас есть? Для того, чтобы диапазоны были сопоставимыми, вам необходимо нормализовать свои данные, часто StandardScaler, который делает нулевое среднее значение и дисперсию единиц, является хорошей идеей. Если ваши данные неотрицательны, вы можете попробовать MinMaxScaler.

Для kernel="gamma" я обычно делаю

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

основанный ни на чем, но хорошо служивший мне последние пару лет. Я бы настоятельно советовал не логарифмическим сеткам, и даже больше, хотя против рандомизированного поиска с использованием дискретных параметров. Одним из основных преимуществ рандомизированного поиска является то, что вы можете фактически искать непрерывные параметры с использованием непрерывных распределений [см. Документы].

Ответ 2

Для поиска гиперпараметров всегда лучше понимать, что делает каждый из них...

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' kernel

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