如何使用 xgboost 打印分类结果的概率?
How to print probabilities for categorical outcome using 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
是 outcome/dependent 变量。我将 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 ...
...
pred <- data.frame(t(matrix(pred, nrow = num.class, ncol = length(pred)/num.class)))
当你用 "objective" = "multi:softprob"
训练一个 xgboost
class 时,你实际上是在为每个 class 训练单独的二元模型。因此,对于您的示例,总共有 num.class
* nrow(data)
个预测。
将其公式化为矩阵(有很多方法):
matrix(pred, ncol = num.class, byrow = T)
请注意,您必须注意正确填充矩阵,我给出的示例将按行填充矩阵。您将留下矩阵,其中每一行都是一个训练示例,每一列是给定 class.
的概率
来自 ?xgb.train
multi:softprob same as softmax, but output a vector of ndata *
nclass, which can be further reshaped to ndata, nclass matrix. The
result contains predicted probabilities of each data point belonging
to each class.
我的训练集看起来像
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
是 outcome/dependent 变量。我将 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 ...
...
pred <- data.frame(t(matrix(pred, nrow = num.class, ncol = length(pred)/num.class)))
当你用 "objective" = "multi:softprob"
训练一个 xgboost
class 时,你实际上是在为每个 class 训练单独的二元模型。因此,对于您的示例,总共有 num.class
* nrow(data)
个预测。
将其公式化为矩阵(有很多方法):
matrix(pred, ncol = num.class, byrow = T)
请注意,您必须注意正确填充矩阵,我给出的示例将按行填充矩阵。您将留下矩阵,其中每一行都是一个训练示例,每一列是给定 class.
的概率来自 ?xgb.train
multi:softprob same as softmax, but output a vector of ndata * nclass, which can be further reshaped to ndata, nclass matrix. The result contains predicted probabilities of each data point belonging to each class.