Creé varios modelos de ctree (de 40 a 80) que quiero evaluar con bastante frecuencia.Cómo eliminar datos de entrenamiento de party ::: ctree models?
Un problema es que los objetos modelo son muy grandes (40 modelos requieren más de 2.8G de memoria) y me parece que almacenaron los datos de entrenamiento, quizás como nombrede modelo @ datos y nombrede modelo @ respuestas, y no solo las informaciones relevantes para predecir nuevos datos.
La mayoría de los otros paquetes de aprendizaje R tienen opciones configurables para incluir los datos en el objeto modelo, pero no pude encontrar ninguna pista en la documentación. También probé para asignar objetos ModelEnv vacías por
[email protected] <- new("ModelEnv")
pero no había ningún efecto sobre el tamaño del archivo rdata respectiva.
¿Alguien sabe si ctree realmente almacena los datos de entrenamiento y cómo eliminar todos los datos de los modelos de ctree que son irrelevantes para las nuevas predicciones de modo que pueda encajar muchos de ellos en la memoria?
Muchas gracias,
Stefan
Gracias por su colaboración, que ya era muy útil.
que utilizan dput
y str
para tomar una mirada más profunda en el objeto y se encontró que no hay datos de entrenamiento se incluye en el modelo, pero hay una ranura responses
, que parece tener las etiquetas de formación y rownames. De todos modos, noté que cada nodo tiene un vector de peso para cada muestra de entrenamiento. Después de un tiempo de inspeccionar el código, terminé googlear un poco y encontré el siguiente comentario en el registro de party
NOTICIAS:
CHANGES IN party VERSION 0.9-13 (2007-07-23)
o update `mvt.f'
o improve the memory footprint of RandomForest objects
substancially (by removing the weights slots from each node).
Resulta, hay una función de C en el paquete de fiesta para quitar estos pesos llamados R_remove_weights
con la siguiente definición:
SEXP R_remove_weights(SEXP subtree, SEXP removestats) {
C_remove_weights(subtree, LOGICAL(removestats)[0]);
return(R_NilValue);
}
también funciona bien:
# cc is my model object
sum(unlist(lapply(slotNames(cc), function (x) object.size(slot(cc, x)))))
# returns: [1] 2521256
save(cc, file="cc_before.RData")
.Call("R_remove_weights", [email protected], TRUE, PACKAGE="party")
# returns NULL and removes weights and node statistics
sum(unlist(lapply(slotNames(cc), function (x) object.size(slot(cc, x)))))
# returns: [1] 1521392
save(cc, file="cc_after.RData")
Como se puede ver, se reduce el tamaño del objeto subst antialmente, de aproximadamente 2.5MB a 1.5MB.
Lo que es extraño, sin embargo, es que los archivos correspondientes rdata son increíblemente enorme, y no hay impacto en ellos:
$ ls -lh cc*
-rw-r--r-- 1 user user 9.6M Aug 24 15:44 cc_after.RData
-rw-r--r-- 1 user user 9.6M Aug 24 15:43 cc_before.RData
de descomprimir el archivo muestra el objeto de ocupar casi 2,5 MB 100 MB de espacio:
$ cp cc_before.RData cc_before.gz
$ gunzip cc_before.gz
$ ls -lh cc_before*
-rw-r--r-- 1 user user 98M Aug 24 15:45 cc_before
¿Alguna idea, qué podría causar esto?
Si pudiera publicar el resultado de 'dput' en un pequeño objeto de muestra que ayudaría. Si usa 'str' puede ver si hay datos de entrenamiento almacenados en el objeto. –
Nota: Retuve la pregunta y eliminé la etiqueta de "fiesta" ya que no está bien definida en SO, ciertamente no está restringida al paquete R. Añadí administración de memoria ya que esa parece ser la principal motivación. – Iterator