当前位置:  开发笔记 > 编程语言 > 正文

在R中获得randomForest回归更快

如何解决《在R中获得randomForest回归更快》经验,为你挑选了1个好方法。



1> Soren Havelu..:

我不认为在一台PC(2-4核)上并行化就是答案.有很多较低的悬挂水果可供挑选.

1)RF模型随着训练样本数量的增加而增加.平均树深度类似于log(480,000/5)/ log(2)= 16.5个中间节点.在绝大多数例子中,每棵树2000-10000个样本都很好.如果你在单打比赛中争夺胜利,那么一个额外的小表现真的很重要,因为胜利者需要全部.在实践中,您可能不需要它.

2)不要在你的R代码中克隆你的数据集,并尝试只保留你的数据集的一个副本(通过引用传递当然是好的).对于这个数据集来说这不是一个大问题,因为即使对于R,数据集也不是那么大(~38Mb).

3)不要将randomForest算法的公式接口用于大型数据集.它将生成数据集的额外副本.但是,记忆并不是一个问题.

4)使用更快的RF算法:extraTrees,rangerRborist可用于R. extraTrees不是一个RF算法,但非常接近.

5)避免超过10个类别的分类特征.RF可以处理多达32个,但由于必须评估任何2 ^ 32可能的分割,因此变得非常慢.extraTreesRborist只通过测试一些随机选择的分割处理更多类别(效果很好).另一个解决方案如python-sklearn中的每个类别都分配了一个唯一的整数,并且该功能被处理为数字.您可以使用as.numeric转换分类功能,然后在运行randomForest之前执行相同的操作.

6)更大的数据.在随机块中拆分数据集并在每个块上训练几棵(~10)树.结合森林或分开拯救森林.这将略微增加树的相关性.有一些很好的集群实现来训练像这样.但对于低于1-100Gb的数据集,则不需要,具体取决于树的复杂性等.

#below我使用解决方案1-3)并获得几分钟的运行时间

library(randomForest)
#simulate data 
dataset <- data.frame(replicate(12,rnorm(400000)))
dataset$Clip_pm25 = dataset[,1]+dataset[,2]^2+dataset[,4]*dataset[,3]
#dati <- data.frame(dataset) #no need to keep the data set, an extra time in memory
#attach(dati) #if you attach dati you don't need to write data$Clip_pm25, just Clip_pm25
#but avoid formula interface for randomForest for large data sets because it cost extra memory and time 

#split data in X and y manually
y = dataset$Clip_pm25
X = dataset[,names(dataset) != "Clip_pm25"]
rm(dataset);gc()

object.size(X) #38Mb, no problemo

#if you were using formula interface
#output.forest <- randomForest(dati$Clip_pm25 ~ dati$e_1 + dati$Clipped_so + dati$Clip_no2 + dati$t2m_1 + dati$tp_1 + dati$Clipped_nh  +  dati$Clipped_co + dati$Clipped_o3 + dati$ssrd_1 + dati$Clipped_no + dati$Clip_pm10 + dati$sp_1, data=trainSet, ntree=250)
#output.forest <- randomForest(dati$Clip_pm25 ~ ., ntree=250) # use dot to indicate all variables

#start small, and scale up slowly
rf = randomForest(X,y,sampsize=1000,ntree=5) #runtime ~15 seconds
print(rf) #~67% explained var

#you probably really don't need to exeed 5000-10000 samples per tree, you could grow 2000 trees to sample most of training set
rf = randomForest(X,y,sampsize=5000,ntree=500) # runtime ~5 minutes
print(rf) #~87% explained var


#regarding parallel
#here you could implement some parallel looping
#.... but is it really worth for a 2-4 x speedup?
#coding parallel on single PC is fun but rarely worth the effort

#If you work at some company or university with a descent computer cluster,
#then you can spawn the process across 20-80-200 nodes and get a ~10-60-150 x speedup
#I can recommend the BatchJobs package

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有