DART booster

XGBoost 主要是将大量带有较小的 Learning rate (学习率) 的回归树做了混合。 在这种情况下,在构造前期增加树的意义是非常显著的,而在后期增加树并不那么重要。

Rasmi 等人从深度神经网络社区提出了一种新的方法来增加 boosted trees 的 dropout 技术,并且在某些情况下能得到更好的结果。

这是一种新型树结构 booster dart 的使用指南。

原始论文

Rashmi Korlakai Vinayak, Ran Gilad-Bachrach. “DART: Dropouts meet Multiple Additive Regression Trees.” JMLR

特性

  • 直接 drop 树来解决 over-fitting(过拟合)。
    • Trivial trees 会被阻止(纠正微不足道的错误)。

由于训练过程中的引入的随机性,会有下面的几点区别。

  • 训练可能会比 gbtree 慢,因为随机地 dropout 会禁止使用 prediction buffer (预测缓存区)。
  • 由于随机性,提早停止可能会不稳定。

它是如何运行的

  • 在第 DART booster - 图1 轮训练中,假设 DART booster - 图2 个树被选定 drop 。
  • 使用 DART booster - 图3 作为 drop 的树的 leaf scores (叶子分数)和 DART booster - 图4 作为新树的 leaf scores (叶子分数)。
  • 下面是目标函数 :

DART booster - 图5

  • DART booster - 图6DART booster - 图7 是 overshooting (超调), 所以使用 scale factor (比例因子)

DART booster - 图8

参数

booster

  • dart

这个 booster 继承了 gbtree ,所以 dart 还有 eta, gamma, max_depth 等等参数。

其他的参数如下所示。

sample_type

sampling (采样)算法的类型。

  • uniform: (默认) drop 的树被统一选择。
  • weighted: 根据 weights(权重)选择 drop 的树。

normalize_type

normalization (归一化)算法的类型。

  • tree: (默认) 新树与 drop 的树的 weight(权重)相同。

DART booster - 图9

  • forest: 新树具有与 drop 的树(森林)的权重的总和相同的权重。

DART booster - 图10

rate_drop

dropout 比率.

  • 范围: [0.0, 1.0]

skip_drop

跳过 dropout 的概率。

  • 如果一个 dropout 被跳过了,新的树将会像 gbtree 一样被添加。
  • 范围: [0.0, 1.0]

示例脚本

  1. import xgboost as xgb
  2. # read in data
  3. dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
  4. dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
  5. # specify parameters via map
  6. param = {'booster': 'dart',
  7. 'max_depth': 5, 'learning_rate': 0.1,
  8. 'objective': 'binary:logistic', 'silent': True,
  9. 'sample_type': 'uniform',
  10. 'normalize_type': 'tree',
  11. 'rate_drop': 0.1,
  12. 'skip_drop': 0.5}
  13. num_round = 50
  14. bst = xgb.train(param, dtrain, num_round)
  15. # make prediction
  16. # ntree_limit must not be 0
  17. preds = bst.predict(dtest, ntree_limit=num_round)