# DART booster
[XGBoost](https://github.com/dmlc/xgboost) 主要是將大量帶有較小的 Learning rate (學習率) 的回歸樹做了混合。 在這種情況下,在構造前期增加樹的意義是非常顯著的,而在后期增加樹并不那么重要。
Rasmi 等人從深度神經網絡社區提出了一種新的方法來增加 boosted trees 的 dropout 技術,并且在某些情況下能得到更好的結果。
這是一種新型樹結構 booster `dart` 的使用指南。
## 原始論文
Rashmi Korlakai Vinayak, Ran Gilad-Bachrach. “DART: Dropouts meet Multiple Additive Regression Trees.” [JMLR](http://www.jmlr.org/proceedings/papers/v38/korlakaivinayak15.pdf)
## 特性
* 直接 drop 樹來解決 over-fitting(過擬合)。
* Trivial trees 會被阻止(糾正微不足道的錯誤)。
由于訓練過程中的引入的隨機性,會有下面的幾點區別。
* 訓練可能會比 `gbtree` 慢,因為隨機地 dropout 會禁止使用 prediction buffer (預測緩存區)。
* 由于隨機性,提早停止可能會不穩定。
## 它是如何運行的
* 在第  輪訓練中,假設  個樹被選定 drop 。
* 使用  作為 drop 的樹的 leaf scores (葉子分數)和  作為新樹的 leaf scores (葉子分數)。
* 下面是目標函數 :

*  和  是 overshooting (超調), 所以使用 scale factor (比例因子)

## 參數
### booster
* `dart`
這個 booster 繼承了 `gbtree` ,所以 `dart` 還有 `eta`, `gamma`, `max_depth` 等等參數。
其他的參數如下所示。
### sample_type
sampling (采樣)算法的類型。
* `uniform`: (默認) drop 的樹被統一選擇。
* `weighted`: 根據 weights(權重)選擇 drop 的樹。
### normalize_type
normalization (歸一化)算法的類型。
* `tree`: (默認) 新樹與 drop 的樹的 weight(權重)相同。

* `forest`: 新樹具有與 drop 的樹(森林)的權重的總和相同的權重。

### rate_drop
dropout 比率.
* 范圍: [0.0, 1.0]
### skip_drop
跳過 dropout 的概率。
* 如果一個 dropout 被跳過了,新的樹將會像 gbtree 一樣被添加。
* 范圍: [0.0, 1.0]
## 示例腳本
```
import xgboost as xgb
# read in data
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
# specify parameters via map
param = {'booster': 'dart',
'max_depth': 5, 'learning_rate': 0.1,
'objective': 'binary:logistic', 'silent': True,
'sample_type': 'uniform',
'normalize_type': 'tree',
'rate_drop': 0.1,
'skip_drop': 0.5}
num_round = 50
bst = xgb.train(param, dtrain, num_round)
# make prediction
# ntree_limit must not be 0
preds = bst.predict(dtest, ntree_limit=num_round)
```