实验

对比实验

有关详细的实验脚本和输出日志,请参阅此 repo

历史

08 Mar, 2020: 根据最新的主分支进行更新(XGBoost 的 1b97eaf,LightGBM 的 bcad692)。(xgboost_exact 未更新,因为它太慢了。)

2017年2月27日:第一版。

数据

我们使用了5个数据集来进行比较实验。数据详情列于下表:

数据

任务

链接

#训练集

#功能

注释

希格斯

二元分类

链接

10,500,000

28

最后50万个样本被用作测试集

雅虎 左到右

学习排序

链接

473,134

700

set1.train 作为 train, set1.test 作为 test

MS LTR

学习排序

链接

2,270,296

137

{S1,S2,S3} 作为训练集,{S5} 作为测试集

博览会

二元分类

链接

11,000,000

700

最后1,000,000个样本被用作测试集

全州保险

二元分类

链接

13,184,290

4228

最后1,000,000个样本被用作测试集

环境

我们在一台Linux服务器(Azure ND24s)上运行了所有实验,其规格如下:

操作系统

CPU

内存

Ubuntu 16.04 LTS

2 * E5-2690 v4

448GB

基线

我们使用了 xgboost 作为基线。

xgboost 和 LightGBM 都是基于 OpenMP 支持构建的。

设置

我们为实验设置了总共3个设置。这些设置的参数是:

  1. xgboost:

    eta = 0.1
    max_depth = 8
    num_round = 500
    nthread = 16
    tree_method = exact
    min_child_weight = 100
    
  2. xgboost_hist(使用基于直方图的算法):

    eta = 0.1
    num_round = 500
    nthread = 16
    min_child_weight = 100
    tree_method = hist
    grow_policy = lossguide
    max_depth = 0
    max_leaves = 255
    
  3. LightGBM:

    learning_rate = 0.1
    num_leaves = 255
    num_trees = 500
    num_threads = 16
    min_data_in_leaf = 0
    min_sum_hessian_in_leaf = 100
    

xgboost 以深度优先的方式生长树,并通过 max_depth 控制模型复杂度。LightGBM 则使用叶优先算法,并通过 num_leaves 控制模型复杂度。因此,我们不能在完全相同的模型设置下比较它们。为了权衡,我们使用 max_depth=8 的 xgboost,这将使最大叶子数达到 255,与 num_leaves=255 的 LightGBM 进行比较。

其他参数是默认值。

结果

速度

我们仅在训练任务中比较了速度,没有进行任何测试或输出指标。我们没有计算IO时间。对于排名任务,由于XGBoost和LightGBM实现了不同的排名目标函数,我们使用``regression``目标进行速度基准测试,以进行公平比较。

下表是时间成本的比较:

数据

xgboost

xgboost_hist

LightGBM

希格斯

3794.34 秒

165.575 秒

130.094 秒

雅虎 左到右

674.322 秒

131.462 秒

76.229 秒

MS LTR

1251.27 秒

98.386 秒

70.417 秒

博览会

1607.35 秒

137.65 秒

62.607 秒

全州保险

2867.22 秒

315.256 秒

148.231 秒

在所有实验数据集上,LightGBM 的运行速度比 xgboost 更快。

准确性

我们仅在测试数据集上计算了所有准确度指标。

数据

度量

xgboost

xgboost_hist

LightGBM

希格斯

AUC

0.839593

0.845314

0.845724

雅虎 左到右

NDCG1

0.719748

0.720049

0.732981

NDCG3

0.717813

0.722573

0.735689

NDCG5

0.737849

0.740899

0.75352

NDCG10

0.78089

0.782957

0.793498

MS LTR

NDCG1

0.483956

0.485115

0.517767

NDCG3

0.467951

0.47313

0.501063

NDCG5

0.472476

0.476375

0.504648

NDCG10

0.492429

0.496553

0.524252

博览会

AUC

0.756713

0.776224

0.776935

全州保险

AUC

0.607201

0.609465

0.609072

内存消耗

我们在运行训练任务时监控了RES。并且在LightGBM中设置了 two_round=true (这会增加数据加载时间并减少峰值内存使用,但不会影响训练速度或准确性)以减少峰值内存使用。

数据

xgboost

xgboost_hist

LightGBM (按列)

LightGBM (行式)

希格斯

4.853GB

7.335GB

0.897GB

1.401GB

雅虎 左到右

1.907GB

4.023GB

1.741GB

2.161GB

MS LTR

5.469GB

7.491GB

0.940GB

1.296GB

博览会

1.553GB

2.606GB

0.555GB

0.711GB

全州保险

6.237GB

12.090GB

1.116GB

1.755GB

并行实验

历史

2017年2月27日:第一版。

数据

我们使用了一个TB级的点击日志数据集来进行并行实验。详细信息列在以下表格中:

数据

任务

链接

#数据

#功能

Criteo

二元分类

链接

1,700,000,000

67

这些数据包含13个整数特征和26个分类特征,用于24天的点击日志。我们从前十天统计了这26个分类特征的点击率(CTR)和计数。然后,我们使用接下来的十天数据,在用相应的CTR和计数替换分类特征后,作为训练数据。处理后的训练数据总共有17亿条记录和67个特征。

环境

我们在以下规格的16台Windows服务器上进行了实验:

操作系统

CPU

内存

网络适配器

Windows Server 2012

2 * E5-2670 v2

DDR3 1600Mhz, 256GB

Mellanox ConnectX-3, 54Gbps, RDMA 支持

设置

learning_rate = 0.1
num_leaves = 255
num_trees = 100
num_thread = 16
tree_learner = data

我们在这里使用了数据并行,因为数据在 #data 上很大,但在 #feature 上很小。其他参数使用默认值。

结果

#机器

每棵树的时间

内存使用(每台机器)

toctree 是一个 reStructuredText 指令 ,这是一个非常多功能的标记。指令可以有参数、选项和内容。

627.8 秒

176GB

2

311 秒

87GB

4

156 秒

43GB

8

80 年代

22GB

16

42 秒

11GB

结果显示,LightGBM 在分布式学习中实现了线性加速。

GPU 实验

参见 GPU 性能