如何提高随机森林的表现?

use*_*321 14 performance r random-forest

我的大小38 MB的训练集(12个属性与420000行).我运行下面的R代码片段,训练使用模型randomForest.这对我来说需要几个小时.

rf.model <- randomForest(
              Weekly_Sales~.,
              data=newdata,
              keep.forest=TRUE,
              importance=TRUE,
              ntree=200,
              do.trace=TRUE,
              na.action=na.roughfix
            )
Run Code Online (Sandbox Code Playgroud)

我认为,由于na.roughfix,它是需要长时间来执行.有这么多的NA's训练集中.

可能有人让我知道我怎么能提高性能?

我的系统配置是:

Intel(R) Core i7 CPU @ 2.90 GHz
RAM - 8 GB
HDD - 500 GB
64 bit OS
Run Code Online (Sandbox Code Playgroud)

smc*_*mci 51

(tl; dr是你应该a)将nodesize增加到>> 1和b)排除非常低重要性的特征列,甚至可以排除(例如)80%的列.您的问题几乎肯定不会na.roughfix,但如果您怀疑na.roughfix,在调用之前,作为独立步骤单独运行randomForest.首先让红鲱鱼脱离.)

现在,以下所有建议仅适用于您超出内存限制,因此请测量内存使用情况,并确保不超过.(从可笑的小参数开始,然后将它们放大,测量运行时间,并继续检查它不会不成比例地增加.)

影响randomForest性能的主要参数是:

  • mtry(越少越快)
  • ntrees
  • 数据中的特征 /列 - 更多是二次方更慢或更差!见下文
  • 观测/行数在数据
  • ncores(越多越快 - 只要使用并行选项)
  • 通过设置重要性= F和接近度= F(不计算邻近矩阵)来提高性能
  • 永远不要使用疯狂的默认值nodesize=1,进行分类!在Breiman的软件包中,你不能直接设置maxdepth,而是nodesize用作代理,并在下面阅读所有好的建议:CrossValidated:"关于调整随机森林的实用问题"
  • 所以这里你的数据有4.2e + 5行,如果每个节点不应小于~0.01%,试试nodesize=42.(首先尝试nodesize = 4200(1%),查看它的速度,然后重新运行,调整节点大小.根据经验确定此数据集的良好节点大小.)
  • 运行时与~2 ^ D_max成正比,即多项式为(-log1p(nodesize))
  • 您也可以使用抽样加速,参见strata,sampsize参数

然后运行时的一阶估计,表示mtry = M,ntrees = T,ncores = C,nfeatures = F,nrows = R,maxdepth = D_max,是:

Runtime proportional to: T * F^2 * (R^1.something) * 2^D_max / C
Run Code Online (Sandbox Code Playgroud)

(同样,如果超过内存,所有投注都会关闭.另外,尝试只运行一个核心,然后运行2,然后运行4并验证您实际上是否获得线性加速.而不是减速.)(大R的影响比线性更差,也许是二次的,因为树分区必须考虑数据行的所有分区;当然它比线性更糟糕.通过使用采样或索引来检查它只给它说10%的行).

提示:保持大量垃圾低重要性特征可以平方增加运行时间,从而提高准确性的次线性增加.这是因为在每个节点,我们必须考虑所有可能的特征选择(或任何数字mtry)允许.在每棵树中,我们必须考虑所有(F-choose-mtry)可能的特征组合. 所以这是我的方法,做"快速而肮脏的性能选择":

  1. 通常(慢)生成树,虽然使用理智nodesize=42或更大
  2. 看看rf $ importances或randomForest::varImpPlot().只选择前K个功能,选择K; 对于一个愚蠢的例子,选择K = 3.保存整个列表以供将来参考.
  3. 现在重新运行树,但只给它 newdata[,importantCols]
  4. 确认速度是二次加速的,并且oob.error并没有太差
  5. 一旦知道变量重要性,就可以关闭 importance=F
  6. 调整mtry和nodesize(一次调整一个),重新运行并测量速度提升
  7. 在对数轴上绘制性能结果
  8. 把结果发给我们!你证实了上述情况吗?有关内存使用的任何评论?

(注意,上面的实际特征选择不是统计上有效的过程,不要依赖它,读取randomForest包以获得基于RF的特征选择的实际正确方法.)

  • 很棒的答案,太糟糕@ user3497321再也没有回来. (4认同)