如何用随机森林算法实现scikit-learn、Spark MLlib、DolphinDB、xgboost的性能对比测试


如何用随机森林算法实现scikit-learn、Spark MLlib、DolphinDB、xgboost的性能对比测试,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。随机森林是常用的机器学习算法,既可以用于分类问题,也可用于回归问题。本文对scikit-learn、Spark MLlib、DolphinDB、xgboost四个平台的随机森林算法实现进行对比测试。评价指标包括内存占用、运行速度和分类准确性。本次测试使用模拟生成的数据作为输入进行二分类训练,并用生成的模型对模拟数据进行预测。本次测试使用的各平台版本如下:scikit-learn:Python 3.7.1,scikit-learn 0.20.2Spark MLlib:Spark 2.0.2,Hadoop 2.7.2DolphinDB:0.82xgboost:Python package,0.81CPU:Intel(R) Xeon(R) CPU E5-2650 v4 2.20GHz(共24核48线程)RAM:512GB操作系统:CentOS Linux release 7.5.1804在各平台上进行测试时,都会把数据加载到内存中再进行计算,因此随机森林算法的性能与磁盘无关。本次测试使用DolphinDB脚本产生模拟数据,并导出为CSV文件。训练集平均分成两类,每个类别的特征列 香港云主机分别服从两个中心不同,标准差相同,且两两独立的多元正态分布N(0, 1)和N(2/sqrt(20), 1)。训练集中没有空值。假设训练集的大小为n行p列。本次测试中n的取值为10,000、100,000、1,000,000,p的取值为50。由于测试集和训练集独立同分布,测试集的大小对模型准确性评估没有显著影响。本次测试对于所有不同大小的训练集都采用1000行的模拟数据作为测试集。产生模拟数据的DolphinDB脚本见附录1。在各个平台中都采用以下参数进行随机森林模型训练:树的棵数:500最大深度:分别在4个平台中测试了最大深度为10和30两种情况划分节点时选取的特征数:总特征数的平方根,即integer(sqrt(50))=7划分节点时的不纯度(Impurity)指标:基尼指数(Gini index),该参数仅对Python scikit-learn、Spark MLlib和DolphinDB有效采样的桶数:32,该参数仅对Spark MLlib和DolphinDB有效并发任务数:CPU线程数,Python scikit-learn、Spark MLlib和DolphinDB取48,xgboost取24。在测试xgboost时,尝试了参数nthread(表示运行时的并发线程数)的不同取值。但当该参数取值为本次测试环境的线程数(48)时,性能并不理想。进一步观察到,在线程数小于10时,性能与取值成正相关。在线程数大于10小于24时,不同取值的性能差异不明显,此后,线程数增加时性能反而下降。该现象在xgboost社区中也有人讨论过。因此,本次测试在xgboost中最终使用的线程数为24。测试脚本见附录2~5。当树的数量为500,最大深度为10时,测试结果如下表所示:当树的数量为500,最大深度为30时,测试结果如下表所示:从准确率上看,Python scikit-learn、Spark MLlib和DolphinDB的准确率比较相近,略高于xgboost的实现;从性能上看,从高到低依次为DolphinDB、Python scikit-learn、xgboost、Spark MLlib。在本次测试中,Python scikit-learn的实现使用了所有CPU核。Spark MLlib的实现没有充分使用所有CPU核,内存占用最高,当数据量为10,000时,CPU峰值占用率约8%,当数据量为100,000时,CPU峰值占用率约为25%,当数据量为1,000,000时,它会因为内存不足而中断执行。DolphinDB database 的实现使用了所有CPU核,并且它是所有实现中速度最快的,但内存占用是scikit-learn的2-7倍,是xgboost的3-9倍。DolphinDB的随机森林算法实现提供了numJobs参数,可以通过调整该参数来降低并行度,从而减少内存占用。详情请参考DolphinDB用户手册。xgboost常用于boosted trees的训练,也能进行随机森林算法。它是算法迭代次数为1时的特例。xgboost实际上在24线程左右时性能最高,其对CPU线程的利用率不如Python和DolphinDB,速度也不及两者。其优势在于内存占用最少。另外,xgboost的具体实现也和其他平台的实现有所差异。例如,没有bootstrap这一过程,对数据使用无放回抽样而不是有放回抽样。这可以解释为何它的准确率略低于其它平台。Python scikit-learn的随机森林算法实现在性能、内存开销和准确率上的表现比较均衡,Spark MLlib的实现在性能和内存开销上的表现远远不如其他平台。DolphinDB的随机森林算法实现性能最优,并且DolphinDB的随机森林算法和数据库是无缝集成的,用户可以直接对数据库中的数据进行训练和预测,并且提供了numJobs参数,实现内存和速度之间的平衡。而xgboost的随机森林只是迭代次数为1时的特例,具体实现和其他平台差异较大,最佳的应用场景为boosted tree。1. 模拟生成数据的DolphinDB脚本2. Python scikit-learn的训练和预测脚本3. Spark MLlib的训练和预测代码(Scala实现)4. DolphinDB的训练和预测脚本5. xgboost的训练和预测脚本看完上述内容,你们掌握如何用随机森林算法实现scikit-learn、Spark MLlib、DolphinDB、xgboost的性能对比测试的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注开发云行业资讯频道,感谢各位的阅读!

相关推荐: R语言tableone包怎么使用

本篇内容主要讲解“R语言tableone包怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“R语言tableone包怎么使用”吧!用一个例子看一下:输入1:输出1:输入2:输出2:输入3:连续变量默认正态,可以…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 09/22 22:06
下一篇 09/22 22:06

相关推荐