gpt4 book ai didi

R 内存管理建议(插入符号、模型矩阵、数据框)

转载 作者:行者123 更新时间:2023-12-04 14:18:22 26 4
gpt4 key购买 nike

我在机器学习环境中处理相当小的数据集的普通 8GB 服务器上内存不足:

> dim(basetrainf) # 这是一个数据框
[1] 58168 118

我采取的唯一显着增加内存消耗的预建模步骤是将数据帧转换为模型矩阵。这是因为 caret , cor等仅适用于(模型)矩阵。即使去除了多层次的因素,矩阵(下面的 mergem)还是相当大的。 ( sparse.model.matrix/Matrix 总体上支持很差,所以我不能使用它。)

> lsos()
类型大小 PrettySize Rows Columns
合并矩阵 879205616 838.5 Mb 115562 943
trainf 数据框 80613120 76.9 Mb 106944 119
内部训练矩阵 76642176 73.1 Mb 907 10387
合并数据帧 58264784 55.6 Mb 115562 75
dfbase 数据框架 48031936 45.8 Mb 54555 115
basetrainf 数据框架 40369328 38.5 Mb 58168 118
df2 数据框 34276128 32.7 Mb 54555 103
tf 数据框 33182272 31.6 Mb 54555 98
m.gbm 火车 20417696 19.5 Mb 16 NA
res.glmnet 列表 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')

Bam - 几秒钟后,Linux 内存不足杀手会杀死 rsession。

我可以对我的数据进行采样、欠采样而不是过采样等,但这些都不理想。除了重写插入符号和我打算使用的各种模型包之外,我还应该做什么(其他)?

FWIW,我从未在其他 ML 软件(Weka、Orange 等)上遇到过这个问题,即使没有删除我的任何因素,也许是因为所有模型中的示例权重和“数据框架”支持。

完整脚本如下:

图书馆(插入符号)
图书馆(矩阵)
图书馆(doMC)
注册DoMC(2)

响应 = '类'

repr = '虚拟'
do.impute = F

xmode = 函数(xs) 名称(which.max(table(xs)))

read.orng = 函数(路径){
# 读取标题
hdr = strsplit(readLines(path, n=1), '\t')
对 = sapply(hdr, function(field) strsplit(field, '#'))
名称 = sapply(pairs, function(pair) pair[2])
类 = sapply(对,函数(对)
if (grepl('C', pair[1])) '数字' else '因子')

# 读取数据
dfbase = read.table(path, header=T, sep='\t', quote='', col.names=names, na.strings='?', colClasses=classes, comment.char='')

# 切换响应,删除元列
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)
列表(m=m,ps=ps,perf=perf)
}

# 从
sparse.cor = 函数(x){
内存限制(大小= 10000)
n 200 级')
badfactors = sapply(mergef, function(x)
is.factor(x) && (nlevels(x) 200))
mergef = mergef[, -which(badfactors)]

print('删除接近零的方差预测变量')
mergef = mergef[, -nearZeroVar(mergef)]

打印('创建模型矩阵,使一切都成为数字')
if (repr == 'dummy') {
傻瓜 = dummyVars(as.formula(paste(response, '~ .')), mergef)
合并=预测(傻瓜,新数据=合并)
} 别的 {
mat = if (repr == 'sparse') model.matrix else sparse.model.matrix
mergem = mat(as.formula(paste(response, '~ .')), data=mergef)
# 删除拦截列
合并=合并[,-1]
}

print('删除高相关预测变量')
merge.cor = (if (repr == 'sparse') sparse.cor else cor)(mergem)
合并 = 合并 [, -findCorrelation(merge.cor, cutoff=.75)]

print('尝试几种不同的方法')
do.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')

最佳答案

有了这么多数据,重采样误差估计和随机森林 OOB 误差估计应该非常接近。尝试使用 trainControl(method = "OOB")train()将不适合重新采样的数据集上的额外模型。

另外,避免像瘟疫一样的公式界面。

您也可以尝试装袋。由于在每次吐出时没有随机选择预测变量,因此您可以通过 50-100 次重新采样获得良好的结果(而不是随机森林需要更多才能有效)。

其他人可能不同意,但我也认为对您拥有的所有数据进行建模并不总是最好的方法。除非预测器空间很大,否则许多数据点将与其他数据点非常相似,并且对模型拟合的贡献不大(除了额外的计算复杂性和结果对象的足迹)。 caret有一个名为 maxDissim 的函数这可能有助于细化数据(尽管它也不是非常有效)

关于R 内存管理建议(插入符号、模型矩阵、数据框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6449588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com