我有一个训练集,看起来像
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
、Area
和Day
转换为因子,但我不确定我是否应该对Month
和Night
这样做,它们分别只接受整数值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)=.00727
,prob(VEHICLE)=.207
,...?还是说prob(ATTACK_1strow)=.00727
,prob(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)))