在多类分类 xgboost python 中正确设置 eval_set,错误是“检查失败:preds.size() == info.labels_.size()”

数据挖掘 分类 scikit-学习 xgboost
2022-03-15 22:29:31

我有 3 个类 [-1,0,1] 的多类分类问题。我想在 xgboost 中使用 eval_set。但它失败并出现错误:

rank_metric.cc:88: Check failed: preds.size() == info.labels_.size() (270 
vs. 90) label size predict size not match'

当我跑步时

modelfit=model.fit(Xtrain,ytrain) 

它运行良好

modelfit=model.fit(Xtrain,ytrain,eval_set = [(Xtest, ytest)]) 

产生上述错误

我尝试了所有可用于多类的 eval_metric,它们都产生相同的错误。

型号如下:

xgb.XGBClassifier(n_jobs = -1,objective = 'multi:softmax',
            num_class=3, eval_metric = 'mlogloss',           
tree_method='approx', scale_pos_weight=1,
        **{'subsample':0.5,'colsample_bylevel':1, 'colsample_bytree': 
 1, 'gamma':0, 'learning_rate':0.3,'max_delta_step': 0, 'max_depth': 10, 
'min_child_weight': 1, 'n_estimators': 10, 'reg_alpha': 0, 'reg_lambda': 
0})

ipdb> modelfit.predict(Xtest)
  array([-1., -1., -1., -1., -1., -1., -1.,  1., -1., -1., -1.,  1.,  1.,
 1., -1.,  1.,  0., -1.,  1.,  1.,  1., -1., -1.,  1.,  1.,  1.,
 1.,  1.,  1.,  0.,  0., -1., -1., -1., -1., -1., -1., -1., -1.,
-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.,
-1., -1., -1., -1., -1., -1., -1.,  1., -1., -1., -1., -1., -1.,
 0.,  1.,  1.,  1.,  1.,  1.,  1., -1., -1., -1., -1., -1.])
 ipdb> len(modelfit.predict(Xtest))
90
ipdb> len(ytest)
90
ipdb> ytest
array([-1., -1., -1., -1., -1., -1., -1.,  0., -1.,  1.,  0.,  1.,  0.,
 1.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
 1.,  1., -1., -1., -1., -1., -1., -1., -1., -1.,  0.,  0.,  1.,
 1.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  1.,  0.,
 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,
-1., -1., -1.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,
 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

从调试器输出可以看出,预测(Xtest)和ytest的len都是90。为什么xgboost会产生错误?

1个回答

这看起来像是 0.80 版本中的错误。

它在升级到 xgboost 0.82 时工作。