big.matrix как data.frame в R - PullRequest
       59

big.matrix как data.frame в R

6 голосов
/ 29 ноября 2011

Я недавно начал использовать R для анализа данных.Теперь у меня проблема с ранжированием большого набора данных запросов (~ 1 ГБ в режиме ASCII, по сравнению с 4 ГБ ОЗУ моего ноутбука в двоичном режиме).Использование bigmemory::big.matrix для этого набора данных является хорошим решением, но предоставление такой матрицы 'm' в алгоритмах gbm() или randomForest() вызывает ошибку:

cannot coerce class 'structure("big.matrix", package = "bigmemory")' into a data.frame

class (m) выводит следующее:

[1] "big.matrix"
attr(,"package")
[1] "bigmemory"

Есть ли способ правильно передать экземпляр big.matrix в эти алгоритмы?

Ответы [ 2 ]

11 голосов
/ 29 ноября 2011

Я, очевидно, не могу проверить это, используя данные вашей шкалы, но я могу воспроизвести ваши ошибки, используя интерфейс формулы каждой функции:

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 и для больших данных.

2 голосов
/ 29 ноября 2011

Часто бывает так, что память, занятая числовыми объектами, больше, чем дисковое пространство. Каждый «двойной» элемент в векторе или матрице занимает 8 байтов. Когда вы приводите объект к data.frame, его, возможно, необходимо скопировать в RAM. Вы должны избегать использования функций и структур данных, которые не поддерживаются пакетом bigmemory / big ***. "biglm" доступен, но я сомневаюсь, что вы можете ожидать, что gbm () или randomForest () будут распознавать и использовать средства семейства "big".

...