我有一个大小为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/