Как распечатать вероятности категориального исхода с помощью 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 - результат / зависимая переменная. Я преобразовал 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, ..], это говорит о том, что для 1-й строки prob(ATTACK)=.00727, prob(VEHICLE)=.207, ...? Или это говорит prob(ATTACK_1strow)=.00727, _23 _, ...?

Предполагая, что pred - первое, как я могу изменить pred так, чтобы он выглядел так, как показано ниже?

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

person user5739619    schedule 20.02.2016    source источник


Ответы (1)


Когда вы тренируете xgboost классификатор с "objective" = "multi:softprob", вы фактически тренируете отдельные бинарные модели для каждого класса. Таким образом, всего для вашего примера у вас есть num.class * nrow(data) общих прогнозов.

Чтобы сформулировать это в виде матрицы (есть много способов):

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

обратите внимание, что вы должны быть осторожны, чтобы правильно заполнить матрицу, пример, который я привел, будет заполнять матрицу построчно. У вас останется матрица, в которой каждая строка является обучающим примером, а каждый столбец - вероятностью для данного класса.

с ?xgb.train

multi: softprob то же, что и softmax, но выводит вектор ndata * nclass, который может быть преобразован в матрицу ndata, nclass. Результат содержит прогнозируемые вероятности каждой точки данных, принадлежащих каждому классу.

person T. Scharf    schedule 22.02.2016