2013-09-05 15 views
10

Ich habe ein seltsames Problem. Ich habe diesen Code erfolgreich auf meinem Laptop ausgeführt, aber wenn ich versuche, es auf einem anderen Computer zuerst zu starten, bekomme ich diese Warnung Verteilung nicht angegeben, vorausgesetzt, Bernoulli ..., die ich erwarte, aber dann bekomme ich diesen Fehler: Error in object$var.levels[[i]] : subscript out of boundsSubscript außerhalb der Grenzen in GBM Funktion

library(gbm) 
gbm.tmp <- gbm(subxy$presence ~ btyme + stsmi + styma + bathy, 
       data=subxy, 
       var.monotone=rep(0, length= 4), n.trees=2000, interaction.depth=3, 
       n.minobsinnode=10, shrinkage=0.01, bag.fraction=0.5, train.fraction=1, 
       verbose=F, cv.folds=10) 

Kann jemand helfen? Die Datenstrukturen sind genau gleich, der gleiche Code, der gleiche R. Ich verwende hier nicht einmal einen Index.

EDIT: Traceback()

6: predict.gbm(model, newdata = my.data, n.trees = best.iter.cv) 
5: predict(model, newdata = my.data, n.trees = best.iter.cv) 
4: predict(model, newdata = my.data, n.trees = best.iter.cv) 
3: gbmCrossValPredictions(cv.models, cv.folds, cv.group, best.iter.cv, 
     distribution, data[i.train, ], y) 
2: gbmCrossVal(cv.folds, nTrain, n.cores, class.stratify.cv, data, 
     x, y, offset, distribution, w, var.monotone, n.trees, interaction.depth, 
     n.minobsinnode, shrinkage, bag.fraction, var.names, response.name, 
     group) 
1: gbm(subxy$presence ~ btyme + stsmi + styma + bathy, data = subxy,var.monotone = rep(0, length = 4), n.trees = 2000, interaction.depth = 3, n.minobsinnode = 10, shrinkage = 0.01, bag.fraction = 0.5, train.fraction = 1, verbose = F, cv.folds = 10) 

Könnte es etwas zu tun haben, weil ich die gespeicherte R Arbeitsbereich auf eine andere Maschine bewegt?

EDIT 2: ok, also habe ich das gbm-Paket auf der Maschine aktualisiert, wo der Code funktionierte und jetzt bekomme ich den gleichen Fehler. An diesem Punkt denke ich, dass das ältere gbm-Paket diese Überprüfung vielleicht nicht hatte oder dass die neuere Version ein Problem hat. Ich verstehe gbm nicht gut genug zu sagen.

+1

(1) Es kann nicht die Quelle Ihres Problems sein, aber Ihre Formel sollte nicht $ verwenden; mach 'Präsenz ~ ... '. (2) Eine Sache zu überprüfen ist, dass beide Maschinen R auf die gleiche Weise eingerichtet haben; Überprüfen Sie zum Beispiel 'stringsAsFactors'. – joran

+0

Wo ist dieser 'Subxy'-Datenrahmen? Wenn es sich um Ihre eigenen Daten handelt, können Sie bitte einige Beispieldaten bereitstellen, die das Problem reproduzieren. Ein "traceback()", wo der Fehler auftritt, wäre ebenfalls nützlich. –

+0

Die Standardverteilung für 'gbm' ist" bernoulli ". Wenn Sie also ein Ergebnis mit mehr als zwei Ebenen haben, würden Sie nicht einen Fehler erwarten? –

Antwort

11

nur eine Ahnung, da ich Sie Daten nicht sehen kann, aber ich glaube, dass Fehler auftritt, wenn Sie im Testset Variablenebenen haben, die nicht im Trainingssatz vorhanden sind.

Dies kann leicht passieren, wenn Sie eine Faktorvariable mit einer hohen Anzahl von Ebenen oder eine Ebene mit einer geringen Anzahl von Instanzen haben.

