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

时间:2015-10-05 14:06:26

标签: python decision-tree xgboost boosting

我正在使用xgboost进行排名

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

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

手动计算权重

1 个答案:

答案 0 :(得分:18)

每个树都有相同的权重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,从而增加算法的运行时间。