私は機械学習の文脈ではかなり小さなデータセットを扱う通常の8GBのサーバー上のメモリが不足しています:Rのメモリ管理のアドバイス(キャレット、モデル行列、データフレーム)
> dim(basetrainf) # this is a dataframe [1] 58168 118
だけ前モデリングステップは、データフレームをモデル行列に変換することでメモリ消費を大幅に増加させます。これはcaret
、cor
などは(モデル)マトリックスでのみ動作します。多くのレベルの因子を除去した後でさえ、マトリックス(mergem
)はかなり大きい。 (sparse.model.matrix
/Matrix
はほとんど一般的にサポートされているので、私はそれを使用することはできません。)
> lsos() Type Size PrettySize Rows Columns mergem matrix 879205616 838.5 Mb 115562 943 trainf data.frame 80613120 76.9 Mb 106944 119 inttrainf matrix 76642176 73.1 Mb 907 10387 mergef data.frame 58264784 55.6 Mb 115562 75 dfbase data.frame 48031936 45.8 Mb 54555 115 basetrainf data.frame 40369328 38.5 Mb 58168 118 df2 data.frame 34276128 32.7 Mb 54555 103 tf data.frame 33182272 31.6 Mb 54555 98 m.gbm train 20417696 19.5 Mb 16 NA res.glmnet list 14263256 13.6 Mb 4 NA
をまた、多くのRモデルは例の重みをサポートしていないので、私は倍増し、最初のオーバーサンプルに少数のクラスを持っていました私のデータセットのサイズ(trainf、mergef、mergemがbasetrainfの2倍の行数を持つ理由)
Rはこの時点で1.7GBのメモリを使用しているため、私の合計メモリ使用量は7.7GBのうち4.3GBまでになります。
私は次のことは、次のとおりです。
> m = train(mergem[mergef$istrain,], mergef[mergef$istrain,response], method='rf')
バム - 数秒で、Linuxのメモリ不足キラーはrsessionを殺します。
データをサンプリングすることはできますが、オーバーサンプルの代わりにアンダーサンプルなどがありますが、これは理想的ではありません。キャレットの書き換えや、使用しようとしているさまざまなモデルパッケージが不足していますか?
FWIWは、他のMLソフトウェア(Weka、Orangeなど)でこの問題に遭遇したことはありません。おそらく例の重み付けと「データフレーム」の両方のサポートが原因で、すべてのモデル。
完全なスクリプトは次のとおりです。
library(caret) library(Matrix) library(doMC) registerDoMC(2) response = 'class' repr = 'dummy' do.impute = F xmode = function(xs) names(which.max(table(xs))) read.orng = function(path) { # read header hdr = strsplit(readLines(path, n=1), '\t') pairs = sapply(hdr, function(field) strsplit(field, '#')) names = sapply(pairs, function(pair) pair[2]) classes = sapply(pairs, function(pair) if (grepl('C', pair[1])) 'numeric' else 'factor') # read data dfbase = read.table(path, header=T, sep='\t', quote='', col.names=names, na.strings='?', colClasses=classes, comment.char='') # switch response, remove meta columns df = dfbase[sapply(pairs, function(pair) !grepl('m', pair[1]) && pair[2] != 'class' || pair[2] == response)] df } train.and.test = function(x, y, trains, method) { m = train(x[trains,], y[trains,], method=method) ps = extractPrediction(list(m), testX=x[!trains,], testY=y[!trains,]) perf = postResample(ps$pred, ps$obs) list(m=m, ps=ps, perf=perf) } # From sparse.cor = function(x){ memory.limit(size=10000) n 200 levels') badfactors = sapply(mergef, function(x) is.factor(x) && (nlevels(x) 200)) mergef = mergef[, -which(badfactors)] print('remove near-zero variance predictors') mergef = mergef[, -nearZeroVar(mergef)] print('create model matrix, making everything numeric') if (repr == 'dummy') { dummies = dummyVars(as.formula(paste(response, '~ .')), mergef) mergem = predict(dummies, newdata=mergef) } else { mat = if (repr == 'sparse') model.matrix else sparse.model.matrix mergem = mat(as.formula(paste(response, '~ .')), data=mergef) # remove intercept column mergem = mergem[, -1] } print('remove high-correlation predictors') merge.cor = (if (repr == 'sparse') sparse.cor else cor)(mergem) mergem = mergem[, -findCorrelation(merge.cor, cutoff=.75)] print('try a couple of different methods') do.method = function(method) { train.and.test(mergem, mergef[response], mergef$istrain, method) } res.gbm = do.method('gbm') res.glmnet = do.method('glmnet') res.rf = do.method('parRF')
ソフトウェアを切り替えることになったのか、Rで解決したのですか?あなたのより有望なアプローチのいくつかが私が似たような問題を抱えていることを聞くことに興味があります。私は、より高性能なEC2マシンを使うつもりです。なぜなら、それらは便利で、私はRを非常によく知っているからです(他のソリューションを実装する必要があるまで)。 – lockedoff
@lockedoff私は、より多くのサブサンプリング(私が言及した「理想的でない」ソリューションの1つです。 – Yang
私は今、350,000 x 30のデータフレームで 'キャレット 'を使って3x3x3のパラメータグリッドをかなり素早く評価できるようになりました。これは私の8GBクアッドコアのMacbook Proを並列で実行すると(それぞれのコアが多すぎるメモリを使用していた)、昨日私はAmazonのHigh-Memory Double Extra Large Instance(http://aws.amazon。 com/ec2/instance-types/@をスポットインスタンスとして約$ 0.42 /時間で提供しています)。 – lockedoff