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

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

Я понимаю, что, поскольку гиперпараметр степени игнорируется, когда ядро ​​не является "поли", я могу просто включить степень в словарь параметров, который я предоставляю для RandomizedSearchCV (как я сделал в приведенном ниже коде). Тем не менее, в идеале я хотел бы искать однородно по неполным ядрам плюс каждую степень поли ядра, т.е. я хочу, чтобы сэмпл был однородным по всем, например. [(ядро = "линейный"), (ядро = "rbf"), (ядро = "поли", степень = 2), (ядро = "поли", степень = 3)]. Поэтому мне было интересно, можно ли условно ввести гиперпараметр для настройки, например, если ядро ​​= "поли" степень = 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
)

person kathryn    schedule 30.09.2019    source источник


Ответы (2)


К сожалению, 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])
}
person Amine Benatmane    schedule 30.09.2019
comment
Спасибо, это именно то, что я ищу. - person kathryn; 30.09.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) Степень полиномиальной функции ядра («поли»). Игнорируется всеми остальными ядрами.

person Celius Stingher    schedule 30.09.2019