У меня есть тренировочный набор, который выглядит как

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         ...
...
1
user5739619 20 Фев 2016 в 07:04

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. Результат содержит прогнозируемые вероятности принадлежности каждой точки данных к каждому классу.

2
T. Scharf 22 Фев 2016 в 01:14
pred <- data.frame(t(matrix(pred, nrow = num.class, ncol = length(pred)/num.class)))
0
Bishwarup Bhattacharjee 21 Фев 2016 в 22:59