使用BayesSearchCV时如何配置存在依赖关系的超参数
BayesSearchCV超参数依赖处理方案
BayesSearchCV原生支持处理超参数之间的依赖关系,你可以通过定义条件搜索空间的方式,自动排除solver=newton-cg搭配penalty=l1这类无效的参数组合,避免无效的模型训练开销。
方法1:拆分合法子空间(推荐)
你可以将原搜索空间拆分为多个仅包含合法参数组合的子空间,以列表形式传入BayesSearchCV即可,适配你的逻辑回归场景的代码如下:
from skopt import BayesSearchCV from skopt.space import Categorical from sklearn.linear_model import LogisticRegression clas_model = LogisticRegression(max_iter=5000) # 按solver支持的penalty拆分合法搜索子空间 search_space = [ # 适用于newton-cg、lbfgs、sag:仅支持l2、none惩罚项 { "penalty": Categorical(['l2', 'none']), "solver": Categorical(['lbfgs', 'newton-cg', 'sag']), "fit_intercept": Categorical([True, False]) }, # 适用于liblinear:仅支持l1、l2惩罚项 { "penalty": Categorical(['l1', 'l2']), "solver": Categorical(['liblinear']), "fit_intercept": Categorical([True, False]) }, # 适用于saga:支持所有惩罚项 { "penalty": Categorical(['l1', 'l2', 'elasticnet', 'none']), "solver": Categorical(['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)
该方式无需修改原有训练逻辑,仅需调整搜索空间定义即可正常运行,是处理这类简单参数依赖的最优方案,运行时BayesSearchCV会自动在所有合法子空间内采样参数,不会生成非法参数组合。
方法2:自定义目标函数校验(适合复杂依赖场景)
如果你的超参数依赖逻辑更复杂,还可以通过自定义目标函数的方式主动校验参数合法性,遇到非法组合直接返回最低得分,贝叶斯优化算法会自动避开这类参数区域:
from skopt import gp_minimize from skopt.utils import use_named_args from sklearn.model_selection import cross_val_score # 定义全量搜索空间 space = [ Categorical(['l1', 'l2', 'elasticnet', 'none'], name='penalty'), Categorical(['lbfgs', 'newton-cg', 'liblinear', 'sag', 'saga'], name='solver'), Categorical([True, False], name='fit_intercept') ] @use_named_args(space) def objective(**params): # 自定义规则校验参数合法性 if params['solver'] == 'newton-cg' and params['penalty'] == 'l1': # 非法组合返回最低得分,gp_minimize默认求最小值,返回大值代表效果差 return 1.0 # 合法组合正常训练评估 model = LogisticRegression(max_iter=5000, **params) score = cross_val_score(model, X, y.values.ravel(), cv=5).mean() return -score
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

