在R中建模一个非常大的数据集(180万行×270列)

Sri*_*thy 5 r classification bigdata

我正在使用内存为8 GBWindows 8操作系统.我有一个180万行x 270列的data.frame ,我必须执行glm.(logit /任何其他分类)

我尝试使用ff和bigglm包来处理数据.

但我仍然面临错误" Error: cannot allocate vector of size 81.5 Gb" 的问题.因此,我将行数减少到10,并在类ffdf的对象上尝试了bigglm的步骤.但是错误仍然存​​在.

任何人都可以建议我用这么多行和列构建分类模型这个问题的解决方案吗?

**EDITS**:

我在运行代码时没有使用任何其他程序.在运行代码之前系统上的RAM是60%免费的,这是因为R程序.当我终止R时,RAM 80%免费.

我正在根据评论者的建议添加一些我正在使用的专栏进行复制. OPEN_FLG是DV,其他是IDV

str(x[1:10,])
'data.frame':   10 obs. of  270 variables:
 $ OPEN_FLG                   : Factor w/ 2 levels "N","Y": 1 1 1 1 1 1 1 1 1 1    
 $ new_list_id                : Factor w/ 9 levels "0","3","5","6",..: 1 1 1 1 1 1 1 1 1 1    
 $ new_mailing_id             : Factor w/ 85 levels "1398","1407",..: 1 1 1 1 1 1 1 1 1 1    
 $ NUM_OF_ADULTS_IN_HHLD      : num  3 2 6 3 3 3 3 6 4 4    
 $ NUMBER_OF_CHLDRN_18_OR_LESS: Factor w/ 9 levels "","0","1","2",..: 2 2 4 7 3 5 3 4 2 5    
 $ OCCUP_DETAIL               : Factor w/ 49 levels "","00","01","02",..: 2 2 2 2 2 2 2 21 2 2    
 $ OCCUP_MIX_PCT              : num  0 0 0 0 0 0 0 0 0 0    
 $ PCT_CHLDRN                 : int  28 37 32 23 36 18 40 22 45 21   
 $ PCT_DEROG_TRADES           : num  41.9 38 62.8 2.9 16.9 ...    
 $ PCT_HOUSEHOLDS_BLACK       : int  6 71 2 1 0 4 3 61 0 13    
 $ PCT_OWNER_OCCUPIED         : int  91 66 63 38 86 16 79 19 93 22    
 $ PCT_RENTER_OCCUPIED        : int  8 34 36 61 14 83 20 80 7 77    
 $ PCT_TRADES_NOT_DEROG       : num  53.7 55 22.2 92.3 75.9 ...    
 $ PCT_WHITE                  : int  69 28 94 84 96 79 91 29 97 79    
 $ POSTAL_CD                  : Factor w/ 104568 levels "010011203","010011630",..: 23789 45173 32818 6260 88326 29954 28846 28998 52062 47577    
 $ PRES_OF_CHLDRN_0_3         : Factor w/ 4 levels "","N","U","Y": 2 2 3 4 2 4 2 4 2 4    
 $ PRES_OF_CHLDRN_10_12       : Factor w/ 4 levels "","N","U","Y": 2 2 4 3 3 2 3 2 2 3    
 [list output truncated]
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码示例.

require(biglm)
mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT, data = x)

require(ff)
x$id <- ffseq_len(nrow(x))
xex <- expand.ffgrid(x$id, ff(1:100))
colnames(xex) <- c("id","explosion.nr")
xex <- merge(xex, x, by.x="id", by.y="id", all.x=TRUE, all.y=FALSE)
mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT, data = xex)
Run Code Online (Sandbox Code Playgroud)

问题是我得到相同的错误" Error: cannot allocate vector of size 81.5 Gb".


请告诉我这是否足够,或者我是否应该包含有关问题的详细信息.

小智 3

我的印象是您没有使用 ffbase::bigglm.ffdf 但您想使用。也就是说,以下代码会将所有数据放入 RAM 中,并使用 biglm::bigglm.function,这不是您想要的。

require(biglm)
mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT, data = x)
Run Code Online (Sandbox Code Playgroud)

您需要使用 ffbase::bigglm.ffdf,它在 ffdf 上按块工作。因此加载导出 bigglm.ffdf 的包 ffbase。如果您使用 ffbase,则可以使用以下内容:

require(ffbase)
mymodeldataset <- xex[c("OPEN_FLG","new_list_id","NUM_OF_ADULTS_IN_HHLD","OCCUP_MIX_PCT")]
mymodeldataset$OPEN_FLG <- with(mymodeldataset["OPEN_FLG"], ifelse(OPEN_FLG == "Y", TRUE, FALSE))
mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT, data = mymodeldataset, family=binomial())
Run Code Online (Sandbox Code Playgroud)

说明:因为您不限制自己在模型中使用的列,所以您将在 RAM 中获得 xex ffdf 的所有列,这是不需要的。您在因子响应上使用高斯模型,奇怪吗?我相信您正在尝试进行逻辑回归,所以使用适当的家庭论证?它将使用 ffbase::bigglm.ffdf 而不是 biglm::bigglm.function。

如果这不起作用 - 我对此表示怀疑,那是因为 RAM 中还有其他您不知道的东西。在那种情况下就这样做。

require(ffbase)
mymodeldataset <- xex[c("OPEN_FLG","new_list_id","NUM_OF_ADULTS_IN_HHLD","OCCUP_MIX_PCT")]
mymodeldataset$OPEN_FLG <- with(mymodeldataset["OPEN_FLG"], ifelse(OPEN_FLG == "Y", TRUE, FALSE))
ffsave(mymodeldataset, file = "mymodeldataset")

## Open R again
require(ffbase)
require(biglm)
ffload("mymodeldataset")
mymodel <- bigglm(OPEN_FLG ~ new_list_id+NUM_OF_ADULTS_IN_HHLD+OCCUP_MIX_PCT, data = mymodeldataset, family=binomial())
Run Code Online (Sandbox Code Playgroud)

然后你就走吧。