首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R dismo::gbm.step参数并行选择函数

R dismo::gbm.step参数并行选择函数
EN

Stack Overflow用户
提问于 2015-04-26 04:03:29
回答 1查看 1.2K关注 0票数 2

我有一个编码来优化并行处理的工作函数(希望如此)。我仍然不是最精通R,特别是函数和迭代。

我希望有人能帮助我优化我编写的函数以及额外的代码,以帮助计算时间和完全优化并行处理选项。

特别是使用%do%%dopar%,并在函数中移动附加的代码和并行处理函数。我似乎无法让%dopar%工作,我也不确定这是否是我的代码、R版本或冲突库的问题。

对于如何以更有效的方式取得同样的结果,我将不胜感激。

背景:

我正在使用dismo::gbm.step构建gbm模型。gbm.step通过k次交叉验证选择最优树数.然而,树的复杂度和学习速率的参数还需要设置。我知道caret::train是专门为这个任务构建的,我学习了很多关于caret的乐趣,特别是它的自适应重采样功能。但是,我的响应是二项式的,caret没有选择返回二项分布的AUC;我想使用AUC来复制在我的领域(生态学)发表的类似研究。

我还将在后面的分析中使用dismo::gbm.simplify来确定可能的简化模型。gbm.simplify依赖于在dismo中构建模型时创建的数据,而我无法让它在caret构建的模型上工作。

最后,生态学方面的大多数gbm文献都采用了Elith等人所描述的方法。2008年的"提高回归树的工作指南",这是快速公交在dismo功能的基础上。为了本研究的目的,我想继续使用dismo来构建gbm模型。

我编写的函数测试tree.complexitylearning.rate的几个组合,并返回每个模型的几个性能指标的列表。然后,为了便于排序,我将所有的lists组合成一个data.frame

函数目标

  1. tree.complexitylearning.rate的每一次迭代中创建一个learning.rate模型。
  2. 为创建的每个$self.statistics$discrimination模型将cv.statistics$discrimination.meanself.statistics$mean.residcv.statistics$deviance.mean存储在list中。
  3. 删除每个gbm模型以节省空间。
  4. 将每个列表合并成一种便于排序的格式。然后删除每个列表。
  5. 以优化并行处理以及减少计算时间和所用内存的方式进行上述所有操作。

使用来自包的Anguilla_train数据集的可重复示例

代码语言:javascript
复制
#Load libraries
require(pacman)
p_load(gbm, dismo, TeachingDemos, foreach, doParallel, data.table) 

data(Anguilla_train)

#Identify cores on current system
cores<-detectCores(all.tests = FALSE, logical = FALSE)
cores

#Create training function for gbm.step
step.train.fx=function(tree.com,learn){
  #set seed for reproducibility
  char2seed("StackOverflow", set = TRUE)
  k1<-gbm.step(data=Anguilla_train, 
               gbm.x = 3:13, 
               gbm.y = 2,
               family = "bernoulli", 
               tree.complexity = tree.com,
               learning.rate = learn,
               bag.fraction = 0.7,
               prev.stratify=TRUE,
               n.folds=10,
               n.trees=700,
               step.size=25,
               silent=TRUE,
               plot.main = FALSE,
               n.cores=cores)

  k.out=list(interaction.depth=k1$interaction.depth,
             shrinkage=k1$shrinkage,
             n.trees=k1$n.trees,
             AUC=k1$self.statistics$discrimination,
             cv.AUC=k1$cv.statistics$discrimination.mean,
             deviance=k1$self.statistics$mean.resid,
             cv.deviance=k1$cv.statistics$deviance.mean)  
  return(k.out)
}

#define complexity and learning rate
tree.complexity<-c(1:5)
learning.rate<-c(0.01,0.025,0.005,0.0025,0.001)

#setup parallel backend to use n processors
cl<-makeCluster(cores)
registerDoParallel(cl)

#Run the actual function
foreach(i = tree.complexity) %do% {
  foreach(j = learning.rate) %do% {
    nam=paste0("gbm_tc",i,"lr",j)
    assign(nam,step.train.fx(tree.com=i,learn=j))

  }
}

#Stop parallel
stopCluster(cl)
registerDoSEQ()

#disable scientific notation
options(scipen=999)

#Find all item in workspace that contain "gbm_tc"
train.all<-ls(pattern="gbm_tc")

#cbind each list that contains "gbm_tc"
train.results<-list(do.call(cbind,mget(train.all)))

#Place in a data frame
train.results<- do.call(rbind, lapply(train.results, rbind))
train.results <- data.frame(matrix(unlist(train.results),ncol=7 , byrow=T))

#Change column names
colnames(train.results)<-c("TC","LR","n.trees", "AUC", "cv.AUC", "dev", "cv.dev")

#Round 4:7
train.results[,4:7]<-round(train.results[,4:7],digits=3)

#Sort by cv.dev, cv.AUC, AUC
train.results<-train.results[order(train.results$cv.dev,-train.results$cv.AUC, -train.results$AUC),]

train.results
EN

回答 1

Stack Overflow用户

发布于 2017-03-01 21:52:16

我还在努力想办法自己做这件事,而你已经比我做得更深入了!我想到的一件事是,问题可能在嵌套的%do%中?作为一种测试,为什么不尝试%dopar%只用于j,或者看看是否可以将j & k矩阵折叠成一个单一的向量,是否可以将包含两个项的排列的列表传递给gbm.step?例如。

代码语言:javascript
复制
tree.complexity = i[1],
learning.rate = i[2],

如果你成功了,请告诉我!

编辑:另外,另一种可能的途径是来自%:%这里

代码语言:javascript
复制
foreach(tree.com = 1:5) %:% foreach(learn = c(0.01,0.025,0.005,0.0025,0.001)) %dopar% {
gbm.step ... return(list(...))}

如果将tree.com & learn添加到列表中,则可能会显示出这些值的一个很好的矩阵。另一种选择:

代码语言:javascript
复制
foreach(tree.com = 1:5, learn = c(0.01,0.025,0.005,0.0025,0.001) %dopar% {
    gbm.step ... return(list(...))}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29873577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档