r语言 - 如何使用 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是结果/因变量。我将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)=.00727prob(ATTACK_2ndrow)=.207 ,...?

假设pred是前者,那么我该如何修改pred使其如下所示?

    prob.ATTACK prob.VEHICLE ...
1   .00727      .207         ...
...

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

要将其表述为矩阵(有很多方法):

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

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

?xgb.train相比

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

pred <- data.frame(t(matrix(pred, nrow = num.class, ncol = length(pred)/num.class)))

最新更新