实验

对比实验

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

历史

2020年3月8日:根据最新的 master 分支进行更新(XGBoost 为 1b97eaf,LightGBM 为 bcad692)。(xgboost_exact 未更新,因为它太慢了。)

2017年2月27日:第一个版本。

数据

我们使用了 5 个数据集进行对比实验。数据集详情列在下表中

数据

任务

链接

训练集数量

特征数量

备注

Higgs

二分类

链接

10,500,000

28

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

Yahoo LTR

排序学习

链接

473,134

700

set1.train 作为训练集,set1.test 作为测试集

MS LTR

排序学习

链接

2,270,296

137

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

Expo

二分类

链接

11,000,000

700

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

Allstate

二分类

链接

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

Higgs

3794.34 s

165.575 s

130.094 s

Yahoo LTR

674.322 s

131.462 s

76.229 s

MS LTR

1251.27 s

98.386 s

70.417 s

Expo

1607.35 s

137.65 s

62.607 s

Allstate

2867.22 s

315.256 s

148.231 s

LightGBM 在所有实验数据集上都比 xgboost 运行更快。

精度

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

数据

指标

xgboost

xgboost_hist

LightGBM

Higgs

AUC

0.839593

0.845314

0.845724

Yahoo LTR

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

Expo

AUC

0.756713

0.776224

0.776935

Allstate

AUC

0.607201

0.609465

0.609072

内存消耗

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

数据

xgboost

xgboost_hist

LightGBM (列存)

LightGBM (行存)

Higgs

4.853GB

7.335GB

0.897GB

1.401GB

Yahoo LTR

1.907GB

4.023GB

1.741GB

2.161GB

MS LTR

5.469GB

7.491GB

0.940GB

1.296GB

Expo

1.553GB

2.606GB

0.555GB

0.711GB

Allstate

6.237GB

12.090GB

1.116GB

1.755GB

并行实验

历史

2017年2月27日:第一个版本。

数据

我们使用了一个 TB 级的点击日志数据集进行并行实验。详情列在下表中

数据

任务

链接

数据量

特征数量

Criteo

二分类

链接

1,700,000,000

67

该数据集包含 24 天的点击日志,共 13 个整数特征和 26 个类别特征。我们统计了前十天这 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 较小。其他参数使用了默认值。

结果

机器数量

每棵树时间

内存使用量(每台机器)

1

627.8 s

176GB

2

311 s

87GB

4

156 s

43GB

8

80 s

22GB

16

42 s

11GB

结果表明,LightGBM 在分布式学习下实现了线性加速。

GPU 实验

请参阅GPU 性能