gpt4 book ai didi

r - 在 R 中并行执行 glmnet

转载 作者:行者123 更新时间:2023-12-04 00:14:06 25 4
gpt4 key购买 nike

我的训练数据集有大约 200,000 条记录,我有 500 个特征。 (这些是来自零售组织的销售数据)。大多数特征是 0/1 并存储为稀疏矩阵。

目标是预测购买大约 200 种产品的概率。因此,我需要使用相同的 500 个特征来预测 200 种产品的购买概率。由于 glmnet 是模型创建的自然选择,因此我考虑为 200 个产品并行实现 glmnet。 (因为所有 200 个模型都是独立的)但我坚持使用 foreach。我执行的代码是:

foreach(i = 1:ncol(target)) %dopar%
{
assign(model[i],cv.glmnet(x,target[,i],family="binomial",alpha=0,type.measure="auc",grouped=FALSE,standardize=FALSE,parallel=TRUE))
}

模型是一个列表 - 有 200 个模型名称的列表,我想在其中存储相应的模型。

以下代码有效。但它没有利用并行结构,大约需要一天才能完成!
for(i in 1:ncol(target))
{ assign(model[i],cv.glmnet(x,target[,i],family="binomial",alpha=0,type.measure="auc",grouped=FALSE,standardize=FALSE,parallel=TRUE))
}

有人可以指出我在这种情况下如何利用并行结构吗?

最佳答案

为了并行执行“cv.glmnet”,你必须指定 parallel=TRUE选项,并注册一个 foreach 并行后端。这允许您选择最适合您的计算环境的并行后端。

这是 cv.glmnet 手册页中“并行”参数的文档:

parallel: If 'TRUE', use parallel 'foreach' to fit each fold. Must register parallel before hand, such as 'doMC' or others. See the example below.



下面是一个使用 doParallel 包的例子,它适用于 Windows、Mac OS X 和 Linux:
library(doParallel)
registerDoParallel(4)
m <- cv.glmnet(x, target[,1], family="binomial", alpha=0, type.measure="auc",
grouped=FALSE, standardize=FALSE, parallel=TRUE)

这个对 cv.glmnet 的调用将使用四个工作线程并行执行。在 Linux 和 Mac OS X 上,它将使用“mclapply”执行任务,而在 Windows 上它将使用“clusterApplyLB”。

嵌套并行性变得棘手,如果只有 4 个 worker ,可能不会有太大帮助。我会尝试在 cv.glmnet 周围使用普通的 for 循环(如您的第二个示例中所示),并注册了一个并行后端,并在添加另一个并行级别之前查看性能。

另请注意,当您注册并行后端时,第一个示例中对“模型”的分配将不起作用。当并行运行时,副作用通常会被丢弃,就像大多数并行编程包一样。

关于r - 在 R 中并行执行 glmnet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21698435/

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