Saltar al contenido

subíndice fuera de límites en la función gbm

Solución:

solo una corazonada ya que no puedo ver sus datos, pero creo que el error ocurre cuando tiene niveles variables que existen en el conjunto de prueba que no existen en el conjunto de entrenamiento.

esto puede suceder fácilmente cuando tiene una variable de factor con un alto número de niveles, o un nivel tiene un número bajo de instancias.

dado que está utilizando pliegues de CV, es posible que el conjunto de retención en uno de los bucles tenga niveles ajenos a los datos de entrenamiento.

Sugeriría:

A) use model.matrix () para codificar en caliente sus variables de factor

B) siga configurando diferentes semillas hasta que obtenga una división de CV que no tenga este error.

EDITAR: sí, con ese rastreo, su tercer CV reservado tiene un nivel de factor en su conjunto de prueba que no existe en el entrenamiento. por lo que la función de predicción ve un valor externo y no sabe qué hacer.

EDICIÓN 2: aquí hay un ejemplo rápido para mostrar lo que quiero decir con “niveles de factor que no están en el conjunto de prueba”

#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

Me encuentro con el mismo problema y termino resolviéndolo cambiando una de las funciones ocultas llamada predict.gbm en el paquete gbm. Esta función predice el conjunto de pruebas del objeto gbm entrenado en el conjunto de entrenamiento a partir de la división por validación cruzada.

El problema es que el conjunto de pruebas aprobado solo debe tener las columnas correspondientes a las características, por lo que debe modificar la función.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *