DART 助推器
XGBoost 主要结合了大量回归树和较小的学习率。在这种情况下,早期添加的树非常重要,而晚期添加的树则不那么重要。
Vinayak 和 Gilad-Bachrach 提出了一种新方法,将深度神经网络社区中的 dropout 技术添加到提升树中,并在某些情况下报告了更好的结果。
这是一个关于新树增强器 dart
的指令。
原始论文
Rashmi Korlakai Vinayak, Ran Gilad-Bachrach. “DART: Dropouts meet Multiple Additive Regression Trees.” [PMLR, arXiv].
特性
为了解决过拟合问题,可以减少树的数量。
可以防止处理琐碎的树(以纠正琐碎的错误)。
由于训练中引入了随机性,预计会出现以下几个差异:
训练可能比
gbtree
慢,因为随机丢弃阻止了预测缓冲区的使用。由于随机性,早期停止可能不稳定。
工作原理
在第 \(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}一个 \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
: 丢弃率。范围: [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)