XGBoost预测函数返回大于r

时间:2016-09-02 20:47:32

标签: r

我制作了XGBoost模型,当我尝试运行预测函数时,它会返回一个超过测试数据集中目标列大小的向量。 列车和测试都包括相同类别的目标变量。类别的值为0到7,因此数字从0开始。 我尝试了不同的案例研究作为模式,但问题仍然存在。你能帮我弄清楚造成这个问题的原因吗?

> head(train, 3)
       a      b    c   y  d   e
 1: 3.0148 4.4982  64  5  23  3
 2: 3.0011 4.4465  71  1  20  3
 3: 3.0084 4.4347  72  1  16  5
 ....
# 37 rows in train and 15 rows in test 
# store the target column of test and train data before deletion.
y.train <- train$y
y.test <- test$y
# remove target column
train <- select(train, -y)
test <- select(test, -y)
# change to matrix
trainMatrix <- as.matrix(train)
testMatrix <- as.matrix(test)
#find number of classes 
numberOfClasses <- unique(y.train) %>% length()
# XGBoost parameter set and run
param <- list("objective" = "multi:softprob",
          "eval_metric" = "mlogloss",
          "num_class" = numberOfClasses)
bst = xgboost(param=param, data = trainMatrix, label = y.train, nrounds=15)
#make the prediction
y_pred <- predict(bst, testMatrix)
length(y_pred) # returns 105 while there are only 15 rows in test data

1 个答案:

答案 0 :(得分:0)

问题在于您在培训时对objective的说明。根据文档(见?xgb.train):

  

multi:softmax设置xgboost使用的多类分类   softmax目标。类由数字表示,应该是   从0到tonum_class。

     

multi:softprob与softmax相同,但输出 ndata * nclass 的向量,   这可以进一步重塑为ndata,nclass矩阵。结果包含   预测属于每个类的每个数据点的概率。

这解释了为什么您在15 * 7 = 105中获得了y_pred个元素。相反,您需要在multi::softmax中将目标指定为param。这将返回您的15个预测标签。