如何在 xgboost 中访问单个决策树的权重?

Posted

技术标签:

【中文标题】如何在 xgboost 中访问单个决策树的权重?【英文标题】:How to access weighting of indiviual decision trees in xgboost? 【发布时间】:2016-01-02 05:28:24 【问题描述】:

我正在使用 xgboost 进行排名

param = 'objective':'rank:pairwise', 'booster':'gbtree'

据我了解,梯度提升的工作原理是计算学习决策树的加权和。如何访问分配给每个学习助推器的权重?我想尝试在训练后对权重进行后处理以加快预测步骤,但我不知道如何获得单个权重。 使用dump_model() 时,可以在创建的文件中看到不同的决策树,但没有存储权重。 在 API 中我没有找到合适的函数。或者我可以使用收缩参数eta 手动计算权重吗?

【问题讨论】:

希望得到这个问题的答案...好问题! 【参考方案1】:

每棵树都被赋予相同的权重eta,正如你所说,总体预测是每棵树的预测之和。

您可能期望较早的树比后面的树具有更大的权重,但这不是必需的,因为响应在每棵树之后更新的方式。这是一个玩具示例:

假设我们有 5 个观察值,响应分别为 10、20、30、40、50。构建第一棵树并给出 12、18、27、39、54 的预测。

现在,如果eta = 1,则传递给下一棵树的响应变量将为-2、2、3、1、-4(即预测与真实响应之间的差异)。然后下一棵树将尝试学习第一棵树没有捕获的“噪音”。如果nrounds = 2,那么两棵树的预测总和将给出模型的最终预测。

如果改为 eta = 0.1,则所有树的预测都会缩小 eta,因此第一棵树将改为“预测”1.2、1.8、2.7、3.9、5.4。然后传递给下一棵树的响应变量将具有值 8.8、18.2、27.3、36.1、44.6(缩放预测和真实响应之间的差异)然后第二轮使用这些响应值来构建另一棵树 - 并再次预测由eta 缩放。所以树 2 预测说,7、18、25、40、40,一旦缩放,就会变成 0.7、1.8、2.5、4.0、4.0。和以前一样,第三棵树将传递这些值与前一棵树的响应变量之间的差异(例如 8.1、16.4、24.8、32.1、40.6)。同样,所有树的预测总和将给出最终预测。

很明显,当eta = 0.1 且base_score 为 0 时,您需要至少 10 轮才能获得接近合理的预测。一般来说,您至少需要 1/eta 轮,通常更多。

使用小eta 的基本原理是,模型受益于对预测采取小步骤,而不是让树 1 完成大部分工作。这有点像结晶——慢慢冷却,你会得到更大、更好的晶体。缺点是需要增加nrounds,从而增加算法的运行时间。

【讨论】:

@dataShrimp ,嗨,也许你可以回答this question?. 这是我遇到的最清晰的解释之一。谢谢!

以上是关于如何在 xgboost 中访问单个决策树的权重?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python / R 中访问 xgboost 模型的单个树

Python 中用 XGBoost 和 scikit-learn 进行随机梯度增强

再谈XGBoost原理

Xgboost

简述树模型之决策树、随机森林、xgboost

什么是使用 Adaboost(自适应提升)方法和决策树的示例