使用GPyOpt的BayesianOptimization优化XGBRegressor报AttributeError如何解决
错误根源
你使用的GPyOpt库的BayesianOptimization类要求传入的domain参数必须是由单个参数字典组成的列表,不支持直接传入{参数名: 参数范围}格式的普通Python字典。你当前的写法会让库在遍历params时拿到的是字符串类型的参数名,尝试调用字典方法get()自然会触发AttributeError。
修正方案
步骤1:调整params的定义格式
你需要把每个超参数拆成包含name(参数名)、type(参数类型:连续型填continuous,整数离散型填discrete)、domain(参数范围,最小值在前,最大值在后)三个键的字典,最终params是这些字典组成的列表:
params = [ {'name': 'max_depth', 'type': 'discrete', 'domain': (2, 5)}, {'name': 'learning_rate', 'type': 'continuous', 'domain': (0.01, 0.3)}, {'name': 'n_estimators', 'type': 'discrete', 'domain': (1000, 2500)}, {'name': 'gamma', 'type': 'continuous', 'domain': (0.01, 1.)}, # 原范围写反了,这里修正为小值在前 {'name': 'min_child_weight', 'type': 'continuous', 'domain': (1, 10)}, {'name': 'max_delta_step', 'type': 'continuous', 'domain': (0, 0.1)}, {'name': 'subsample', 'type': 'continuous', 'domain': (0.5, 0.8)}, {'name': 'colsample_bytree', 'type': 'continuous', 'domain': (0.1, 0.99)}, {'name': 'reg_alpha', 'type': 'continuous', 'domain': (0.1, 0.5)}, {'name': 'reg_lambda', 'type': 'continuous', 'domain': (0.1, 0.9)} ]
步骤2:保持原有调用代码不变
你之前写的BayesianOptimization初始化和run_optimization代码不需要修改,替换params后即可正常运行。
额外注意事项
- 离散型参数(比如树深度、树的数量都是整数)建议明确标注
type为discrete,避免优化过程生成非整数的无效参数 - 所有参数的
domain范围必须遵循最小值在前,最大值在后的规则,你原来的gamma参数写的是(1., 0.01),已经在上面的修正代码里调整了顺序
内容的提问来源于stack exchange,提问作者Ashraf.R
相关产品推荐
相关产品推荐

