6

私は8 GB の RAM を搭載したWindows 8 OS で作業しています。glm を実行する必要がある180 万行 x 270 列の data.frame があります。(ロジット/その他の分類)

データの処理に 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]

そして、これは私が使用しているコードの例です。

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)

問題は、同じエラー " Error: cannot allocate vector of size 81.5 Gb" が発生することです。


これで十分か、それとも問題の詳細をこれ以上含める必要があるかをお知らせください。

4

1 に答える 1

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)

ffdf でチャンク単位で動作する ffbase::bigglm.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())

説明: モデルで使用する列に限定しないため、必要のない xex ffdf のすべての列を RAM に取得します。因子応答にガウス モデルを使用していましたが、奇妙ですか? あなたはロジスティック回帰を行おうとしていたと思いますが、適切な家族の引数を使用してください。また、biglm::bigglm.function ではなく、ffbase::bigglm.ffdf を使用します。

それがうまくいかない場合 - 私は疑っていますが、それはあなたが気づいていない他のものを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())

そして、あなたは行き​​ます。

于 2013-06-25T12:45:00.097 に答える