如何使用 xgboost 打印分类结果的概率?

How to print probabilities for categorical outcome using xgboost?

我的训练集看起来像

Name       Day         Area         X    Y    Month Night
ATTACK    Monday   LA           -122.41 37.78   8      0
VEHICLE  Saturday  CHICAGO      -1.67    3.15   2      0
MOUSE     Monday   TAIPEI       -12.5    3.1    9      1

Name 是 outcome/dependent 变量。我将 NameAreaDay 转换为因数,但我不确定我是否应该为 MonthNight 转换,它们只承担整数值分别为 1-12 和 0-1。

然后我尝试将其转换为 model.matrix 然后 运行 xgboost

m<-model.matrix(~Area + Day + X + Y + Month +Night, data = train)
num.class=length(levels(train$Name))
levels(train$Name)=1:num.class
y = as.matrix(as.integer(train$Name)-1)
param <- list("objective" = "multi:softprob",
          "eval_metric" = "mlogloss", "nthread" = 4,
          "num_class" = num.class, "max_depth" = 16, "eta" = 0.3)
bst <- xgboost(param=param, data=m, label=y, nrounds=min.merror.idx, verbose=0)
m.test <- model.matrix(~ Area + Day + X + Y + Month +Night, data =testDF)
pred <- predict(bst, m.test)

但是head(pred)只是显示了一堆概率数

[1] 0.007272065 0.207123533 0.003311855 0.003352652

Name 变量可以取 39 个不同的值。 nrow(test)给出80000多,nrow(test)*39和length(pred)是一样的。我不确定 pred 在说什么。假设 Name 被排序为 [ATTACK, VEHICLE, ..],它表示第一行 prob(ATTACK)=.00727prob(VEHICLE)=.207、...?还是说 prob(ATTACK_1strow)=.00727, prob(ATTACK_2ndrow)=.207,...?

假设 pred 是前者,那么我如何修改 pred 使其看起来像下面这样?

    prob.ATTACK prob.VEHICLE ...
1   .00727      .207         ...
...
pred <- data.frame(t(matrix(pred, nrow = num.class, ncol = length(pred)/num.class)))

当你用 "objective" = "multi:softprob" 训练一个 xgboost class 时,你实际上是在为每个 class 训练单独的二元模型。因此,对于您的示例,总共有 num.class * nrow(data) 个预测。

将其公式化为矩阵(有很多方法):

matrix(pred, ncol = num.class, byrow = T)

请注意,您必须注意正确填充矩阵,我给出的示例将按行填充矩阵。您将留下矩阵,其中每一行都是一个训练示例,每一列是给定 class.

的概率

来自 ?xgb.train

multi:softprob same as softmax, but output a vector of ndata * nclass, which can be further reshaped to ndata, nclass matrix. The result contains predicted probabilities of each data point belonging to each class.