簡體   English   中英

在 scikit-learn 中使用 RandomizedSearchCV 對超參數進行條件調整

[英]Conditional tuning of hyperparameters with RandomizedSearchCV in scikit-learn

我想在 sklearn 中使用 RandomizedSearchCV 在我的數據集上搜索支持向量分類器的最佳超參數值。 我正在優化的超參數是“kernel”、“C”和“gamma”。 但是,在“poly”kernel 的情況下,我還想優化第四個超參數“degree”(多項式 kernel 函數的索引)。

我意識到,由於當 kernel 不是“poly”時,度超參數被忽略,所以我可以在提供給 RandomizedSearchCV 的參數字典中包含度數(正如我在下面的代碼中所做的那樣)。 但是,理想情況下,我想在非多邊形內核加上每個多邊形 kernel 的度數上進行均勻搜索,即我想在例如 [(kernel="linear")、(kernel="rbf")、(kernel= "poly", degree=2), (kernel="poly", degree=3)]。 因此,我想知道是否可以有條件地引入一個超參數進行調整,即如果 kernel="poly" degree=np.linspace(2, 5, 4), else degree=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
)

我不確定您是否可以為 gridsearch 或在 gridsearch 內創建有條件的 arguments(這感覺像是一個有用的功能)。 但是,圍繞此問題解決 go 的一種方法是簡單地設置randomizesearchcv添加的所有超參數,使用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)

然而

sklearn 的 SVC 文檔中,您通過degree應該沒有任何問題:

degree: int, optional (default=3) 多項式 kernel function ('poly') 的度數。 被所有其他內核忽略。

不幸的是, GridsearchCVRandomizedSearchCV不支持超參數的條件調整。

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])
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM