我制作了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
答案 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个预测标签。