big.matrix как data.frame in r
-
25-10-2019 - |
Вопрос
Я недавно начал использовать R для анализа данных. Теперь у меня есть проблема в рейтинге большого набора данных запросов (~ 1 ГБ в режиме ASCII, над 4 ГБ оперативной памяти моего ноутбука в двоичном режиме). С использованием bigmemory::big.matrix
Для этого набора данных является хорошее решение, но предоставление такой матрицы «M» в gbm()
или же randomForest()
Алгоритмы вызывает ошибку:
cannot coerce class 'structure("big.matrix", package = "bigmemory")' into a data.frame
Класс (M) выводит фологу:
[1] "big.matrix"
attr(,"package")
[1] "bigmemory"
Есть ли способ правильно пройти big.matrix
экземпляр в эти алгоритмы?
Решение
Я, очевидно, не могу проверить это, используя данные вашего масштаба, но я могу воспроизводить ваши ошибки, используя интерфейс формулы каждой функции:
require(bigmemory)
m <- matrix(sample(0:1,5000,replace = TRUE),1000,5)
colnames(m) <- paste("V",1:5,sep = "")
bm <- as.big.matrix(m,type = "integer")
require(gbm)
require(randomForest)
#Throws error you describe
rs <- randomForest(V1~.,data = bm)
#Runs without error (with a warning about the response only having two values)
rs <- randomForest(x = bm[,-1],y = bm[,1])
#Throws error you describe
rs <- gbm(V1~.,data = bm)
#Runs without error
rs <- gbm.fit(x = bm[,-1],y = bm[,1])
Не используя интерфейс формулы для randomForest
является довольно распространенным советом для больших наборов данных; Это может быть довольно неэффективным. Если вы читаете ?gbm
, вы увидите аналогичную рекомендацию, направленную на вас к gbm.fit
Для больших данных.
Другие советы
Часто относится к тому, что память, занятая числовыми объектами, является больше, чем пространство диска. Каждый «двойной» элемент в векторе или матрице занимает 8 байтов. Когда вы заставляете объект в Data.Frame, его может быть скопировано в оперативной памяти. Вы должны избегать попыток использовать функции и структуры данных, которые находятся за пределами тех, которые поддерживаются BigMemory/Big *** набором пакетов. «Biglm» доступен, но я сомневаюсь, что вы можете ожидать, что gbm () или randomforest () будет распознавать и использовать средства в «Большом»-семье.