2015-12-18 14 views
3

Я пытаюсь преобразовать «большой» фактор в набор индикатора (т.е. фиктивная, бинарные, флаг) переменные в R, как, например:Целочисленное переполнение от многоуровневого коэффициента с помощью class.ind()?

FLN <- data.frame(nnet::class.ind(FinelineNumber)) 

где FinelineNumber является фактором 5000 уровня от Kaggle. текущий конкурс Walmart (данные общедоступны, если вы хотите воспроизвести эту ошибку).

я получаю это относительно вида предупреждения:

In n * (unclass(cl) - 1L) : NAs produced by integer overflow

памяти, доступной для системы практически неограниченно. Я не уверен, в чем проблема.

+0

Сколько строк делает ваши данные имеют ... 'FLN <- data.frame (class.ind (паста (1: 5000, «a»))) 'работает без проблем на моем старом лаппе. – user20650

+1

возможно https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/sparse.model.matrix.html полезно – user20650

+1

Я собирался согласиться с @ user20650. Это будет сложно для людей в системах с ограниченной памятью, чтобы воспроизвести это. На моем ноутбуке результаты «z <- factor (rep (1: 5000, n)); FLN <- data.frame (nnet :: class.ind (z)) 'либо либо в зависимости от' n', (1) fine; (2) очевидные ошибки относительно слишком большой матрицы или отсутствия памяти; (3) сбой моего сеанса R из-за слишком больших запросов на память –

ответ

6

Исходный код nnet::class.ind является:

function (cl)  { 
    n <- length(cl) 
    cl <- as.factor(cl) 
    x <- matrix(0, n, length(levels(cl))) 
    x[(1L:n) + n * (unclass(cl) - 1L)] <- 1 
    dimnames(x) <- list(names(cl), levels(cl)) 
    x 
} 

.Machine$integer.max является 2147483647. Если n*(nlevels - 1L) больше, чем это значение, которое должно произвести свою ошибку. Решение для n:

imax <- .Machine$integer.max 
nlevels <- 5000 
imax/(nlevels-1L) 
## [1] 429582.6 

Вы столкнулись с этой проблемой, если у вас есть 429583 или больше строк (не особенно большие для контекста данных добычи). Как уже отмечалось выше, вы сделаете намного больше с Matrix::sparse.model.matrix (или Matrix::fac2sparse), если ваша модельная структура может обрабатывать разреженные матрицы. В качестве альтернативы вам придется переписать class.ind, чтобы избежать этого узкого места (например, индексирование по строкам и столбцам, а не по абсолютному местоположению) [комментарии @joran выше, что R индексирует большие векторы с помощью значений двойной точности, поэтому вы можете уйти только с хакерством этой строки в

x[(1:n) + n * (unclass(cl) - 1)] <- 1 

возможно бросание в явном as.numeric() здесь или там, чтобы заставить принуждение удвоить ...]

Даже если вы были в состоянии выполнить этот шаг, вы бы в конечном с матрицей 5000 * 650000 - похоже, что это будет 12 ГБ.

print(650*object.size(matrix(1L,5000,1000)),units="Gb") 

Я думаю, если у вас есть 100Gb бесплатно, что может быть в порядке ...

+2

Спасибо большое; хороший ответ. Я думал, что @ user20650 ссылается на функцию 'fac2sparse' в' Matrix', поэтому я попробовал это вместо 'sparse.model.matrix', и он тоже работал очень хорошо. –