带有类.ind()的多级因子的整数溢出?

Integer overflow from many-leveled factor with class.ind()?

提问人:Hack-R 提问时间:12/19/2015 最后编辑:smciHack-R 更新时间:2/1/2017 访问量:133

问:

我正在尝试将一个“大”因子转换为 R 中的一组指标(即虚拟、二进制、标志)变量,如下所示:

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

其中是Kaggle.com当前沃尔玛竞赛的5,000级因子(如果您想重现此错误,则数据是公开的)。FinelineNumber

我不断收到这个令人担忧的警告:

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

系统可用的内存基本上是无限的。我不确定问题出在哪里。

整数溢出 分类数据 r 因子 nnet

评论

0赞 user20650 12/19/2015
您的数据有多少行... 在我的旧 lappie 上运行没有问题。FLN <- data.frame(class.ind(paste(1:5000, "a")))
1赞 user20650 12/19/2015
也许 stat.ethz.ch/R-manual/R-devel/library/Matrix/html/...... 是有用的
1赞 Ben Bolker 12/19/2015
我同意@user20650的观点。对于内存有限的系统的人来说,很难重现这一点。在我的笔记本电脑上,结果要么是,取决于 , (1) 很好;(2)矩阵过大或内存不足的明显错误;(3) 由于内存请求过大而使我的 R 会话崩溃z <- factor(rep(1:5000,n)); FLN <- data.frame(nnet::class.ind(z))n
1赞 Hack-R 12/19/2015
@user20650它有大约 650,000 行。它在具有 36 个内核和 100GB 可用 RAM 的服务器上运行。我将尝试稀疏矩阵函数;谢谢
2赞 joran 12/19/2015
很容易,因为你要索引矩阵,所以它涉及乘以 .5000L * 650000L

答:

6赞 Ben Bolker 12/19/2015 #1

其源代码为: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 行或更多行(对于数据挖掘上下文来说不是特别大),则会遇到此问题。如上所述,如果你的建模框架可以处理稀疏矩阵,那么使用 (或 ) 会做得更好。或者,您必须重写以避免此瓶颈(即按行和列而不是按绝对位置进行索引)[@joran上面的评论是 R 通过双精度值索引大型向量,因此您也许可以摆脱将该行破解为Matrix::sparse.model.matrixMatrix::fac2sparseclass.ind

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

可能在这里或那里抛出一个明确的信号,以迫使胁迫加倍......]as.numeric()

即使你能够完成这一步,你最终也会得到一个 5000*650000 的矩阵——看起来这将是 12Gb。

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

我想如果你有 100Gb 的免费数据,那可能没问题......

评论

2赞 Hack-R 12/19/2015
非常感谢;好答案。我以为@user20650指的是其中的功能,所以我尝试了它,它也运行得很好。fac2sparseMatrixsparse.model.matrix