使用Hyperopt调优XGBoost时遇TypeError:'generator'对象无'__getitem__'属性
解决Hyperopt调优XGBoost时的参数格式错误问题
我明白你现在正在用Hyperopt给XGBoost做参数调优,还参考了Kaggle上的调参案例,运行Python 3代码时碰到了问题。先看看你贴的代码片段里的核心问题:
def objective(params): params = { 'max_depth': int(params['max_depth']), 'gamma': "{:.3f}".format(params['gamma']), 'colsample_bytree': '{:.3f}'.format(params['colsample_bytree']), } clf = xgb.XGBClassifier(**params) # 后续训练/评估逻辑...
问题根源
这里最容易踩的坑是参数类型不匹配——XGBoost的gamma和colsample_bytree参数要求传入数值类型(float),但你把它们格式化成了字符串,这会导致XGBClassifier初始化时直接抛出类型错误。
修正方案
把gamma和colsample_bytree的字符串格式化操作去掉,直接保留原始的数值类型即可:
def objective(params): params = { 'max_depth': int(params['max_depth']), # max_depth确实需要int类型,这里处理没问题 'gamma': params['gamma'], # 直接用Hyperopt输出的float值 'colsample_bytree': params['colsample_bytree'], # 同理保留float类型 } clf = xgb.XGBClassifier(**params) # 后续训练/评估逻辑...
额外注意:参数空间定义要对应
如果你用Hyperopt的hp.uniform/hp.quniform等函数定义搜索空间,确保输出的是数值类型(Hyperopt默认会输出float),比如:
from hyperopt import hp # 定义参数搜索空间 space = { 'max_depth': hp.quniform('max_depth', 3, 10, 1), # 输出float,后续转int没问题 'gamma': hp.uniform('gamma', 0, 5), # 输出0-5之间的float 'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1.0), # 输出0.5-1.0之间的float }
关于原Kaggle代码的小说明
有些老版本的XGBoost或者用xgb.train配合DMatrix的场景下,可能有人会用字符串传参,但对于XGBClassifier这种scikit-learn兼容的接口类,必须传入数值类型的参数,完全没必要转成字符串格式。
内容的提问来源于stack exchange,提问作者Lesnar
相关产品推荐
相关产品推荐