Da Sie CV-Falz verwenden, ist es möglich, dass der auf einer der Schleifen festgelegte Holdout-Wert für die Trainingsdaten Fremdlevel hat.

Ich würde vorschlagen, entweder:

A) verwenden model.matrix(), um one-hot kodieren Ihre Faktorvariablen

B) halten verschiedene Samen einstellen, bis Sie einen CV Split erhalten, die nicht der Fall ist habe diesen Fehler auftreten.

EDIT: Yep, mit dieser Traceback, hat Ihre 3. CV Holdout eine Faktorstufe in seinem Test-Set, die nicht im Training vorhanden ist. Die Vorhersagefunktion sieht also einen fremden Wert und weiß nicht, was zu tun ist.

EDIT 2: Hier ist ein kleines Beispiel zu zeigen, was ich mit „Faktorstufen nicht im Test-Set“ bedeuten

#Example data with low occurrences of a factor level: 

set.seed(222) 
data = data.frame(cbind(y = sample(0:1, 10, replace = TRUE), x1 = rnorm(10), x2 = as.factor(sample(0:10, 10, replace = TRUE)))) 
data$x2 = as.factor(data$x2) 
data 

     y   x1 x2 
[1,] 1 -0.2468959 2 
[2,] 0 -1.2155609 6 
[3,] 0 1.5614051 1 
[4,] 0 0.4273102 5 
[5,] 1 -1.2010235 5 
[6,] 1 1.0524585 8 
[7,] 0 -1.3050636 6 
[8,] 0 -0.6926076 4 
[9,] 1 0.6026489 3 
[10,] 0 -0.1977531 7 

#CV fold. This splits a model to be trained on 80% of the data, then tests against the remaining 20%. This is a simpler version of what happens when you call gbm's CV fold. 

CV_train_rows = sample(1:10, 8, replace = FALSE) ; CV_test_rows = setdiff(1:10, CV_train_rows) 
CV_train = data[CV_train_rows,] ; CV_test = data[CV_test_rows,] 

#build a model on the training... 

CV_model = lm(y ~ ., data = CV_train) 
summary(CV_model) 
#note here: as the model has been built, it was only fed factor levels (3, 4, 5, 6, 7, 8) for variable x2 

CV_test$x2 
#in the test set, there are only levels 1 and 2. 

#attempt to predict on the test set 
predict(CV_model, CV_test) 

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
factor x2 has new levels 1, 2 
+1

danke für die Antwort, es ist ein bisschen über meinen Kopf, ich bin mir nicht sicher, ob ich alles verstehe. Warum funktioniert die gleiche Funktion auf dem anderen Computer? Ich bekomme diesen Fehler nie. Es ist ein bisschen seltsam. Ich möchte den CV-Parameter nicht ändern. –

+0

siehe bitte edit2 in der Antwort, wenn das Sinn macht. Vielen Dank –

+4

so kann ich bestätigen, dass durch Deaktivieren der CV falten gbm funktioniert. Vielleicht ist es ein Fehler mit dem Paket? Es funktionierte im vorherigen Paket. Jede CV-Nummer höher als 1 gibt diesen Fehler an. Also immer wenn es benutzt wird. –

0

ich das gleiche Problem stoßen und es zu lösen am Ende von einem der versteckten Funktion ändert namens predicate.gbm im Paket gbm. Diese Funktion sagt die Testmenge voraus, die durch das trainierte gbm-Objekt auf dem Trainingssatz aus der Division durch Kreuzvalidierung gesetzt wurde.

Das Problem ist das bestandene Testset sollte nur die Spalten entsprechend den Funktionen haben, so dass Sie die Funktion ändern sollten.

+0

"Das Problem ist, dass das übergebene Testset nur die Spalten haben sollte, die den Features entsprechen, also sollten Sie die Funktion modifizieren." Vielen Dank! Das hat mich heute Morgen lange gestolpert. –

Verwandte Themen