ITPub博客

首页 > 人工智能 > 机器学习 > 从基准测试快速机器学习算法中获得的经验教训 - KDnuggets

从基准测试快速机器学习算法中获得的经验教训 - KDnuggets

机器学习 作者:ITPUB社群 时间:1970-01-01 08:33:46 0 删除 编辑

从基准测试快速机器学习算法中汲取的经验教训

在 Kaggle 举办的机器学习挑战赛中,超过一半的获胜解决方案都使用了提升决策树,并且只需最少的调参。我们评估了两个流行的树提升软件包:XGBoost 和 LightGBM,并总结了 4 个重要经验。

作者:Miguel Fierro、Mathew Salvaris、Guolin Ke 和 Tao Wu,均来自 Microsoft。

据 KDnuggets 报道,在 Kaggle 举办的机器学习挑战赛中,超过一半的获胜解决方案都使用了提升决策树。除了卓越的性能外,这些算法还具有实际吸引力,因为它们只需最少的调参。在本文中,我们评估了两个流行的树提升软件包:XGBoost 和 LightGBM,包括它们的 GPU(图形处理器) 实现。我们基于六个数据集的测试结果总结如下:

  • XGBoost 和 LightGBM 达到了相似的准确率指标。

  • 在所有测试数据集上,无论是在 CPU 还是 GPU 实现中,LightGBM 的训练时间都低于 XGBoost 及其基于直方图的变体 XGBoost hist。两个库之间的训练时间差异取决于数据集,最大可达 25 倍。

  • XGBoost 的 GPU 实现无法很好地扩展到大型数据集,在一半的测试中出现了内存不足的情况。

  • 当特征维度较高时,XGBoost hist 可能比原始 XGBoost 显著更慢。

我们所有的代码都是开源的,可以在这个仓库中找到。我们将解释这些库背后的算法,并在不同的数据集上评估它们。你喜欢快速的机器学习吗?那就继续阅读吧。

提升决策树的基础知识

梯度提升是一种机器学习技术,它以弱分类器集成的方式生成预测模型,并优化可微损失函数。最流行的梯度提升类型之一是提升决策树,其内部由弱决策树的集成组成。计算树有两种不同的策略:按层生长和按叶生长。按层生长策略逐层生长树。在这种策略中,每个节点分裂数据时优先考虑更接近树根的节点。按叶生长策略通过在损失变化最大的节点处分裂数据来生长树。按层生长通常更适合较小的数据集,而按叶生长容易过拟合。按叶生长往往在较大的数据集上表现出色,比按层生长快得多。

训练提升决策树的一个关键挑战是为每个叶子找到最佳分裂的计算成本。传统技术为每个叶子找到精确分裂,并且需要在每次迭代中扫描所有数据。另一种方法通过构建特征的直方图来近似分裂。这样,算法不需要评估特征的每一个值来计算分裂,而只需要评估直方图的箱,这些箱是有界的。这种方法对于大型数据集来说效率要高得多,而且不会对准确率产生不利影响。

XGBoost 始于 2014 年,由于在许多获胜的 Kaggle 竞赛方案中被使用而变得流行。最初 XGBoost 基于按层生长算法,但最近增加了按叶生长的选项,使用直方图实现分裂近似。我们将这个版本称为 XGBoost hist。LightGBM 是较新的产物,始于 2016 年 3 月,并于 2016 年 8 月开源。它基于按叶生长算法和直方图近似,因其速度而备受关注(免责声明:本文合著者 Guolin Ke 是 LightGBM 的主要贡献者)。除了多线程 CPU 实现外,XGBoost 和 LightGBM 现在也都支持 GPU 加速。

评估 XGBoost 和 LightGBM

我们在六个不同的数据集上进行了机器学习实验。这些实验位于我们 github 仓库中的 python notebooks 中。我们还展示了所使用的 XGBoost 和 LightGBM 的具体编译版本,并提供了安装它们和设置实验的步骤。我们尝试了使用 CPU 和 GPU 的分类和回归问题。所有实验均在具有 24 核、224 GB 内存和 NVIDIA M60 GPU 的 Azure NV24 VM 上运行。操作系统为 Ubuntu 16.04。在所有实验中,我们发现 XGBoost 和 LightGBM 具有相似的准确率指标(此处显示 F1 分数),因此我们在本博客文章中重点关注训练时间。下表显示了在 CPU 和 GPU 实现中两个库的训练时间以及训练时间比率。

从基准测试中获得的经验

正如通常所说,没有基准测试是完全真实的,但其中一些是有用的。从我们的实验中,我们发现 leaf-wise 实现通常比 level-wise 实现更快。然而,BCI 和 Planet Kaggle 数据集的 CPU 结果,以及 BCI 的 GPU 结果,表明 XGBoost hist 比标准 XGBoost 耗时显著更长。这是由于数据集规模大以及特征数量多,导致 XGBoost hist 产生相当大的内存开销。

我们还发现 XGBoost GPU 实现扩展性不佳,因为它在 3 个较大的数据集上出现了内存不足错误。此外,我们不得不在 Airline 数据集上运行 5 小时后终止 XGBoost 训练。

最后,在 LightGBM 和 XGBoost 之间,我们发现在 XGBoost 和 XGBoost hist 完成的所有测试中,LightGBM 都更快,最大差异分别为 XGBoost 的 25 倍和 XGBoost hist 的 15 倍。

我们希望研究不同数据大小和轮数对 CPU 与 GPU 性能的影响。在下表中,我们展示了使用 Airline 数据集子样本的结果。在比较 CPU 和 GPU 训练时间时,我们看到当数据集较大且轮数较高时,LightGBM 的 GPU 版本优于 CPU 版本。正如预期的那样,对于小数据集,在 RAM 和 GPU 内存之间复制数据的额外 IO 开销掩盖了在 GPU 上运行计算的速度优势。在这里,我们没有观察到在 GPU 上使用 XGBoost hist 有任何性能提升。顺便提一下,根据这篇近期论文,与多核 CPU 相比,XGBoost 的标准实现(精确分裂而非基于直方图)也无法从 GPU 中获益。

总体而言,我们发现无论是在 CPU 还是 GPU 实现中,LightGBM 都比 XGBoost 更快。此外,如果使用 XGBoost,我们建议密切关注特征维度和内存消耗。LightGBM 显著的速度优势转化为能够进行更多迭代和/或更快的超参数搜索,如果您用于优化模型的时间预算有限,或者想要尝试不同的特征工程想法,这可能非常有用。

Miguel、Mathew、Guolin 和 Tao。

致谢:我们要感谢来自 Microsoft 的 Steve Deng、David Smith 和 Huseyin Yildiz 对本文的协助和反馈。

原文。经许可转载。

简介:Miguel Fierro,数据科学家;Mathew Salvaris,数据科学家;Guolin Ke,副研究员;Tao Wu,首席数据科学经理,均就职于 Microsoft。

  • 使用 Iris 数据集的简单 XGBoost 教程

  • Dask、Pandas 和 XGBoost:在分布式系统之间良好协作

  • 决策树分类器:简明技术概述


转载声明:本文为转载整理,原文版权归原作者及原站点所有。

原文来源:KDnuggets

原创地址:https://www.kdnuggets.com/2017/08/lessons-benchmarking-fast-machine-learning-algorithms.html#comment-184818

原文作者:https://www.facebook.com/kdnuggets;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-11-21

  • 博文量
    1148
  • 访问量
    548189