我是一個正常的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的兩倍)。
R在這一點上使用1.7GB的內存,使我的總內存使用量高達7.7GB的4.3GB。
接下來我要做的事情是:
> m = train(mergem[mergef$istrain,], mergef[mergef$istrain,response], method='rf')
巴姆 - 在幾秒鐘內,在Linux外的內存殺手殺死rsession。
我可以採樣我的數據,欠採樣而不是過採樣等,但這些都是不理想的。我應該做些什麼(不同的)(不同的),重寫脫字符和我打算使用的各種模型包?我從來沒有遇到與其他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我最終做了更多次取樣(我提到的其中一個「非理想」解決方案 - 也應該包括「購買更多內存」)! – Yang
我現在能夠相當快地在350,000 x 30數據幀上使用'caret'評估3x3x3參數網格。當平行運行時(每個核心使用的內存太多),這會導致我的8GB quadcore macbook pro死機,但昨天我發現它在亞馬遜的高內存雙額外大型實例(http://aws.amazon。 com/ec2/instance-types/@作爲現場實例,價格約爲0.42美元/小時)。 – lockedoff