在R上对大数据进行一位有效编码的高效方法

3

我正在尝试创建我的数据的一种独热表示法。这是我的方法:

data(iris)
iris = as.data.frame(apply(iris, 2, function(x) as.factor(x)))
head(iris)

iris_ohe <- data.frame(model.matrix(~.-1, iris))
head(iris_ohe)
dim(iris_ohe)

我正在处理的数据有超过100万行,在进行编码时,会生成一个具有100多列的矩阵。这对于R来说太大了,我会耗尽内存:

Error: cannot allocate vector of size 10204.5 Gb
有没有更好的方法可以尝试?

这意味着您有太多的因素需要编码。您确定这真的是您想要做的吗? - F. Privé
3
https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/sparse.model.matrix.html - Roland
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6

尝试使用mltools::one_hot

require(mltools)
require(data.table)

n <- 1e6

df1 <- data.table( ID= seq(1:n), replicate(99, sample(0:1,n,TRUE)))

one_hot(df1)

对我来说没有内存问题,而且它几乎瞬间运行


我认为这并没有回答问题。data.table 可能会进行一些初始的内存序列化/压缩,但一旦开始进行 one hot 编码,内存就会急剧扩展。例如,我有一个包含因子列的 1GB 文件,大约有 830 个因子,一旦开始进行 one hot 编码,内存很快就会扩展到 120+ GB。真正的解决方案是使用像 Python 或甚至 awk 这样的工具将此过程作为流运行。 - Jon
它适用于 OP 规模的数据,表现良好... 如果您需要一个更有效扩展的解决方案,您可以提出一个新问题。 - Mako212
我能够轻松地写出一个解决方案,使用我在上面评论中提到的逻辑来处理我的数据大小。 - Jon

4

Matrix 包提供的 sparse.model.matrixmodel.matrix 的稀疏矩阵版本,避免了 cannot allocate vector 问题。


作为一个快速提示:sparse.model.matrix()model.matrix()不执行一位有效编码,而是创建虚拟变量。区别在于OHE为每个观察值创建一个变量,而虚拟变量则删除第一组以避免虚拟变量陷阱。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,