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\) 为新树的叶子分数。

  • 目标函数如下:

\[\mathrm{Obj} = \sum_{j=1}^n L \left( y_j, \hat{y}_j^{m-1} - D_j + \tilde{F}_m \right) + \Omega \left( \tilde{F}_m \right).\]
  • \(D\)\(F_m\) 超调了,因此使用比例因子

\[\hat{y}_j^m = \sum_{i \not\in \mathbf{K}} F_i + a \left( \sum_{i \in \mathbf{K}} F_i + b F_m \right) .\]

参数

助推器 dart 继承了 gbtree 助推器,因此它支持 gbtree 的所有参数,例如 etagammamax_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)