在 R 中对具有多个级别的列进行虚拟编码

数据挖掘 r 回归 分类数据
2021-10-05 19:38:31

我有一个因变量来衡量净收入。影响这一点的主要预测因素之一是“产品”,即出售给客户的产品。我的随机抽样数据集包含 140 万个条目。

产品被分配了一个特定的分类值。我觉得使用虚拟变量来表示产品会很贴切,但是产品有 4481 个级别。我不知道如何在 R 中编写这么多级别的代码。

model.matrix(~ product, data=salesdata) 返回错误。(需要 38.4GB 内存)

有人可以指导我如何对这些分类变量进行编码吗?


相关:净收入(定量) 独立:产品代码(定量但被视为定性,因为值是名义上的)

2个回答

您可以使用稀疏矩阵或特征散列。

稀疏矩阵

我想使用稀疏矩阵是唯一的选择。我怀疑这行代码会起作用。这使用了Matrix包。

sparseProducts <- sparse.model.matrix(~ product, data=salesdata)

以我为例:

sparseDiagonalMatrix <- sparse.model.matrix(~., data.frame(V1 = as.factor(seq(1, 10))))

每列代表一个不同的因素,这将产生:

1  1 . . . . . . . . .
2  1 1 . . . . . . . .
3  1 . 1 . . . . . . .
4  1 . . 1 . . . . . .
5  1 . . . 1 . . . . .
6  1 . . . . 1 . . . .
7  1 . . . . . 1 . . .
8  1 . . . . . . 1 . .
9  1 . . . . . . . 1 .
10 1 . . . . . . . . 1

> class(sparseDiagonalMatrix)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

或者,您可以删除截距并让全零代表第 1 类

sparseDiagonalMatrix <- sparse.model.matrix(~., data.frame(V1 = as.factor(seq(1, 10))))[, -1, drop=FALSE]

10 x 9 sparse Matrix of class "dgCMatrix"
V12 V13 V14 V15 V16 V17 V18 V19 V110
1    .   .   .   .   .   .   .   .    .
2    1   .   .   .   .   .   .   .    .
3    .   1   .   .   .   .   .   .    .
4    .   .   1   .   .   .   .   .    .
5    .   .   .   1   .   .   .   .    .
6    .   .   .   .   1   .   .   .    .
7    .   .   .   .   .   1   .   .    .
8    .   .   .   .   .   .   1   .    .
9    .   .   .   .   .   .   .   1    .
10   .   .   .   .   .   .   .   .    1

> class(sparseDiagonalMatrix)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

不过,您将需要一个支持稀疏矩阵的软件包来衡量净收入。幸运的是,大多数现代主流软件包都支持稀疏矩阵。

特征散列

这是对 R 中的特征散列(以及其他技术)的一个很好的解释,这也是一种替代方法,当您拥有数十万或数百万个多个级别时特别有用。

https://amunategui.github.io/feature-hashing/

在大多数情况下,R 中构建的模型(例如,使用 的线性回归lm)可以处理编码为的分类数据,factor并且不需要任何虚拟编码。您只需要在将数据传递给之前执行此操作lm

salesdata$product <- factor(salesdata$product)

因此,根据您要构建的模型,您可能不需要创建虚拟变量。