在R中使用XGBoost预测类变量

时间:2017-04-09 10:01:44

标签: r prediction xgboost

我是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。以前使用随机森林来预测类变量,它运作良好。

1 个答案:

答案 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;参数。