2011-11-29 6 views
6

最近データ分析にRを使い始めました。今では、大きなクエリデータセット(ASCIIモードでは1GB〜バイナリモードではラップトップの4GB RAM以上)のランキングに問題があります。エラー原因とnice溶液は、このデータセットのbigmemory::big.matrixある用いるが、gbm()又はrandomForest()アルゴリズムにおいて、そのような行列M '' を提供する:big.matrix as data.frame in R

cannot coerce class 'structure("big.matrix", package = "bigmemory")' into a data.frame 

クラス(M)はfolowingを出力:

[1] "big.matrix" 
attr(,"package") 
[1] "bigmemory" 

これらのアルゴリズムにbig.matrixインスタンスを正しく渡す方法はありますか?

+1

他のソリューションが失敗した場合は、Revolutionsを試してみてください。 'randomForest'をサポートしているかどうかは分かりませんが、大きなメモリの必要性をサポートしていると思います。たとえば、http:// www.revolutionanalytics.com/products/enterprise-big-data.phpを参照してください。それはプロプライエタリなソフトウェアであることに注意してください。無料のアカデミック版があります。 –

+1

実際に使用している 'gbm'と' randomForest'呼び出しを提供できますか?具体的には、 'randomForest'の式インターフェイスを使用していますか? – joran

答えて

11

私は明らかにあなたの規模のこの使用してデータをテストすることはできませんが、私は、各関数の式インタフェースを使用してエラーを再現できます

require(bigmemory) 
m <- matrix(sample(0:1,5000,replace = TRUE),1000,5) 
colnames(m) <- paste("V",1:5,sep = "") 

bm <- as.big.matrix(m,type = "integer") 

require(gbm) 
require(randomForest) 

#Throws error you describe 
rs <- randomForest(V1~.,data = bm) 
#Runs without error (with a warning about the response only having two values) 
rs <- randomForest(x = bm[,-1],y = bm[,1]) 

#Throws error you describe 
rs <- gbm(V1~.,data = bm) 
#Runs without error 
rs <- gbm.fit(x = bm[,-1],y = bm[,1]) 

randomForestための式インタフェースを使用しないと、かなり一般的なアドバイスです大きなデータセットの場合。非常に非効率的である可能性があります。 ?gbmと読んだ場合は、大きなデータの場合はgbm.fitに向けて同様の推奨事項が表示されます。

+0

'data.frame'を' as.big.matrix'を使って 'big.matrix'に変換できますか?変換すると、変換された 'big.matrix'の要素にアクセスできません:>> cp2006.big.matrix <-as.big.matrix(cp.2006) 警告メッセージ: as.big.matrix (cp.2006): 因子レベルの番号付けによるdata.frameの行列への強制。 >クラス(cp.2006) [1] "data.frame" >クラス(cp2006.big.matrix) [1] "big.matrix" ATTR( "パッケージ") [1]「bigmemory " > cp2006.big.matrix " big.matrix "クラスのオブジェクト スロット" address ":

2

数値オブジェクトが占めるメモリがディスク領域を超える場合がよくあります。ベクトルまたは行列の各 "double"要素は8バイトをとります。オブジェクトをdata.frameに強制するときは、RAMにコピーする必要があります。 bigmemory/big ***スイートパッケージでサポートされていない関数やデータ構造を使用しようとしないでください。 "biglm"は利用可能ですが、gbm()やrandomForest()が "big"ファミリの施設を認識して使用するとは思っていません。