2017-04-09 3 views
2

Ich bin neu in R und möchte die Klassenvariable in meinem Testset mit XGBoost vorhersagen. Mein Trainingsdatensatz sieht wie folgt aus.Vorhersage einer Klassenvariablen mit XGBoost in R

> str(train) 
'data.frame': 5000 obs. of 37 variables: 
$ ID : int 1 2 3 4 5 6 7 8 9 10 ... 
$ A1 : num 0.36 0.33 0.33 0.31 0.33 0.31 0.3 0.3 0.3 0.3 ... 
$ A2 : num 0.45 0.4 0.4 0.4 0.37 0.37 0.4 0.4 0.35 0.37 ... 
$ A3 : num 0.47 0.42 0.4 0.4 0.4 0.38 0.42 0.42 0.38 0.38 ... 
$ A4 : num 0.37 0.31 0.33 0.31 0.31 0.3 0.33 0.34 0.3 0.3 ... 
$ A5 : num 0.33 0.33 0.31 0.33 0.31 0.31 0.3 0.31 0.3 0.3 ... 
$ A6 : num 0.4 0.4 0.4 0.37 0.37 0.4 0.4 0.38 0.37 0.38 ... 
$ A7 : num 0.42 0.4 0.4 0.4 0.38 0.4 0.42 0.42 0.38 0.4 ... 
$ A8 : num 0.31 0.33 0.31 0.31 0.3 0.31 0.34 0.31 0.3 0.28 ... 
$ A9 : num 0.33 0.31 0.33 0.31 0.31 0.3 0.31 0.3 0.3 0.3 ... 
$ A10 : num 0.4 0.4 0.37 0.37 0.4 0.4 0.38 0.37 0.38 0.37 ... 
$ A11 : num 0.4 0.4 0.4 0.38 0.4 0.4 0.42 0.4 0.4 0.35 ... 
$ A12 : num 0.33 0.31 0.31 0.3 0.31 0.31 0.31 0.3 0.28 0.3 ... 
$ A13 : num 0.4 0.36 0.33 0.33 0.33 0.3 0.31 0.31 0.31 0.3 ... 
$ A14 : num 0.49 0.44 0.4 0.39 0.39 0.39 0.42 0.44 0.37 0.36 ... 
$ A15 : num 0.52 0.46 0.41 0.41 0.41 0.41 0.46 0.46 0.41 0.41 ... 
$ A16 : num 0.4 0.33 0.32 0.31 0.32 0.32 0.35 0.35 0.29 0.29 ... 
$ A17 : num 0.36 0.33 0.33 0.33 0.3 0.3 0.31 0.31 0.3 0.3 ... 
$ A18 : num 0.44 0.4 0.39 0.39 0.39 0.39 0.44 0.42 0.36 0.37 ... 
$ A19 : num 0.46 0.41 0.41 0.41 0.41 0.42 0.46 0.44 0.41 0.39 ... 
$ A20 : num 0.33 0.32 0.31 0.32 0.32 0.33 0.35 0.33 0.29 0.31 ... 
$ A21 : num 0.33 0.33 0.33 0.3 0.3 0.3 0.31 0.31 0.3 0.3 ... 
$ A22 : num 0.4 0.39 0.39 0.39 0.39 0.4 0.42 0.37 0.37 0.36 ... 
$ A23 : num 0.41 0.41 0.41 0.41 0.42 0.46 0.44 0.39 0.39 0.39 ... 
$ A24 : num 0.32 0.31 0.32 0.32 0.33 0.35 0.33 0.31 0.31 0.29 ... 
$ A25 : num 0.4 0.35 0.33 0.33 0.33 0.33 0.31 0.31 0.29 0.29 ... 
$ A26 : num 0.49 0.47 0.42 0.39 0.39 0.4 0.42 0.4 0.36 0.36 ... 
$ A27 : num 0.53 0.5 0.44 0.41 0.41 0.41 0.44 0.41 0.38 0.38 ... 
$ A28 : num 0.41 0.39 0.34 0.31 0.31 0.31 0.34 0.33 0.29 0.28 ... 
$ A29 : num 0.35 0.33 0.33 0.33 0.33 0.31 0.31 0.31 0.29 0.31 ... 
$ A30 : num 0.47 0.42 0.39 0.39 0.4 0.42 0.4 0.4 0.36 0.34 ... 
$ A31 : num 0.5 0.44 0.41 0.41 0.41 0.43 0.41 0.41 0.38 0.36 ... 
$ A32 : num 0.39 0.34 0.31 0.31 0.31 0.34 0.33 0.31 0.28 0.28 ... 
$ A33 : num 0.33 0.33 0.33 0.33 0.31 0.31 0.31 0.31 0.31 0.31 ... 
$ A34 : num 0.42 0.39 0.39 0.4 0.42 0.42 0.4 0.37 0.34 0.34 ... 
$ A35 : num 0.44 0.41 0.41 0.41 0.43 0.43 0.41 0.39 0.36 0.36 ... 
$ Class: **Factor** w/ 6 levels "A","B","C","D",..: 3 3 3 3 3 3 3 3 4 4 ... 

