R

时间:2015-09-25 22:46:27

标签: r random-forest

我在R中使用randomForest模型。

对于大量的树木,我的程序需要很长时间才能完成。

在“randomForest”函数中,我可以使用“do.trace = TRUE”来查看实时进度。在R控制台上实时取样如下

ntree    OOB      1      2      3      4      5      6      7      8      9 
100:   2.31%  7.14%  2.08%  0.00%  2.25% 10.81%  0.90%  0.00%  0.00%  1.72% 
200:   1.95%  7.14%  2.08%  0.00%  2.25%  8.11%  0.00%  0.00%  0.00%  1.72% 
300:   1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 
400:   1.95%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  3.45% 
500:   1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 
600:   1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 
700:   1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 
800:   1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 
900:   1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 
1000:  1.78%  7.14%  2.08%  0.00%  1.69%  8.11%  0.00%  0.00%  0.00%  1.72% 

第一行(100:2.31%....)排在第一位。 1秒后它出现在第2排,依此类推。我想修改这个输出。

当第一行到来时,我需要从整行中仅获取“100”并且在R控制台上仅显示“100”而不是显示整行。其余行也是如此。

[我试过了sink()。但它不起作用,因为sink将完整的输出写入输出文件]

[我在randomForest函数中搜索了do.trace选项。但我迷失了自己,因为我怀疑它来自C程序;虽然我不确定。]

我想在R控制台上获取实时输出。

  

注意:我看过以下问题。

     
      
  1. https://github.com/jni/ray/issues/33
  2.   
  3. Problematic Random Forest training runtime when using formula interface
  4.   

1 个答案:

答案 0 :(得分:3)

已下载:https://cran.r-project.org/src/contrib/randomForest_4.6-10.tar.gz

当查看refRF.C的C代码时(我怀疑classRF.C,当它是分类问题时也用do.trace调用)然后跟随'jprint'标志,这是由接收到的我们看到周围R代码中的do.trace - 标志:

/* print header for running output */
    if (*jprint <= *nTree) {
    Rprintf("     |      Out-of-bag   ");
    if (*testdat) Rprintf("|       Test set    ");
    Rprintf("|\n");
    Rprintf("Tree |      MSE  %%Var(y) ");
    if (*testdat) Rprintf("|      MSE  %%Var(y) ");
    Rprintf("|\n");
    }

并且:

 /* Print running output. */
    if ((j + 1) % *jprint == 0) {
        Rprintf("%4d |", j + 1);
        Rprintf(" %8.4g %8.2f ", errb, 100 * errb / varY);
        if(*labelts == 1) Rprintf("| %8.4g %8.2f ",
                                  errts, 100.0 * errts / varYts);
        Rprintf("|\n");
    }
    mse[j] = errb;
    if (*labelts) msets[j] = errts;

将代码修剪到仅以您希望的形式发出第100个树通知的位置应该不是特别困难。