实验
对比实验
有关详细的实验脚本和输出日志,请参阅此仓库。
历史
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 种配置。这些配置的参数如下
xgboost
eta = 0.1 max_depth = 8 num_round = 500 nthread = 16 tree_method = exact min_child_weight = 100
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
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 性能。