我正在使用BayesSearchCV来通过贝叶斯优化寻找最佳超参数。使用BayesSearchCV的语法如下所示:
clas_model = LogisticRegression(max_iter=5000)search_space ={ "penalty": Categorical(['l1', 'l2', 'elasticnet', 'none']), "solver": Categorical(['lbfgs', 'newton-cg', 'liblinear', 'sag', 'saga']), "fit_intercept": Categorical([True, False])}bayes_search = BayesSearchCV(clas_model, search_space, n_iter=12, scoring="accuracy", n_jobs=-1, cv=5)bayes_search.fit(X, y.values.ravel(), callback=on_step)predictions_al = cross_val_predict(bayes_search, X, y.values.ravel(), cv=folds)
在这种情况下,’newton-cg’求解器不接受’l1’惩罚,因此超参数之间存在依赖关系。是否有办法使用此库来配置这一点?
回答:
通过查看其他库如GridCV或RandomCV,我意识到我们可以将不同的搜索空间提供到数组中,尽管这在BayssianCV中未被记录,但在其他库中有一些没有详细说明的快速示例。
最后,由于求解器、惩罚和其他参数之间的高度依赖性(在此处描述:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html),语法应如下所示:
clas_model = LogisticRegression(max_iter=5000)search_space = [ { "solver": Categorical(['liblinear']), "penalty": Categorical(['l1', 'l2']), "fit_intercept": Categorical([True, False]), #"warm_start": Categorical([True, False]) }, { "solver": Categorical(['lbfgs', 'newton-cg', 'sag']), "penalty": Categorical(['l2', 'none']), "fit_intercept": Categorical([True, False]), #"warm_start": Categorical([True, False]) }, { "solver": Categorical(['saga']), "penalty": Categorical(['l1', 'l2', 'none']), "fit_intercept": Categorical([True, False]), #"warm_start": Categorical([True, False]) }, { "solver": Categorical(['saga']), "penalty": Categorical(['elasticnet']), "fit_intercept": Categorical([True, False]), "l1_ratio": Real(0, 1, prior='uniform'), #"warm_start": Categorical([True, False]) }, ]
‘newton-cg’、‘sag’和‘lbfgs’求解器仅支持L2正则化和原始公式,或者不使用正则化。‘liblinear’求解器支持L1和L2正则化,仅对L2惩罚使用对偶公式。Elastic-Net正则化仅由‘saga’求解器支持。