随机森林算法实现的性能对比测试
文章提供标题、作者与发布日期信息。
Source: https://dolphindb.cn/blogs/49
What this page covers
- 对比测试概述与评价指标。
- 测试软件(平台版本)。
- 环境配置(硬件与操作系统)。
- 数据生成(模拟数据与数据规模)。
- 模型参数(各平台统一设置与xgboost线程说明)。
- 测试结果(深度10与深度30)。
- 结果分析(准确率、性能、CPU与内存占用)。
技能认证特训营第二期正式开启(限时报名)
页面顶部包含活动/培训营报名提示与报名链接。
- 提供“技能认证特训营第二期”的报名入口。
- 报名链接指向外部页面。
随机森林算法实现的性能对比测试
给出文章标题、作者与发布日期信息。
- 作者署名为 Junxi。
- 发布日期为 2021-08-05。
- 文章主题为随机森林实现的性能对比测试。
对比测试概述与评价指标
说明随机森林的用途、对比的平台、评价指标,以及数据与任务设置(模拟二分类训练与预测)。
- 随机森林可用于分类问题。
- 随机森林可用于回归问题。
- 对比平台包括 scikit-learn、Spark MLlib、DolphinDB、xgboost。
- 评价指标包括内存占用、运行速度、分类准确性。
- 任务使用模拟数据进行二分类训练并对模拟数据预测。
测试软件(平台版本)
列出参与对比测试的软件平台与版本信息。
- scikit-learn 环境为 Python 3.7.1,scikit-learn 0.20.2。
- Spark MLlib 环境为 Spark 2.0.2,Hadoop 2.7.2。
- DolphinDB 版本为 0.82。
- xgboost 为 Python package,版本 0.81。
环境配置(硬件与操作系统)
给出CPU、内存、操作系统,并说明测试将数据载入内存、与磁盘无关。
- CPU 为 Intel(R) Xeon(R) CPU E5-2650 v4 2.20GHz(24核48线程)。
- 内存容量为 512GB。
- 操作系统为 CentOS Linux release 7.5.1804。
- 测试时数据会先加载到内存再计算。
- 随机森林算法的性能与磁盘无关。
数据生成(模拟数据与数据规模)
描述模拟数据的生成方式、分布假设、训练/测试集规模设置与脚本位置。
- 使用 DolphinDB 脚本生成模拟数据并导出为 CSV。
- 训练集平均分成两类。
- 两类特征服从多元正态分布 N(0,1) 与 N(2/sqrt(20),1)。
- 训练集中没有空值。
- 训练集规模 n 取 10,000、100,000、1,000,000。
- 特征数 p 取值为 50。
- 测试集规模为 1000 行。
- 测试集大小对准确性评估无显著影响(基于独立同分布假设)。
模型参数(各平台统一设置与xgboost线程说明)
列出随机森林训练参数,并解释xgboost在不同nthread下的性能现象与最终取值。
- 树的棵数设置为 500。
- 最大深度测试值为 10 和 30。
- 每次划分节点选取的特征数为 sqrt(总特征数)=7。
- Impurity 指标为基尼指数,适用于部分平台。
- maxBins 设置为 32,适用于部分平台。
- 并发线程数:scikit-learn、Spark MLlib、DolphinDB 取 48;xgboost 取 24。
- xgboost 在 nthread=48 时性能不理想。
- xgboost 最终使用线程数为 24。
测试结果(深度10与深度30)
给出两组(最大深度10/30)对比结果表(以图片形式)并配有说明性文字。
- 包含“树数量500、最大深度10”的结果条件说明。
- 包含“树数量500、最大深度30”的结果条件说明。
- 深度10的对比结果以表格/图片形式呈现。
- 深度30的对比结果以表格/图片形式呈现。
结果分析(准确率、性能、CPU与内存占用)
对四个平台的准确率、训练性能、CPU利用率与内存占用进行对比,并给出DolphinDB numJobs参数与xgboost实现差异解释。
- scikit-learn、Spark MLlib、DolphinDB 准确率相近,略高于 xgboost。
- 性能排序(高到低):DolphinDB、scikit-learn、xgboost、Spark MLlib。
- scikit-learn 使用了所有 CPU 核。
- Spark MLlib 在 10,000 行时 CPU 峰值占用率约 8%。
- Spark MLlib 在 100,000 行时 CPU 峰值占用率约 25%。
- Spark MLlib 在 1,000,000 行时会因内存不足中断。
- DolphinDB 使用了所有 CPU 核。
- DolphinDB 在对比中速度最快。
- DolphinDB 内存占用为 scikit-learn 的 2–7 倍。
- DolphinDB 内存占用为 xgboost 的 3–9 倍。
- 可通过 numJobs 调整并行度以减少内存占用。
- xgboost 内存占用最少。
- xgboost 的实现不包含 bootstrap 过程。
- xgboost 对数据使用无放回抽样。
总结
概括各平台实现的总体表现与适用场景,并强调DolphinDB与数据库的无缝集成及numJobs权衡能力。
- scikit-learn 在性能、内存开销和准确率上较均衡。
- Spark MLlib 在性能和内存开销上不如其他平台。
- DolphinDB 的总体性能最优。
- DolphinDB 随机森林与数据库无缝集成,可直接训练与预测数据库数据。
- numJobs 提供内存与速度之间的权衡能力。
- xgboost 随机森林的应用场景侧重 boosted tree。
附录(数据生成与各平台脚本/代码)
提供模拟数据生成脚本以及 scikit-learn、Spark MLlib、DolphinDB、xgboost 的训练与预测脚本/代码。
- 附录1提供模拟生成数据的 DolphinDB 脚本。
- 附录2提供 Python scikit-learn 的训练与预测脚本。
- 附录3提供 Spark MLlib 的训练与预测代码(Scala)。
- 附录4提供 DolphinDB 的训练与预测脚本。
- 附录5提供 xgboost 的训练与预测脚本。
- 测试脚本位置说明为附录2~5。
Facts index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |
| 随机森林算法实现的性能对比测试 | 发布日期 | 2021-08-05 | high |
| 随机森林算法实现的性能对比测试 | 作者署名 | Junxi | high |
| 随机森林 | 用途 | 既可用于分类问题,也可用于回归问题 | high |
| 对比测试平台 | 包含的平台 | scikit-learn、Spark MLlib、DolphinDB、xgboost | high |
| 对比测试 | 评价指标 | 内存占用、运行速度、分类准确性 | high |
| 本次测试任务 | 训练与预测任务描述 | 使用模拟生成数据作为输入进行二分类训练,并用生成的模型对模拟数据进行预测 | high |
| 测试软件版本 | scikit-learn版本 | Python 3.7.1,scikit-learn 0.20.2 | high |
| 测试软件版本 | Spark MLlib版本 | Spark 2.0.2,Hadoop 2.7.2 | high |
| 测试软件版本 | DolphinDB版本 | 0.82 | high |
| 测试软件版本 | xgboost版本 | Python package,0.81 | high |
| 测试硬件 | CPU型号与规格 | Intel(R) Xeon(R) CPU E5-2650 v4 2.20GHz(共24核48线程) | high |
| 测试硬件 | 内存容量 | 512GB | high |
| 测试环境 | 操作系统 | CentOS Linux release 7.5.1804 | high |
| 测试方法 | 数据加载方式 | 在各平台上进行测试时,都会把数据加载到内存中再进行计算 | high |
| 测试方法 | 与磁盘关系 | 随机森林算法的性能与磁盘无关 | high |
| 数据生成 | 生成方式与导出格式 | 使用DolphinDB脚本产生模拟数据,并导出为CSV文件 | high |
| 训练集类别设置 | 类别分布 | 训练集平均分成两类 | high |
| 特征分布假设 | 每类特征列分布 | 两类分别服从中心不同、标准差相同且两两独立的多元正态分布 N(0, 1) 和 N(2/sqrt(20), 1) | high |
| 训练集数据质量 | 是否含空值 | 训练集中没有空值 | high |
| 训练集规模 | n取值 | 10,000;100,000;1,000,000 | high |
| 训练集规模 | p取值 | 50 | high |
| 测试集规模选择依据 | 对准确性评估影响 | 由于测试集和训练集独立同分布,测试集的大小对模型准确性评估没有显著影响 | medium |
| 测试集规模 | 测试集行数 | 1000行 | high |
| 随机森林训练参数(通用) | 树的棵数 | 500 | high |
| 随机森林训练参数(通用) | 最大深度测试值 | 10 和 30 | high |
| 随机森林训练参数(通用) | 划分节点时选取的特征数 | 总特征数的平方根;integer(sqrt(50))=7 | high |
| 随机森林训练参数(部分平台) | Impurity指标 | 基尼指数(Gini index),仅对Python scikit-learn、Spark MLlib和DolphinDB有效 | high |
| 随机森林训练参数(部分平台) | 采样的桶数(maxBins) | 32,仅对Spark MLlib和DolphinDB有效 | high |
| 并发任务数设置 | 各平台并发线程数 | Python scikit-learn、Spark MLlib、DolphinDB取48;xgboost取24 | high |
| xgboost nthread参数观察 | nthread=48时性能表现 | 当nthread取48时,性能并不理想 | medium |
| xgboost线程数与性能关系 | 线程数<10时 | 性能与取值成正相关 | medium |
| xgboost线程数与性能关系 | 10<线程数<24时 | 不同取值的性能差异不明显 | medium |
| xgboost线程数与性能关系 | 线程数继续增加时 | 线程数增加时性能反而下降 | medium |
| xgboost社区讨论链接 | 参考链接 | https://link.zhihu.com/?target=https%3A//github.com/dmlc/xgboost/issues/1511 | high |
| xgboost测试设置 | 最终使用线程数 | 24 | high |
| 测试脚本 | 附录位置 | 测试脚本见附录2~5 | high |
| 测试结果(深度10) | 条件 | 树的数量为500,最大深度为10 | high |
| 测试结果(深度30) | 条件 | 树的数量为500,最大深度为30 | high |
| 结果对比(准确率) | 各平台准确率关系 | Python scikit-learn、Spark MLlib和DolphinDB的准确率比较相近,略高于xgboost | medium |
| 结果对比(性能) | 性能排序(高到低) | DolphinDB、Python scikit-learn、xgboost、Spark MLlib | medium |
| Python scikit-learn实现 | CPU核使用情况 | 使用了所有CPU核 | medium |
| Spark MLlib实现 | CPU利用率与数据量(10,000行) | CPU峰值占用率约8% | medium |
| Spark MLlib实现 | CPU利用率与数据量(100,000行) | CPU峰值占用率约25% | medium |
| Spark MLlib实现 | 在1,000,000行时的运行情况 | 会因为内存不足而中断执行 | high |
| DolphinDB实现 | CPU核使用情况 | 使用了所有CPU核 | medium |
| DolphinDB实现 | 速度结论 | 是所有实现中速度最快的 | medium |
| DolphinDB实现 | 内存占用相对scikit-learn | 内存占用是scikit-learn的2-7倍 | medium |
| DolphinDB实现 | 内存占用相对xgboost | 内存占用是xgboost的3-9倍 | medium |
| DolphinDB随机森林实现 | 参数numJobs用途 | 可通过调整numJobs降低并行度,从而减少内存占用 | high |
| DolphinDB随机森林(文档参考) | 用户手册链接 | https://link.zhihu.com/?target=https%3A//www.dolphindb.cn/cn/help/randomForestClassifier.html | high |
| xgboost随机森林 | 与boosted trees关系 | xgboost常用于boosted trees训练,也能进行随机森林;随机森林是算法迭代次数为1时的特例 | medium |
| xgboost性能(线程数) | 最佳线程数范围 | 在24线程左右时性能最高 | medium |
| xgboost实现 | 内存优势 | 内存占用最少 | medium |
| xgboost实现差异 | bootstrap过程 | 没有bootstrap这一过程 | medium |
| xgboost实现差异 | 抽样方式 | 对数据使用无放回抽样而不是有放回抽样 | medium |
| xgboost准确率解释 | 准确率略低原因 | 由于实现差异(如无bootstrap、无放回抽样),可以解释其准确率略低于其它平台 | low |
| 总结:Python scikit-learn实现 | 总体评价 | 在性能、内存开销和准确率上的表现比较均衡 | medium |
| 总结:Spark MLlib实现 | 总体评价 | 在性能和内存开销上的表现远远不如其他平台 | medium |
| 总结:DolphinDB实现 | 总体评价 | 性能最优 | medium |
| DolphinDB随机森林与数据库 | 集成方式 | 随机森林算法和数据库无缝集成;用户可直接对数据库中的数据进行训练和预测 | medium |
| DolphinDB随机森林实现 | numJobs作用(权衡) | 提供numJobs参数,实现内存和速度之间的平衡 | medium |
| 总结:xgboost随机森林 | 适用场景 | 最佳应用场景为boosted tree | medium |
| 附录1 | 内容 | 模拟生成数据的DolphinDB脚本 | high |
| 附录2 | 内容 | Python scikit-learn的训练和预测脚本 | high |
| 附录3 | 内容 | Spark MLlib的训练和预测代码(Scala实现) | high |
| 附录4 | 内容 | DolphinDB的训练和预测脚本 | high |
| 附录5 | 内容 | xgboost的训练和预测脚本 | high |