将 .combine 与 cforest 一起使用时遇到问题

Posted

技术标签:

【中文标题】将 .combine 与 cforest 一起使用时遇到问题【英文标题】:Trouble using .combine with cforest 【发布时间】:2013-03-20 12:47:28 【问题描述】:

您好,我在 R 中并行化 cforest 时遇到问题。

我一直在尝试使用 party 包中的 cforest 函数创建分类模型。我希望它在我的计算机上的多个内核中并行运行。我已经使用 randomForest 算法结合 .combineforeach 成功地做到了这一点:

    library(doParallel)
    library(foreach)
    library(randomForest)
    library(party)        
    cl <- (5)
    registerDoParallel(cl)        
    set.seed(1234)
    abs_pos_dat_all <- read.csv('all_abs_pos_predictors_3_20_13_for_R.txt');
    abs_pos_dat <- abs_pos_dat_all[1:10000,]
    train_test_indices <- sample(2,nrow(abs_pos_dat), replace=TRUE, prob=c(.7,.3));
    ref_polarity_dat <- read.table('ref_polarity_3_20_13_for_R.txt');
    ref_polarity_dat <- factor(ref_polarity_dat[1:10000,])
    ref_polarity_train <- ref_polarity_dat[train_test_indices==1]
abs_pos_train[,1] <- ordered(abs_pos_train[,1], labels = c("Buried","Part buried","Exposed"))
abs_pos_train[,2] <- ordered(abs_pos_train[,2], labels = c("Helix","Strand","Other"))
Flank_FA_labels <- c("bur bur","bur part","part part","bur exp","part exp", "exp exp")
Flank_Struc_labels <- c("helix helix","helix strand","strand strand","helix other","strand other", "other other")
Flank_Polarity_labels <- c("polar polar", "polar nonpolar", "non polar non polar" )

    for(i in 1:length(Flank_FA_labels))
        abs_pos_train[,i] <- ordered(abs_pos_train[,2+i], labels = Flank_FA_labels) 
        abs_pos_train[,8+i] <- ordered(abs_pos_train[,8+i], labels = Flank_Polarity_labels)
        abs_pos_train[,14+i] <- ordered(abs_pos_train[,14+i], labels = Flank_Struc_labels)
    

   colnames(abs_pos_train) <- c("ref_FA", "ref_struc", "Np1Flank_FA", "Np2Flank_FA", "Np3Flank_FA", "Np4Flank_FA", "Np5Flank_FA", "Np6Flank_FA", "Np1Flank_Struc", "Np2Flank_Struc", "Np3Flank_Struc", "Np4Flank_Struc", "Np5Flank_Struc", "Np6Flank_Struc", "Np1Flank_P_NP","Np2Flank_P_NP", "Np3Flank_P_NP", "Np4Flank_P_NP", "Np5Flank_P_NP", "Np6Flank_P_NP")


    abs_pos_random_forest <<- foreach(ntree=rep(100, 5), .combine=combine, .packages='randomForest') %dopar%  randomForest(ref_polarity_train~.,data = abs_pos_train, ntree=ntree)

但是,当我使用与 cforest 相同的语法时,我收到以下错误:

    abs_pos_inference_random_forest <<- foreach(ntree=rep(20, 6), 
    .combine=combine , .packages='party') %dopar%  cforest(ref_polarity_train~.,
    data = abs_pos_train, controls = cforest_unbiased(ntree=ntree, mtry = 1))
    error calling combine function:
    <simpleError in fun(result.1, result.2): 
    Argument must be a list of randomForest objects>

我不明白为什么 .combine 正在寻找 randomForest 对象而不是 cforest 对象,或者至少为什么 .combine 不能自动识别正在组合的对象,如果它们都是单个函数的输出。

【问题讨论】:

【参考方案1】:

你会得到同样的错误信息执行:

library(randomForest)
combine(1,2,3)

大概是加载了randomForest包,所以randomForestcombine函数通过.combine选项传递给foreach。如果combine 是具有由 randomForest 和 party 定义的方法的通用函数,那么它可能会按您的预期工作。但这不是通用的。它只是 randomForest 包中定义的常规函数​​,foreach 尽职尽责地调用了它。

我对party包不是很熟悉,所以不知道里面有没有等价的功能。

【讨论】:

我明白了。这很有道理。我目前正在研究从 cforest 包中组合森林并行计算的替代方法。谢谢! @IanBorukhovich 你好,我也在找那个。请问你有什么发现吗? @StéphaneLaurent 我最终使用 matlab 然后使用决策树,我编写了一些自定义代码来并行处理运行树和收集元数据。

以上是关于将 .combine 与 cforest 一起使用时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Path.Combine 如何与两个以上的参数一起使用?

如何在 R(party-package)中绘制 cForest 的学习曲线?

将 Just 与 flatMap 一起使用会产生失败不匹配。结合

R语言使用party包中的cforest函数基于条件推理决策树(Conditional inference trees)构建随机森林使用varimp函数查看特征重要度使用table函数计算混淆矩阵

R语言ggplot2可视化将两个dataframe可视化的结果组合在一起实战:combining two plots from different data.frames

如何在 Swift Combine 中创建自定义链?