如何访问xgboost中个体决策树的加权值?

15

我正在使用xgboost进行排名

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

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


很想在这个问题上得到答案...好问题! - T. Scharf
1个回答

30

每棵树都被赋予相同的权重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的理由是模型受益于朝着预测结果迈出小步而不是让第一棵树完成大部分工作。这有点像结晶 - 缓慢冷却可以获得更大、更好的晶体。缺点是需要增加nrounds,从而增加算法的运行时间。

@dataShrimp,你好,也许你可以回答这个问题?。 - Olivier_s_j
1
这是我遇到过的最清晰明了的解释之一。谢谢! - santon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接