# 實驗
## 對比實驗
詳細的實驗腳本和輸出日志部分請參考 [repo](https://github.com/guolinke/boosting_tree_benchmarks).
### 數據集
我們使用4個數據集進行對比實驗,有關數據的細節在下表列出:
| **數據集** | **任務** | **鏈接** | **訓練集** | **特征** | **注釋** |
| --- | --- | --- | --- | --- | --- |
| Higgs | 二分類 | [link](https://archive.ics.uci.edu/ml/datasets/HIGGS) | 10,500,000 | 28 | 使用余下50萬個樣本作為測試集 |
| Yahoo LTR | 機器學習排序 | [link](https://webscope.sandbox.yahoo.com/catalog.php?datatype=c) | 473,134 | 700 | set1.train為訓練集,set1.test為測試集 |
| MS LTR | 機器學習排序 | [link](http://research.microsoft.com/en-us/projects/mslr/) | 2,270,296 | 137 | {S1,S2,S3}為訓練集,{S5} 為測試集 |
| Expo | 二分類 | [link](http://stat-computing.org/dataexpo/2009/) | 11,000,000 | 700 | 使用余下100W個樣本作為測試集 |
| Allstate | 二分類 | [link](https://www.kaggle.com/c/ClaimPredictionChallenge) | 13,184,290 | 4228 | 使用余下100W個樣本作為測試集 |
### 硬件環境
我們使用一臺Linux服務器作為實驗平臺,具體配置如下:
| **OS** | **CPU** | **Memory** |
| --- | --- | --- |
| Ubuntu 14.04 LTS | 2 * E5-2670 v3 | DDR4 2133Mhz, 256GB |
### 底層
我們使用 [xgboost](https://github.com/dmlc/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
tree_method = approx
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` 執行帶深度限制的 leaf-wise 葉子生長策略與模型復雜度控制。
因此我們無法設置完全相同的模型進行比較。為了相對權衡, 我們在xgboost中設置 `max_depth=8` 以使葉子數量達到最大數量 255 與 LightGBM 中設置 `num_leves=255` 進行比較。
其他參數皆為默認值
### 結論
#### 效率
為了比較效率, 我們只運行沒有任何測試或者度量輸出的訓練進程,并且我們不計算 IO 的時間。
如下是耗時的對比表格:
| **Data** | **xgboost** | **xgboost_hist** | **LightGBM** |
| --- | --- | --- | --- |
| Higgs | 3794.34 s | 551.898 s | **238.505513 s** |
| Yahoo LTR | 674.322 s | 265.302 s | **150.18644 s** |
| MS LTR | 1251.27 s | 385.201 s | **215.320316 s** |
| Expo | 1607.35 s | 588.253 s | **138.504179 s** |
| Allstate | 2867.22 s | 1355.71 s | **348.084475 s** |
我們發現在所有數據集上 LightGBM 都比 xgboost 快。
#### 準確率
為了比較準確率, 我們使用數據集測試集部分的準確率進行公平比較。
| **Data** | **Metric** | **xgboost** | **xgboost_hist** | **LightGBM** |
| --- | --- | --- | --- | --- |
| Higgs | AUC | 0.839593 | 0.845605 | 0.845154 |
| Yahoo LTR | NDCG<sub>1</sub> | 0.719748 | 0.720223 | 0.732466 |
| NDCG<sub>3</sub> | 0.717813 | 0.721519 | 0.738048 |
| NDCG<sub>5</sub> | 0.737849 | 0.739904 | 0.756548 |
| NDCG<sub>10</sub> | 0.78089 | 0.783013 | 0.796818 |
| MS LTR | NDCG<sub>1</sub> | 0.483956 | 0.488649 | 0.524255 |
| NDCG<sub>3</sub> | 0.467951 | 0.473184 | 0.505327 |
| NDCG<sub>5</sub> | 0.472476 | 0.477438 | 0.510007 |
| NDCG<sub>10</sub> | 0.492429 | 0.496967 | 0.527371 |
| Expo | AUC | 0.756713 | 0.777777 | 0.777543 |
| Allstate | AUC | 0.607201 | 0.609042 | 0.609167 |
#### 內存消耗
我們在運行訓練任務時監視 RES,并在 LightGBM 中設置 `two_round=true` (將增加數據載入時間,但會減少峰值內存使用量,不影響訓練速度和準確性)以減少峰值內存使用量。
| **Data** | **xgboost** | **xgboost_hist** | **LightGBM** |
| --- | --- | --- | --- |
| Higgs | 4.853GB | 3.784GB | **0.868GB** |
| Yahoo LTR | 1.907GB | 1.468GB | **0.831GB** |
| MS LTR | 5.469GB | 3.654GB | **0.886GB** |
| Expo | 1.553GB | 1.393GB | **0.543GB** |
| Allstate | 6.237GB | 4.990GB | **1.027GB** |
## 并行測試
### 數據集
我們使用 `terabyte click log` 數據集進行并行測試,詳細信息如下表:
| **數據** | **任務** | **鏈接** | **數據集** | **特征** |
| --- | --- | --- | --- | --- |
| Criteo | 二分類 | [link](http://labs.criteo.com/2013/12/download-terabyte-click-logs/) | 1,700,000,000 | 67 |
該數據集包含了 24 天點擊記錄,其中有 13 個整數特征與 26 個類別特征。
我們統計了該數據集 26 個類別前十天的點擊率和計數,使用接下來十天的數據作為訓練集并且該訓練集中類別已與點擊率和計數相對應。
處理后的訓練集共有 17 億條數據和 67 個特征。
### 環境
我們使用了 16 臺 Windows 服務器作為實驗平臺,詳細信息如下表:
| **OS** | **CPU** | **Memory** | **Network Adapter** |
| --- | --- | --- | --- |
| Windows Server 2012 | 2 * E5-2670 v2 | DDR3 1600Mhz, 256GB | Mellanox ConnectX-3, 54Gbps, RDMA support |
### 設置:
```
learning_rate = 0.1
num_leaves = 255
num_trees = 100
num_thread = 16
tree_learner = data
```
我們在此使用并行數據,因為該數據集數據量大但是特征少。
其他參數皆為默認值
### 結論
| **#Machine** | **Time per Tree** | **Memory Usage(per Machine)** |
| --- | --- | --- |
| 1 | 627.8 s | 176GB |
| 2 | 311 s | 87GB |
| 4 | 156 s | 43GB |
| 8 | 80 s | 22GB |
| 16 | 42 s | 11GB |
從結果看,我們發現 LightGBM 在分布式學習中可以做到線性加速。
## GPU 實驗
參考 [GPU 性能](./GPU-Performance.rst).