转发我对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
或等于它?
答案 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")