![](/img/trans.png)
[英]Scikit-learn: use cross-validation on whole dataset after hyperparameters tuning
[英]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') 的度數。 被所有其他內核忽略。
不幸的是, 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])
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.