1

我有一个看起来像的训练集

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是结果/因变量。我将Name,AreaDay转换为因子,但我不确定我是否应该为MonthNight,它分别只取整数值 1-12 和 0-1。

然后我尝试将其转换为 amodel.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)=.00727, prob(VEHICLE)=.207, ...?还是说,,,prob(ATTACK_1strow)=.00727... prob(ATTACK_2ndrow)=.207

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

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

2 回答 2

2

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

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

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

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

?xgb.train

multi:softprob 和softmax一样,但是输出一个ndata * nclass的向量,可以进一步reshape成ndata,nclass矩阵。结果包含属于每个类的每个数据点的预测概率。

于 2016-02-22T01:14:00.160 回答
0
pred <- data.frame(t(matrix(pred, nrow = num.class, ncol = length(pred)/num.class)))
于 2016-02-21T22:59:49.680 回答