【问题标题】:Predicting a class variable using XGBoost in R在 R 中使用 XGBoost 预测类变量
【发布时间】:2017-04-09 10:01:43
【问题描述】:

我是 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 属性为空。我已使用此代码来预测我的测试数据集的 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 预测因子类型数据?

附:之前使用过随机森林来预测类变量,效果很好。

【问题讨论】:

  • 请使用适当的工具来格式化您的问题。你可以使用str()函数来展示你的数据是什么样子的(至少我觉得它更直观)。
  • 您的Class 变量是字符串还是因子?错误消息暗示该函数需要二进制数字格式的目标/类。
  • @ulfelder 这是一个因素。我已经包含了我的训练数据集的屏幕截图。
  • 屏幕截图不能作为可重复的示例,如果您真的想要解决问题,您可能需要发布这些内容。
  • 你的目标类如果它们像 1 和 2,只需将它们降低到 0 和 1。那么它应该可以工作。

标签: r prediction xgboost


【解决方案1】:

您的目标类必须从 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 个类,因此“目标”应该是“multi:softmax”或“multi:softprob”,其中还应该包含“num_class”参数。

【讨论】:

  • 谢谢。使用 softmax 为我解决了问题。正如你所说,首先我将我的因子类型变量转换为数字类型变量。然后我使用了multi:softmax。 param
  • 太棒了!很高兴它有帮助。 :-)
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2014-07-06
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多