2014-10-13 5 views
10

Я сталкиваюсь с проблемой, что гиперпараметры моего svm.SVC() слишком широкие, так что GridSearchCV() никогда не будет завершен! Одна из идей заключается в том, чтобы вместо этого использовать RandomizedSearchCV(). Но опять же, мой набор данных относительно большой, чтобы 500 итераций занимали около 1 часа!Что такое хороший диапазон значений для гиперпараметров svm.SVC() для изучения через GridSearchCV()?

Вопрос в том, что такое хорошая настройка (с точки зрения диапазона значений для каждого гиперпараметра) в 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

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

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, так как он используется только с «поли» ядра

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

9

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

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

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

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

+0

Вы предлагаете здесь неразумно смешивать непрерывные и дискретные параметры в случайном поиске? Почему это и как обычно вы ищете параметры, когда они смешиваются для одного алгоритма? –

+1

Это было не то, что я имел в виду. Я рекомендую использовать списки для фактически непрерывных параметров, см. Документ: https://encrypted.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB4QFjAA&url=http% 3A% 2F% 2Fwww.jmlr.org% 2Fpapers% 2Fvolume13% 2Fbergstra12a% 2Fbergstra12a.pdf & е = -bpkVf839bWxBJ_Lg4gJ & USG = AFQjCNFKAQbDd5l0Q7WH36ejee4ahKlZQg & Sig2 = ftE5PnFHyIvTKvIGGTS4xw & BVM = bv.93990622, d.cWc Смешивание непрерывных и дискретных нормально. –

+0

Вы также можете ознакомиться со средней частью моей беседы: https://www.youtube.com/watch?v=0wUF_Ov8b0A –