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

时间:2016-10-18 19:11:39

标签: python scikit-learn xgboost

我正在尝试使用XGBClassifier提供的sklearn包装器来解决多类问题。我的课程是[0,1,2],我使用的目标是multi:softmax。当我试图适应分类器时,我得到了

  

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

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

  

有一个意外的关键字参数'num_class'

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

4 个答案:

答案 0 :(得分: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, ...)

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

中不会

答案 1 :(得分:2)

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

答案 2 :(得分:0)

在 xgboost 1.4.2 版中,对我有用的是将 num_class 作为回归器的参数,其值等于目标/输出的数量。

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

答案 3 :(得分:-1)

您使用的是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函数。这很有效。