我是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属性为空之外,我的测试数据集看起来一样。我使用此代码来预测我的测试数据集的类。
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。以前使用随机森林来预测类变量,它运作良好。
答案 0 :(得分:4)
您的目标类必须从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开始,因此输出概率将为&#39; 1&#39;
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个课程&#34;目标&#34;应该是&#34; multi:softmax&#34;或&#34; multi:softprob&#34;你还应该包括&#34; num_class&#34;参数。