🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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 (预测缓存区)。 * 由于随机性,提早停止可能会不稳定。 ## 它是如何运行的 * 在第 ![](https://img.kancloud.cn/e7/7e/e77e1905584d83cf5a3dc7079bef474f_16x8.gif) 轮训练中,假设 ![](https://img.kancloud.cn/65/a9/65a9120364a862f3e7abfc1c106738bc_9x13.gif) 个树被选定 drop 。 * 使用 ![](https://img.kancloud.cn/a2/14/a2147cea357c5da443b0f78276b39a10_85x40.jpg) 作为 drop 的树的 leaf scores (叶子分数)和 ![](https://img.kancloud.cn/44/1d/441dfdf84e86091c96c5d24780b79409_82x20.jpg) 作为新树的 leaf scores (叶子分数)。 * 下面是目标函数 : ![](https://img.kancloud.cn/9d/80/9d805dd3be3e4fb71398b1650cc2a5cf_363x53.jpg) * ![](https://img.kancloud.cn/26/61/2661c2f73236ce62700299f2115fb4d9_15x12.gif) 和 ![](https://img.kancloud.cn/52/f5/52f52d0fb3372f1881768b54d7f6be76_24x15.jpg) 是 overshooting (超调), 所以使用 scale factor (比例因子) ![](https://img.kancloud.cn/01/64/0164437968dc87b79baa7ec7398d5d9c_262x57.jpg) ## 参数 ### booster * `dart` 这个 booster 继承了 `gbtree` ,所以 `dart` 还有 `eta`, `gamma`, `max_depth` 等等参数。 其他的参数如下所示。 ### sample_type sampling (采样)算法的类型。 * `uniform`: (默认) drop 的树被统一选择。 * `weighted`: 根据 weights(权重)选择 drop 的树。 ### normalize_type normalization (归一化)算法的类型。 * `tree`: (默认) 新树与 drop 的树的 weight(权重)相同。 ![](https://img.kancloud.cn/18/66/18660be3990b6d3ca1d0177cf847d387_127x24.gif) * `forest`: 新树具有与 drop 的树(森林)的权重的总和相同的权重。 ![](https://img.kancloud.cn/18/66/18660be3990b6d3ca1d0177cf847d387_127x24.gif) ### 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) ```