2017-04-09 72 views
2

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

> 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 ... 

我的测试数据集看起来除了类属性一样的是empty.I已经使用这个代码来预测类为我的测试数据集。

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

请使用适当的工具来设置你的问题的格式。你可以使用'str()'函数来显示你的数据是什么样的(至少我觉得它更直观)。 –

+0

你的'Class'变量是一个字符串还是因子?错误消息意味着该函数需要二进制数字格式的目标/类。 – ulfelder

+0

@ulfelder这是一个因素。我包含了我的训练数据集的截图。 – Yash

回答

3

您的目标类必须从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) 

这个模型的工作从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类的“客观”应为“多:SOFTMAX”或“多:softprob”,你还应该包括“num_class”参数。

+0

谢谢。使用softmax为我做了诀窍。正如你所说,首先我将我的因子类型变量转换为数值类型变量。然后我使用multi:softmax。 PARAM < - 列表( “目标”= “多:SOFTMAX”, “num_class”= numberOfClasses, “eval_metric”= “merror”, “colsample_bytree”= 0.7, '子样本'= 0.7, “ eta“= .01,”max.depth“= 6)这次我没有收到任何错误。 – Yash

+0

太棒了!很高兴帮助。 :-) –