当前位置:  开发笔记 > 编程语言 > 正文

使用class.ind()从整数因子中溢出整数?

如何解决《使用class.ind()从整数因子中溢出整数?》经验,为你挑选了1个好方法。

我试图将一个"大"因子转换为R中的一组指标(即虚拟,二元,标志)变量:

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

这里FinelineNumber是从Kaggle.com目前沃尔玛大赛5000级因子(该数据是公开的,如果你想重现此错误).

我一直得到这个看起来很有意思的警告:

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

系统可用的内存基本上是无限的.我不确定问题是什么.



1> Ben Bolker..:

源代码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矩阵 - 看起来这将是12Gb.

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

我想如果你有100Gb免费可以没问题......


非常感谢; 好答案.我认为@ user20650指的是`Matrix`中的`fac2sparse`函数,所以我尝试了它而不是`sparse.model.matrix`,它也运行得很好.
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有