假设我们有一个带有模型变量的大型data.table
对象:
library(data.table)
library(magrittr)
library(pryr)
library(caret)
df <- rnorm(10000000, 0, 1) %>% matrix(., ncol = 10) %>% as.data.table
df[,factor_vars:=LETTERS[sample(1:26, 1000000, replace = T)]]
df[,factor_vars2:=LETTERS[sample(1:5, 1000000, replace = T)]]
我正在寻找一种从数据中制作模型变量矩阵的有效方法。目前,我找到的最好方法是通过以下方式使用caret::dummyVars
:
dd_object <- dummyVars(~ -1 + V1 + V2 + V3 + V4 + V5 + V6 + V7 +
V8 + V9 + V10 + I(as.character(factor_vars)) +
I(as.character(factor_vars2)),
data = df)
请注意,这为导出和重新创建创建了非常方便的对象,而没有原始数据。
object_size(dd_object)
R> 17.3 kB
另一方面,与base::model.matrix
一样,当处理许多零时,它仍然保留matrix
对象的低效率,即:
MM1 <- predict(dd_object, newdata = df)
object_size(MM1)
R> 392 MB
object_size(df)
R> 96 MB
请注意,添加更多虚拟变量等后,大小很容易膨胀,这只是出于演示目的。
我的问题:我想对各种已知的建模包(glm
,glmnet
,xgboost
等使用相同的模型矩阵对象)。 Matrix
程序包中的稀疏矩阵表示确实听起来不错且高效,但是并不是每个程序包都可以使用它,而在这种情况下,as.matrix(.)
转换很麻烦。
我的案件有任何已知的解决方案吗?我正在寻找比基matrix
效率更高的东西(可能像稀疏矩阵),并且像model.matrix
一样能够形成可存储的caret::dummyVars
对象。
所需的工作流程可能类似于
fread %>% predict(dummyVars_object, newdata =.) %>% predict(some_Model, newdata =.)