我的训练集看起来像
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 ...
...
答案 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}}