【问题标题】:xgboost sklearn wrapper value 0for Parameter num_class should be greater equal to 1xgboost sklearn 包装器值 0 用于参数 num_class 应大于等于 1
【发布时间】:2017-02-28 04:45:04
【问题描述】:
我正在尝试使用sklearn 提供的XGBClassifier 包装器来解决多类问题。我的课程是 [0, 1, 2],我使用的目标是 multi:softmax。当我试图适应分类器时,我得到了
xgboost.core.XGBoostError: value 0for Parameter num_class 应该大于等于 1
如果我尝试设置 num_class 参数,则会出现错误
得到了一个意外的关键字参数“num_class”
Sklearn 会自动设置此参数,因此我不应该传递该参数。但为什么我会收到第一个错误?
【问题讨论】:
标签:
python
scikit-learn
xgboost
【解决方案1】:
在 xgboost 版本 1.4.2 中,对我有用的是包含 num_class 作为回归器的参数,其值等于目标/输出的数量。
params = { "objective": "multi:softmax", 'num_class': 3}
model = xgb.XGBRegressor(**params)
【解决方案2】:
在我的情况下,在常规的fit 调用期间引发了相同的错误。问题的根源是目标被手动设置为multi:softmax,但只有2个类。将其更改为binary:logistic 即可解决问题。
【解决方案3】:
你在使用xgboost.cv 函数吗?我遇到了同样的问题,但找到了解决方案。这是我的代码:
xgb_param = model.get_xgb_params()
extra = {'num_class': 3}
xgb_param.update(extra)
cvresult = xgb.cv(xgb_param, xgtrain, ...)
xgb_param 是 XGBoost 模型参数的字典。然后我将一个新的字典extra 附加到它以指定num_class,将新的字典传递给cv 函数。这行得通。
【解决方案4】:
您需要手动添加参数num_class到xgb_param
# Model is an XGBClassifier
xgb_param = model.get_xgb_params()
xgb_param['num_class'] = 3
cvresult = xgb.cv(xgb_param, ...)
如果您使用其fit 方法,XGBClassifier 会自动设置此值,但不会在cv 方法中设置此值