2016-03-18 3 views
8

У меня много проблем с выяснением того, как правильно установить num_classes для xgboost.Понимание num_classes для xgboost в R

У меня есть пример, используя данные Iris

df <- iris 

y <- df$Species 
num.class = length(levels(y)) 
levels(y) = 1:num.class 
head(y) 

df <- df[,1:4] 

y <- as.matrix(y) 
df <- as.matrix(df) 

param <- list("objective" = "multi:softprob",  
      "num_class" = 3,  
      "eval_metric" = "mlogloss",  
      "nthread" = 8, 
      "max_depth" = 16, 
      "eta" = 0.3,  
      "gamma" = 0,  
      "subsample" = 1, 
      "colsample_bytree" = 1, 
      "min_child_weight" = 12) 

model <- xgboost(param=param, data=df, label=y, nrounds=20) 

Это возвращает ошибку

Error in xgb.iter.update(bst$handle, dtrain, i - 1, obj) : 
SoftmaxMultiClassObj: label must be in [0, num_class), num_class=3 but found 3 in label 

Если изменить num_class на 2 я получаю ту же ошибку. Если я увеличу num_class до 4, тогда модель запустится, но я получу 600 прогнозируемых вероятностей, что имеет смысл для 4 классов.

Я не уверен, что я делаю ошибку, или я не понимаю, как работает xgboost. Любая помощь будет оценена по достоинству.

+0

'num_class' - количество различных классов для задачи классификации. В вашем случае с набором данных 'iris' он должен быть установлен на 3. –

+0

Он установлен в 3. Ошибка, вставленная выше, из этой настройки. – House

+0

Не могли бы вы вывести вывод 'unique (y)'? –

ответ

3

метка должна быть в [0, num_class) в вашем скрипте добавить y<-y-1 перед тем model <-...

+0

Я попытался добавить 'y House

+1

, если у вас есть 3 класса num_class = 3 и классы начинаются с 0 – RustamA

+0

У вас ошибка coz y в вашем скрипте является символом. y <- as.numeric (y) -1 – RustamA

1

Я столкнулся с этой довольно странной проблемой, как хорошо. Мне показалось, что в моем классе это результат неправильного , кодирующего метки.

Во-первых, используя строковый вектор с N классами в качестве меток, я мог бы получить только алгоритм для запуска, установив num_class = N + 1. Однако этот результат был бесполезным, потому что у меня было только N действительных классов и N + 1 ведра прогнозируемых вероятностей.

я перекодировать метки в целых числах а затем й num_class работали хорошо, когда установлен на N.

# Convert classes to integers for xgboost 
class <- data.table(interest_level=c("low", "medium", "high"), class=c(0,1,2)) 
t1 <- merge(t1, class, by="interest_level", all.x=TRUE, sort=F) 

и

param <- list(booster="gbtree", 
       objective="multi:softprob", 
       eval_metric="mlogloss", 
       #nthread=13, 
       num_class=3, 
       eta_decay = .99, 
       eta = .005, 
       gamma = 1, 
       max_depth = 4, 
       min_child_weight = .9,#1, 
       subsample = .7, 
       colsample_bytree = .5 
) 

Например.

Смежные вопросы