实验
对比实验
有关详细的实验脚本和输出日志,请参阅此 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个设置。这些设置的参数是:
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 |
---|---|---|---|
希格斯 |
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
上很小。其他参数使用默认值。
结果
#机器 |
每棵树的时间 |
内存使用(每台机器) |
---|---|---|
|
627.8 秒 |
176GB |
2 |
311 秒 |
87GB |
4 |
156 秒 |
43GB |
8 |
80 年代 |
22GB |
16 |
42 秒 |
11GB |
结果显示,LightGBM 在分布式学习中实现了线性加速。
GPU 实验
参见 GPU 性能。