我有一个大小为38 MB的训练集(带有420000行的12个属性)。我正在运行下面的R代码段,以使用randomForest训练模型。这对我来说要花几个小时。

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


我认为,由于na.roughfix,执行时间很长。训练集中有很多NA's

有人可以让我知道如何改善性能吗?

我的系统配置是:

Intel(R) Core i7 CPU @ 2.90 GHz
RAM - 8 GB
HDD - 500 GB
64 bit OS

最佳答案

(tl; dr是您应该a)将节点大小增加到>> 1,并且b)排除非常不重要的要素列,甚至可以排除(说)80%的列。您的问题几乎肯定不是na.roughfix,但是如果您怀疑是这样,请在调用na.roughfix之前将randomForest作为独立步骤单独运行。首先将红色鲱鱼移开。)

现在,以下所有建议仅在您耗尽内存限制之前适用,因此请测量内存使用量,并确保未超过。 (从令人难以置信的小参数开始,然后按比例放大它们,测量运行时间,并不断检查它的增加是否不成比例。)

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


mtry(越少速度越快)

数据中功能/列的数量-更多的数量变慢,或更糟!见下文
数据观察/行数
ncores(越多速度越快-只要使用了并行选项)
通过设置重要性= F和接近度= F可以提高性能(不计算接近度矩阵)
永远不要使用疯狂的默认nodesize=1进行分类!在Breiman的软件包中,您不能直接设置maxdepth,但是可以使用nodesize作为其代理,还可以在以下位置阅读所有好的建议:CrossValidated: "Practical questions on tuning Random Forests"
因此,这里的数据有4.2e + 5行,然后,如果每个节点的大小都不应小于〜0.1%,请尝试nodesize=42。 (首先尝试nodesize = 420(1%),查看它的速度,然后重新运行,向下调整nodesize。根据经验确定此数据集的合适nodesize。)
运行时间与〜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


(同样,如果超出内存,所有赌注都将取消。此外,请尝试仅在一个内核上运行,然后在2个内核上运行,然后在4个内核上运行,并验证您确实确实获得了线性加速。而不是减速。)
(大的R的影响比线性的要差,也许是二次的,因为树分区必须考虑数据行的所有分区;当然,它比线性的要差一些。通过使用采样或索引仅给出10%行)。

提示:保留大量废话不重要的功能,可二次增加运行时间,从而使精度亚线性增加。这是因为在每个节点上,我们必须考虑所有可能的特征选择(或mtry允许的任何数字)。在每棵树中,我们必须考虑所有(F-选择-mtry)可能的特征组合。
因此,这是我的方法,执行“快速而肮脏的性能选择”:


尽管使用合理的nodesize=42或更大的值,但通常会生成树(缓慢)
查看rf $ importances或randomForest::varImpPlot()。仅选择top-K功能,然后在其中选择K;例如,选择K = 3。保存整个列表以备将来参考。
现在重新运行树,但只给它newdata[,importantCols]
确认速度是平方的,并且oob.error不会更糟
一旦知道了变量的重要性,就可以关闭importance=F
调整mtry和节点大小(一次调整一个),重新运行并衡量速度提高
在对数轴上绘制性能结果
将结果发布给我们!您是否证实了上述观点?关于内存使用有何评论?


(请注意,以上对于实际的特征选择不是一个统计有效的过程,请不要依赖于此,请阅读randomForest软件包以获取基于RF的特征选择的实际正确方法。)

关于r - 如何提高randomForest的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23075506/

10-12 20:20