Условная настройка гиперпараметров с помощью RandomizedSearchCV в scikit-learn - PullRequest
1 голос
/ 30 сентября 2019

Я хочу использовать RandomizedSearchCV в sklearn для поиска оптимальных значений гиперпараметра для классификатора опорных векторов в моем наборе данных. Я оптимизирую гиперпараметры "ядро", "С" и "гамма". Однако в случае «поли» ядра я также хотел бы оптимизировать четвертый гиперпараметр «степень» (индекс функции ядра полинома).

Я понимаю, что поскольку гиперпараметр степени игнорируется, когда ядро ​​не "poly", я мог бы просто включить степень в словарь параметров, который я предоставляю для RandomizedSearchCV (как я сделал в приведенном ниже коде). Тем не менее, в идеале я хотел бы искать равномерно по всем ядрам, не являющимся поли, плюс каждую степень по многоядерному ядру, т.е. я хочу делать выборку равномерно, например, по [(kernel = "linear"), (kernel = "rbf"), (kernel ="poly", степень = 2), (ядро = "poly", степень = 3)]. Поэтому мне было интересно, можно ли условно ввести гиперпараметр для настройки, т. Е. Если kernel = "poly" степень = np.linspace (2, 5, 4), иначе степень = 0.

У меня естьНе удалось найти пример этого в документации RandomizedSearchCV, и поэтому мне было интересно, если кто-нибудь здесь сталкивался с той же проблемой и сможет помочь. Спасибо!

from sklearn.svm import SVC
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import StratifiedKFold

clf = SVC()
params = {'kernel': ['linear', 'poly', 'rbf', 'sigmoid'],
          'degree': np.linspace(2, 5, 4),
          'C': np.logspace(-3, 5, 17),
          'gamma': np.logspace(-3, 5, 17)}

random_search = RandomizedSearchCV(
    estimator=clf, param_distributions=params, n_iter=200, n_jobs=-1,
    cv=StratifiedKFold(n_splits=5), iid=False
)

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

К сожалению, GridsearchCV и RandomizedSearchCV не поддерживают условную настройку гиперпараметров.

Hyperopt поддерживает условную настройку гиперпараметров, проверьте это wiki для получения более подробной информации.

Пример:

space4svm = {
    'C': hp.uniform('C', 0, 20),
    'kernel': hp.choice('kernel', [
            {'ktype': 'linear'},
            {'ktype': 'poly', 'degree': hp.lognormal('degree', 0, 1)},
            ]),
    'gamma': hp.uniform('gamma', 0, 20),
    'scale': hp.choice('scale', [0, 1]),
    'normalize': hp.choice('normalize', [0, 1])
}
0 голосов
/ 30 сентября 2019

Я не уверен, что вы можете сделать условные аргументы для или внутри gridsearch (это будет похоже на полезную функцию). Однако одно из решений этой проблемы - просто установить все гиперпараметры для randomizesearchcv add и использовать параметр errors_raise, который позволит вам пройти через итерации, которые обычно не выполняются, и останавливать ваш процесс. Например:

from sklearn.svm import SVC
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import StratifiedKFold

clf = SVC()
params = {'kernel': ['linear', 'poly', 'rbf', 'sigmoid'],
          'degree': np.linspace(2, 5, 4),
          'C': np.logspace(-3, 5, 17),
          'gamma': np.logspace(-3, 5, 17)}

random_search = RandomizedSearchCV(
    estimator=clf, param_distributions=params, n_iter=200, n_jobs=-1,
    cv=StratifiedKFold(n_splits=5), iid=False,errors_raise=0)

Однако

Из документации SVC sklearn у вас не должно возникнуть проблем с передачей degree:

степень: int, необязательная (по умолчанию = 3) Степень функции ядра полинома ('poly'). Игнорируется всеми другими ядрами.

...