Mein Testdatensatz sieht genau die gleichen, außer dass Class-Attribute ist empty.I verwendet hat diesen Code die Klasse für meinen Testdatensatz zu prognostizieren.

Wenn ich den obigen Code ausführen, erhalte ich diesen Fehler.

Ist es möglich, eine Faktorart Daten mit XGBoost in R vorherzusagen?

P.S. habe Random Forest verwendet, um die Klassenvariable vorherzusagen und es hat gut funktioniert.

+0

Verwenden Sie bitte die entsprechenden Tools, um Ihre Frage zu formatieren. Sie können 'str()' Funktion verwenden, um zu zeigen, wie Ihre Daten aussehen (zumindest finde ich es intuitiver). –

+0

Ist Ihre 'Class'-Variable ein String oder Faktor? Die Fehlermeldung impliziert, dass die Funktion ein Ziel/eine Klasse im binären numerischen Format erwartet. – ulfelder

+0

@ullinder Es ist ein Faktor. Ich habe einen Screenshot meines Trainingsdatensatzes beigefügt. – Yash

Antwort

3

Ihre Zielklassen müssen bei 0 beginnen. Versuchen Sie das folgende Beispiel

library(xgboost) 
data(agaricus.train) 
data(agaricus.test) 
train = agaricus.train 

param = list("objective" = "binary:logistic" ,"eval_metric" = "logloss" , 
     "eta" =1 , "max.depth" = 2) 

Dieses Modell seit Zug $ Etiketten arbeitet beginnt bei 0 daher Ausgabewahrscheinlichkeiten werden

model <- xgboost(data = train$data, label = train$label, 
      nrounds = 20, objective = "binary:logistic") 

dieses Modell für ‚1‘ sein würde nicht funktionieren. Beachten Sie die Fehlermeldung, wenn Sie es von 1 haben.

Konvertieren Sie sie einfach in numerischen Typ, wo sie von 0 beginnen, die funktionieren sollten.

Update: Auch da Sie fast 6 Klassen haben das "Ziel" sollte "multi: softmax" oder "multi: softprob", wo Sie sollten auch "num_class" Parameter umfassen.

+0

Danke. Softmax hat den Trick für mich gemacht. Wie Sie gesagt haben, habe ich zuerst meine Faktor-Typ-Variable in eine numerische Typ-Variable umgewandelt. Dann habe ich multi: softmax. param <- Liste ("Ziel" = "multi: softmax", "num_class" = numberOfClasses, "eval_metric" = "merror", "colsample_bytree" = 0,7, 'Substichprobe' = 0,7, " eta "= .01," max.depth "= 6) Ich habe diesmal keine Fehler bekommen. – Yash

+0

Großartig! Froh, dass es geholfen hat. :-) –

Verwandte Themen