在 R 中使用 XGBoost 预测 class 变量

Predicting a class variable using XGBoost in R

我是 R 的新手,我想使用 XGBoost 预测测试集中的 Class 变量。我的训练数据集如下所示。

> str(train)
'data.frame':   5000 obs. of  37 variables:
 $ ID   : int  1 2 3 4 5 6 7 8 9 10 ...
 $ A1   : num  0.36 0.33 0.33 0.31 0.33 0.31 0.3 0.3 0.3 0.3 ...
 $ A2   : num  0.45 0.4 0.4 0.4 0.37 0.37 0.4 0.4 0.35 0.37 ...
 $ A3   : num  0.47 0.42 0.4 0.4 0.4 0.38 0.42 0.42 0.38 0.38 ...
 $ A4   : num  0.37 0.31 0.33 0.31 0.31 0.3 0.33 0.34 0.3 0.3 ...
 $ A5   : num  0.33 0.33 0.31 0.33 0.31 0.31 0.3 0.31 0.3 0.3 ...
 $ A6   : num  0.4 0.4 0.4 0.37 0.37 0.4 0.4 0.38 0.37 0.38 ...
 $ A7   : num  0.42 0.4 0.4 0.4 0.38 0.4 0.42 0.42 0.38 0.4 ...
 $ A8   : num  0.31 0.33 0.31 0.31 0.3 0.31 0.34 0.31 0.3 0.28 ...
 $ A9   : num  0.33 0.31 0.33 0.31 0.31 0.3 0.31 0.3 0.3 0.3 ...
 $ A10  : num  0.4 0.4 0.37 0.37 0.4 0.4 0.38 0.37 0.38 0.37 ...
 $ A11  : num  0.4 0.4 0.4 0.38 0.4 0.4 0.42 0.4 0.4 0.35 ...
 $ A12  : num  0.33 0.31 0.31 0.3 0.31 0.31 0.31 0.3 0.28 0.3 ...
 $ A13  : num  0.4 0.36 0.33 0.33 0.33 0.3 0.31 0.31 0.31 0.3 ...
 $ A14  : num  0.49 0.44 0.4 0.39 0.39 0.39 0.42 0.44 0.37 0.36 ...
 $ A15  : num  0.52 0.46 0.41 0.41 0.41 0.41 0.46 0.46 0.41 0.41 ...
 $ A16  : num  0.4 0.33 0.32 0.31 0.32 0.32 0.35 0.35 0.29 0.29 ...
 $ A17  : num  0.36 0.33 0.33 0.33 0.3 0.3 0.31 0.31 0.3 0.3 ...
 $ A18  : num  0.44 0.4 0.39 0.39 0.39 0.39 0.44 0.42 0.36 0.37 ...
 $ A19  : num  0.46 0.41 0.41 0.41 0.41 0.42 0.46 0.44 0.41 0.39 ...
 $ A20  : num  0.33 0.32 0.31 0.32 0.32 0.33 0.35 0.33 0.29 0.31 ...
 $ A21  : num  0.33 0.33 0.33 0.3 0.3 0.3 0.31 0.31 0.3 0.3 ...
 $ A22  : num  0.4 0.39 0.39 0.39 0.39 0.4 0.42 0.37 0.37 0.36 ...
 $ A23  : num  0.41 0.41 0.41 0.41 0.42 0.46 0.44 0.39 0.39 0.39 ...
 $ A24  : num  0.32 0.31 0.32 0.32 0.33 0.35 0.33 0.31 0.31 0.29 ...
 $ A25  : num  0.4 0.35 0.33 0.33 0.33 0.33 0.31 0.31 0.29 0.29 ...
 $ A26  : num  0.49 0.47 0.42 0.39 0.39 0.4 0.42 0.4 0.36 0.36 ...
 $ A27  : num  0.53 0.5 0.44 0.41 0.41 0.41 0.44 0.41 0.38 0.38 ...
 $ A28  : num  0.41 0.39 0.34 0.31 0.31 0.31 0.34 0.33 0.29 0.28 ...
 $ A29  : num  0.35 0.33 0.33 0.33 0.33 0.31 0.31 0.31 0.29 0.31 ...
 $ A30  : num  0.47 0.42 0.39 0.39 0.4 0.42 0.4 0.4 0.36 0.34 ...
 $ A31  : num  0.5 0.44 0.41 0.41 0.41 0.43 0.41 0.41 0.38 0.36 ...
 $ A32  : num  0.39 0.34 0.31 0.31 0.31 0.34 0.33 0.31 0.28 0.28 ...
 $ A33  : num  0.33 0.33 0.33 0.33 0.31 0.31 0.31 0.31 0.31 0.31 ...
 $ A34  : num  0.42 0.39 0.39 0.4 0.42 0.42 0.4 0.37 0.34 0.34 ...
 $ A35  : num  0.44 0.41 0.41 0.41 0.43 0.43 0.41 0.39 0.36 0.36 ...
 $ Class: **Factor** w/ 6 levels "A","B","C","D",..: 3 3 3 3 3 3 3 3 4 4 ...

除了 Class 属性是 empty.I 之外,我的测试数据集看起来完全一样。已使用此代码预测我的测试数据集的 Class。

train <- read.csv("cse_DS_Intro2TRAIN.csv")

test <- read.csv("cse_DS_Intro2TEST.csv")

setDT(train)

setDT(test)

labels <- train$Class

ts_label <- test$Class

new_tr <- model.matrix(~.+0,data = train[,-c("Class"),with=F])

new_ts <- model.matrix(~.+0,data = test[,-c("Class"),with=F])

labels <- as.numeric(labels)-1

ts_label <- as.numeric(ts_label)-1

dtrain <- xgb.DMatrix(data = new_tr,label = labels)

dtest <- xgb.DMatrix(data = new_ts,label=ts_label)

params <- list(
booster = "gbtree",
objective = "binary:logistic",
eta=0.3,
gamma=0,
max_depth=6,
min_child_weight=1,
subsample=1,
colsample_bytree=1
)

xgbcv <- xgb.cv(params = params
            ,data = dtrain
            ,nrounds = 100
            ,nfold = 5
            ,showsd = T
            ,stratified = T
            ,print.every.n = 10
            ,early.stop.round = 20
            ,maximize = F
)

当我运行上面的代码时,我得到这个错误。

Error in xgb.iter.update(fd$bst, fd$dtrain, iteration - 1, obj) : 
[16:49:39] amalgamation/../src/objective/regression_obj.cc:108: label must 
be in [0,1] for logistic regression

是否可以在 R 中使用 XGBoost 预测因子类型数据?

P.S。之前使用随机森林预测 class 变量并且效果很好。

您的目标 类 必须从 0 开始。试试下面的例子

library(xgboost)
data(agaricus.train)
data(agaricus.test)
train = agaricus.train

param = list("objective" = "binary:logistic" ,"eval_metric" = "logloss" ,
         "eta" =1 , "max.depth" = 2)

该模型有效,因为 train$labels 从 0 开始,因此输出概率将为“1”

model <- xgboost(data = train$data, label = train$label,
             nrounds = 20, objective = "binary:logistic")

这个模型行不通。从 1.

开始时请注意错误消息
 model <- xgboost(data = train$data, label = train$label+1,
             nrounds = 20, objective = "binary:logistic")

只需将它们转换为从 0 开始的数字类型即可。

更新: 此外,由于您几乎有 6 个 类,因此 "objective" 应该是 "multi:softmax" 或 "multi:softprob",您还应该在其中包含 "num_class" 参数。