Почему RandomizedSearchCV возвращает значение степени или гаммы для линейной оценки? - PullRequest
1 голос
/ 08 июля 2020

Со Sklearn я использую RandomizedSearchCV, в конкретном c случае лучшая оценка:

SVR(C=1594.0828461797396, degree=0.8284528822863231, gamma=1.1891370222133257,kernel='linear')

Но согласно документации sklearn , degree и gamma только для ядер rbf и poly. Почему я получаю оценку linar со значениями gamma и degree?

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import expon, reciprocal

param_distribs = {
        'kernel': ['linear', 'rbf','poly','sigmoid'],
        'C': reciprocal(20, 200000),
        'gamma': expon(scale=1.0),
        'degree': expon(scale=1.0),
    }

svm_reg = SVR()
rnd_search = RandomizedSearchCV(svm_reg, param_distributions=param_distribs,
                                n_iter=50, cv=5, scoring='neg_mean_squared_error',
                                verbose=2, random_state=42)
rnd_search.fit(X, y)

1 Ответ

1 голос
/ 08 июля 2020

RandomizedSearchCV всегда будет случайным образом устанавливать все указанные параметры для оценщика, независимо от таких ограничений, поскольку не реализован внутренний метод проверки того, какие комбинации имеют смысл для конкретного оценщика или нет. Поскольку gamma и degree просто игнорируются в сочетании с ядром linear, это также не вызовет ошибку, и алгоритм просто будет работать со всеми параметрами, установленными каждый раз.

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

Если указан список dicts, сначала выполняется единообразная выборка dict, а затем выборка параметра с использованием этого dict, как указано выше.

Так, например, предположим, что вы определили следующее как сетку параметров:

param_distribs = [
    {
        'kernel': ['rbf','poly'],
        'C': reciprocal(20, 200000),
        'gamma': expon(scale=1.0),
        'degree': expon(scale=1.0)
    },
    {
        'kernel': ['linear','sigmoid'],
        'C': reciprocal(20, 200000)
    }
]

Это позволит избежать RandomizedSearchCV для установки gamma и degree, когда он выбирает словарь с ядром linear в итерации. Напротив, если он выберет другой словарь в конкретной итерации, он также установит gamma и degree.

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