实验
对比实验
有关详细的实验脚本和输出日志,请参阅此仓库。
历史
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 性能。