2016-03-18 7 views
8

Ich habe viel Mühe herauszufinden, wie die num_classes für xgboost richtig gesetzt werden.Verstehen von num_classes für xgboost in R

Ich habe ein Beispiel mit der Iris-Daten bekam

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) 

dies ein Fehler zurückgibt

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 

Wenn ich die num_class bis 2 wechsle ich den gleichen Fehler. Wenn ich die num_class auf 4 erhöhe, dann läuft das Modell, aber ich bekomme 600 vorhergesagte Wahrscheinlichkeiten zurück, was für 4 Klassen sinnvoll ist.

Ich bin mir nicht sicher, ob ich einen Fehler mache oder ob ich nicht verstehe, wie xgboost funktioniert. Jede Hilfe wäre willkommen.

+0

'num_class' ist die Anzahl der verschiedenen Klassen für Klassifizierungsprobleme. In Ihrem Fall mit 'Iris'-Datensatz sollte es auf 3 gesetzt werden. –

+0

Es ist auf 3 gesetzt. Der Fehler, den ich oben eingefügt habe, stammt von dieser Einstellung. – House

+0

Würden Sie bitte die Ausgabe von 'unique (y)' posten? –

Antwort

3

Etikett muss in [0, num_class) in Ihrem Skript sein hinzufügen y<-y-1 vor model <-...

+0

Ich habe versucht, 'y House

+1

Wenn Sie 3 Klassen haben num_class = 3 und Klassen beginnen von 0 – RustamA

+0

Sie haben einen Fehler coz y in Ihrem Skript ist Zeichen. y <- as.numeric (y) -1 – RustamA

1

ich in dieses eher seltsam Problem lief auch. Es schien in meiner Klasse ein Ergebnis von nicht richtig Codierung der Etiketten zu sein.

Zuerst konnte ich einen Algorithmus verwenden, indem ich einen Stringvektor mit N Klassen als Label verwendete, indem ich num_class = N + 1 einstellte. Dieses Ergebnis war jedoch nutzlos, da ich nur N tatsächliche Klassen und N + hatte 1 Eimer vorhergesagter Wahrscheinlichkeiten.

I die Etiketten als ganze Zahlen a neu codiert nd dann num_class hat gut funktioniert, wenn auf 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) 

und

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 
) 

Zum Beispiel.