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

时间:2016-02-20 04:04:15

标签: r categorical-data 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         ...
...

2 个答案:

答案 0 :(得分:2)

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

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

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

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

来自?xgb.train

  

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

答案 1 :(得分:0)

{{1}}