DART 助推器
XGBoost 主要将大量回归树与一个小的学习率相结合。在这种情况下,早期添加的树很重要,而后期添加的树则不重要。
Vinayak 和 Gilad-Bachrach 提出了一种新方法,将深度神经网络社区的 dropout 技术引入到增强树中,并在某些情况下报告了更好的结果。
这是新树助推器 dart
的说明。
原始论文
Rashmi Korlakai Vinayak, Ran Gilad-Bachrach. “DART: Dropouts meet Multiple Additive Regression Trees.” [PMLR, arXiv].
特点
删除树以解决过拟合。
可以防止琐碎的树(用于纠正琐碎的错误)。
由于训练中引入了随机性,预计会出现以下几个差异:
训练可能比
gbtree
慢,因为随机 dropout 阻止了预测缓冲区的利用。由于随机性,提前停止可能不稳定。
工作原理
在第 \(m\) 轮训练中,假设选择了 \(k\) 棵树被丢弃。
令 \(D = \sum_{i \in \mathbf{K}} F_i\) 为被丢弃树的叶子分数,\(F_m = \eta \tilde{F}_m\) 为新树的叶子分数。
目标函数如下:
\(D\) 和 \(F_m\) 是过冲的,因此使用缩放因子
参数
助推器 dart
继承了 gbtree
助推器,因此它支持 gbtree
的所有参数,例如 eta
、gamma
、max_depth
等。
附加参数如下所述:
sample_type
: 采样算法类型。uniform
: (默认) 被丢弃的树均匀选择。weighted
: 被丢弃的树按权重比例选择。
normalize_type
: 归一化算法类型。tree
: (默认) 新树与每棵被丢弃的树具有相同的权重。
\[\begin{split}a \left( \sum_{i \in \mathbf{K}} F_i + \frac{1}{k} F_m \right) &= a \left( \sum_{i \in \mathbf{K}} F_i + \frac{\eta}{k} \tilde{F}_m \right) \\ &\sim a \left( 1 + \frac{\eta}{k} \right) D \\ &= a \frac{k + \eta}{k} D = D , \\ &\quad a = \frac{k}{k + \eta}\end{split}\]forest
: 新树与所有被丢弃的树(森林)的总和具有相同的权重。
\[\begin{split}a \left( \sum_{i \in \mathbf{K}} F_i + F_m \right) &= a \left( \sum_{i \in \mathbf{K}} F_i + \eta \tilde{F}_m \right) \\ &\sim a \left( 1 + \eta \right) D \\ &= a (1 + \eta) D = D , \\ &\quad a = \frac{1}{1 + \eta} .\end{split}\]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?format=libsvm')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test?format=libsvm')
# specify parameters via map
param = {'booster': 'dart',
'max_depth': 5, 'learning_rate': 0.1,
'objective': 'binary:logistic',
'sample_type': 'uniform',
'normalize_type': 'tree',
'rate_drop': 0.1,
'skip_drop': 0.5}
num_round = 50
bst = xgb.train(param, dtrain, num_round)
preds = bst.predict(dtest)