Ho creato diversi modelli di ctree (da circa 40 a 80) che voglio valutare piuttosto spesso.Come rimuovere i dati di allenamento dai modelli party ::: ctree?
Un problema è che gli oggetti del modello sono molto grandi (40 modelli richiedono più di 2,8 G di memoria) e mi sembra, che hanno memorizzato i dati di allenamento, forse come nome modello @ dati e nome modello @ risposte, e non solo le informazioni rilevanti per prevedere nuovi dati.
La maggior parte degli altri pacchetti di apprendimento R dispone di opzioni configurabili per includere i dati nell'oggetto del modello, ma non sono riuscito a trovare alcun suggerimento nella documentazione. Ho anche cercato di assegnare gli oggetti vuoti ModelEnv da
[email protected] <- new("ModelEnv")
ma non c'era alcun effetto sulle dimensioni del rispettivo file RDATA.
Qualcuno sa se Ctree memorizza realmente i dati di allenamento e come rimuovere tutti i dati dai modelli ctree che sono irrilevanti per le nuove previsioni in modo che possa adattarli a molti di essi in memoria?
Grazie mille,
Stefan
Grazie per il tuo feedback, che era già molto utile.
Ho usato dput
e str
di dare uno sguardo più approfondito l'oggetto e hanno trovato che nessun dato di formazione è incluso nel modello, ma c'è uno slot responses
, che sembra avere le etichette di formazione e rownames. Ad ogni modo, ho notato che ogni nodo ha un vettore di peso per ogni campione di allenamento. Dopo un po 'di ispezionare il codice, ho finito per googling un po' e ho trovato il seguente commento nel registro party
NEWS:
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).
Si scopre, c'è una funzione C nel pacchetto partito per rimuovere questi pesi chiamati R_remove_weights
con la seguente definizione:
SEXP R_remove_weights(SEXP subtree, SEXP removestats) {
C_remove_weights(subtree, LOGICAL(removestats)[0]);
return(R_NilValue);
}
funziona anche bene:
# 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")
Come si può vedere, si riduce la dimensione dell'oggetto subst antialmente, da circa 2,5 MB a 1,5 MB.
Ciò che è strano, però, è che i file RDATA corrispondenti sono follemente enorme, e non v'è alcun impatto su di loro:
$ 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
estrazione dal file mostra l'oggetto 2.5MB di occupare quasi 100MB di spazio:
$ 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
Qualche idea, cosa potrebbe causare questo?
Se si potesse pubblicare il risultato di 'dput' su un piccolo oggetto campione che sarebbe di aiuto. Se usi 'str' puoi vedere se ci sono dati di allenamento memorizzati nell'oggetto. –
Nota: ho riadattato la domanda e rimosso l'etichetta "party" in quanto non è ben definita su SO, certamente non limitata al pacchetto R. Ho aggiunto gestione della memoria in quanto sembra essere la motivazione principale. – Iterator