xgboost多项分类错误:“标签和预测大小不匹配”

时间:2017-08-24 15:40:15

标签: r xgboost

转发我对xgboost和R都很新。

我在R中使用xgboost对我的数据dtrain执行多项分类。我使用的标签有六个级别,所以我的代码如下所示:

param1 <- list(objective = "multi:softprob"
          , num_class = 6
          , booster = "gbtree"  
          , eta = 0.5
          , max.depth = 7
          , min_child_weight = 10
          , max_delta_step = 5
          , subsample = 0.8
          , colsample_bytree = 0.8
          , lambda  = 3 # L2
          , alpha = 5 # L1
)
set.seed(2016)    
xgbcv1 <- xgb.cv(params = param1, data = dtrain, nround = 3000, nfold = 3,
             metrics = list("error", "auc"), maximize = T, 
             print_every_n = 10, early_stopping_rounds = 10)

这会引发以下错误:

Error in xgb.iter.update(fd$bst, fd$dtrain, iteration - 1, obj) : 
amalgamation/../src/objective/multiclass_obj.cc:75: Check failed: 
label_error >= 0 && label_error < nclass SoftmaxMultiClassObj: label must be in [0, num_class), num_class=6 but found 6 in label.

所以我尝试设置num_class = 7,这会抛出此错误:

Error in xgb.iter.eval(fd$bst, fd$watchlist, iteration - 1, feval) : 
amalgamation/../src/metric/elementwise_metric.cc:28: Check failed: 
(preds.size()) == (info.labels.size()) label and prediction size not match, hint: use merror or mlogloss for multi-class classification

这里发生了什么? num_class是否需要大于label_error或等于它?

3 个答案:

答案 0 :(得分:0)

XGboost算法要求类标签从0开始,并依次增加到最大类数。 这有点不便,因为您需要跟踪哪个Class名称与哪个标签一起使用。

将您的Class目标变量转换为数字并用1减去。

df$class_numeric<-as.numeric(df$class_target)
df<-df%>%mutate(class_numeric=class_numeric-1)

答案 1 :(得分:-1)

如果因变量中的级别数为6,则给出num_class = 7.含义指定num_class = levels(从属变量)+ 1

答案 2 :(得分:-1)

尝试:

set metrics = list("mlogloss")