XGBoost Sklearn包装器:参数num_class的值应大于等于1。

20

我正在尝试使用sklearn提供的XGBClassifier包装器来解决一个多类问题。我的类别是[0, 1, 2],我使用的目标函数是multi:softmax。当我尝试拟合这个分类器时,我会遇到以下错误:

  

xgboost.core.XGBoostError:num_class 参数的值应该大于等于 1。

如果我尝试设置 num_class 参数,则会收到以下错误:

  

出现意外关键字参数“num_class”

Sklearn自动设置此参数,所以我不应该传递该参数。但是为什么我会收到第一个错误?

4个回答

17

在我的案例中,我在进行常规的fit调用时遇到了同样的错误。问题的根源是目标手动设置为multi:softmax,但只有两个类别。将其更改为binary:logistic解决了这个问题。


17

您需要手动添加参数num_class到xgb_param中。

    # Model is an XGBClassifier
    xgb_param = model.get_xgb_params()
    xgb_param['num_class'] = 3
    cvresult = xgb.cv(xgb_param, ...)

XGBClassifier会在使用fit方法时自动设置此值,但在cv方法中不会。


0
在xgboost版本1.4.2中,对我有效的方法是将num_class作为参数包含在回归器中,并将其值设置为目标/输出数量。
params = { "objective": "multi:softmax", 'num_class': 3}
model = xgb.XGBRegressor(**params)

0
你是否正在使用 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 函数。这样做是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接