Я создал несколько моделей ctree (от 40 до 80), которые я хочу оценивать довольно часто. .
Проблема в том, что объекты модели очень большие (40 моделей требуют более 2,8 ГБ памяти), и мне кажется, что они хранят обучающие данные, возможно, как имя модели @ данные и имя модели @ ответы, а не только информация, имеющая отношение к прогнозированию новых данных.
Большинство других пакетов обучения R имеют настраиваемые параметры включения данных в объект модели, но я не смог найти никаких подсказок в документации. Я также попытался назначить пустые объекты ModelEnv
modelname@data <- new("ModelEnv")
, но это не повлияло на размер соответствующего файла RData.
Кто-нибудь знает, действительно ли ctree хранит данные обучения и как удалить все данные из моделей ctree, которые не имеют отношения к новым предсказаниям, чтобы я мог уместить многие из них в памяти?
Большое спасибо,
Стефан
Спасибо за ваш отзыв, он уже оказался очень полезным.
Я использовал dput
и str
, чтобы глубже изучить объект, и обнаружил, что данные для обучения не включены в модели, но есть слот ответов
, который, кажется, имеет обучающие метки и названия. В любом случае, я заметил, что каждый узел имеет вектор веса для каждой обучающей выборки. После некоторого времени проверки кода я немного погуглил и нашел следующий комментарий в журнале 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).
Оказывается, в пакете party есть функция C для удаления этих веса называются R_remove_weights
со следующим определением:
SEXP R_remove_weights(SEXP subtree, SEXP removestats) {
C_remove_weights(subtree, LOGICAL(removestats)[0]);
return(R_NilValue);
}
Он также отлично работает:
# 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", cc@tree, 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")
Как видите, он существенно уменьшает размер объекта, примерно с 2,5 МБ до 1,5 МБ.
Что такое странно, однако, что соответствующие файлы RData безумно огромны, и это никак не повлияет на них:
$ 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
Распаковка файла показывает, что объект размером 2,5 МБ занимает почти 100 МБ пространства:
$ 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
Есть идеи, что могло вызвать это ?