参数 num_class 的 xgboost sklearn 包装器值 0 应大于等于 1

xgboost sklearn wrapper value 0for Parameter num_class should be greater equal to 1

我正在尝试使用 sklearn 提供的 XGBClassifier 包装器解决多类问题。我的类是[0,1,2],我用的objective是multi:softmax。当我尝试拟合分类器时,我得到

xgboost.core.XGBoostError: value 0for Parameter num_class should be greater equal to 1

如果我尝试设置 num_class 参数,我会收到错误消息

got an unexpected keyword argument 'num_class'

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

您需要手动添加参数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 方法中不会

您在使用 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 函数。这行得通。

就我而言,在常规 fit 调用期间抛出相同的错误。问题的根源是 objective 被手动设置为 multi:softmax,但只有 2 个 类。将其更改为 binary:logistic 解决了问题。

在 xgboost 版本 1.4.2 中,对我有用的是将 num_class 作为回归量的参数,其值等于 targets/outputs.

的数量
params = { "objective": "multi:softmax", 'num_class': 3}
model = xgb.XGBRegressor(**params)