gpt4 book ai didi

r - 使用 class.ind() 的多级因子的整数溢出?

转载 作者:行者123 更新时间:2023-12-01 10:36:35 26 4
gpt4 key购买 nike

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

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

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

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

在 n * (unclass(cl) - 1L) 中:整数溢出产生的 NA

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

最佳答案

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 通过 double 值索引大向量, 所以你也许可以通过破解那条线来逃脱

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

可能在此处或此处输入显式 as.numeric() 以强制强制加倍 ...]

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

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

我想如果您有 100Gb 的免费空间就可以了...

关于r - 使用 class.ind() 的多级因子的整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34363153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com