我在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控制台上获取实时输出。
注意:我看过以下问题。
答案 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个树通知的位置应该不是特别困难。