gpt4 book ai didi

r - 大矩阵运行glmnet()

转载 作者:行者123 更新时间:2023-12-03 07:33:19 24 4
gpt4 key购买 nike

我在使用广泛的数据集运行glmnet套索时遇到问题。我的数据的N = 50,但所有因素均p> 49000。因此,要运行glmnet,我必须创建一个model.matrix,但是当我调用model.matrix(formula,data)时,内存就耗尽了,其中公式= Class〜。

作为一个工作示例,我将生成一个数据集:

data <- matrix(rep(0,50*49000), nrow=50)
for(i in 1:50) {
x = rep(letters[2:8], 7000)
y = sample(x=1:49000, size=49000)
data[i,] <- x[y]
}

data <- as.data.frame(data)
x = c(rep('A', 20), rep('B', 15), rep('C', 15))
y = sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)

之后,我尝试创建一个model.matrix以在glmnet上输入。
  formula <- as.formula(class ~ .)
X = model.matrix(formula, data)
model <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)

在最后一步(X = model.matrix ...),我用光了内存。我能做什么?

最佳答案

我问特雷弗·哈斯提教授,并收到以下建议:

“你好弗拉维奥

model.matrix杀死了你。
您将有49K因子,并且模型矩阵正尝试将它们表示为对比度,这将是6列矩阵,因此49 * 6约300K列。
为什么不制作二进制伪变量(每个因子7个),而直接简单地构造它而不使用model.matrix。您可以通过存储来节省空间的1/7
通过sparseMatrix(glmnet接受稀疏矩阵格式)来实现”

我确实做到了,并且工作得很好。我认为这可能对其他人有用。

出现此问题的有代码的文章:http://www.rmining.net/2014/02/25/genetic-data-large-matrices-glmnet/

为了避免链接断开,我将在此处发布部分帖子:

公式方法的问题在于,通常来说,基因组数据的列要多于观察值。我在那种情况下处理的数据有40,000列,只有73个观测值。为了创建少量测试数据,请运行以下代码:

for(i in 1:50) {
x = rep(letters[2:8], 7000)
y = sample(x=1:49000, size=49000)
data[i,] <- x[y]
}

data <- as.data.frame(data)
x <- c(rep('A', 20), rep('B', 15), rep('C', 15))
y <- sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)

因此,使用此数据集,我们将尝试使用glmnet()拟合模型:
formula <- as.formula(class ~ .)
X <- model.matrix(formula, data)
model <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)

如果您的计算机没有比我的内存更多的内存,则可能会泄漏内存并导致R崩溃。解决方案?我的第一个想法是尝试 sparse.model.matrix()使用相同的公式创建一个稀疏矩阵模型。不幸的是没有用,因为即使使用稀疏矩阵,最终模型仍然太大!有趣的是,此数据集仅从RAM占用24MB,但是当您使用model.matrix时,结果是一个大于1Gb的数组。

我发现的解决方案是建立手头的矩阵。为此,我们使用伪变量逐列对数组进行编码,并将结果存储在稀疏矩阵中。然后,我们将使用此矩阵作为模型的输入,并查看它是否不会泄漏内存:
## Creates a matrix using the first column
X <- sparse.model.matrix(~data[,1]-1)

## Check if the column have more then one level
for (i in 2:ncol(data)) {

## In the case of more then one level apply dummy coding
if (nlevels(data[,i])>1) {
coluna <- sparse.model.matrix(~data[,i]-1)
X <- cBind(X, coluna)
}
## Transform fator to numeric
else {
coluna <- as.numeric(as.factor(data[,i]))
X <- cBind(X, coluna)
}

注意:请注意我们如何使用稀疏矩阵,需要Matrix软件包。还要注意,这些列是使用cBind()而不是cbind()连接的。

这样生成的矩阵要低得多:我测试时不到70 Mb。幸运的是,glmnet()支持稀疏矩阵,您可以运行模型:
mod.lasso <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)

因此,您可以使用这种类型的数据创建模型,而不会浪费内存,也无需对大型数据集(例如 bigmemoryff)使用R包。

关于r - 大矩阵运行glmnet(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032264/

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