XGBoost。如何从xgb.dump中获取类的概率(multi:softprob objective)

时间:2016-10-04 18:01:56

标签: r xgboost

我使用XGBoost预测了3级分类。下一轮是获取树模型(由xgb.dump()打印)并在.net生产系统中使用它。我真的不明白如何从休假中的单一价值中获得概率的三维值:

<code>
[1107] "booster[148]""0:[f24<1.5] yes=1,no=2,missing=1"          
[1109] "1:[f4<0.085] yes=3,no=4,missing=3""3:leaf=0.00624765"                         
[1111] "4:leaf=-0.0208106""2:[f4<0.115] yes=5,no=6,missing=5"         
[1113] "5:leaf=0.14725""6:leaf=0.0102657"  
</code>

P.S。由于速度限制,使用.Net的python函数并不是一个好主意

1 个答案:

答案 0 :(得分:3)

这需要一段时间来弄明白。获得树后,要遵循的步骤是

  1. 计算每个助推器的叶值。第一个助推器是0级,接下来是1级,接下来是2级,接下来是0级和1级,依此类推。所以基本上如果你有10 num_round,你会看到30个助推器。

    小心“失踪”。如果您没有在DMatrix中特别提到缺失值,xgb可以将值0视为缺失。因此,当您沿着树走下去时,如果该节点的特征值为0,则可能需要跳转到由missing = x表示的节点x。解决这个令人困惑的事情的一种方法是确保在训练和预测时在DMatrix中放置了缺失值。我设置了一个不可能存在于我的数据中的值,并确保在我进行训练或预测之前通过用一些(非零)值替换它来处理NA类型的值。显然0对你来说实际上意味着失踪,在这种情况下可以。实际上,您可能会注意到这一事物在数据中有1或0的分类特征中,而树中的节点在非常小的负数等上具有荒谬的条件。

  2. 假设您有3轮。然后你会得到这样的价值观 第0类为l1_0,l2_0,l3_0 - 第1类为l1_1,l2_1,l3_1,第2类为l1_2,l2_2,l3_2

    现在,确保获得正确逻辑的一个好方法是设置output_margin和pred_leaf。一个在时间。当您设置pred_leaf时,您将获得一个矩阵,该矩阵将为单个实例准确显示您应该为所有类命中的叶子。当你设置output_margin时,你将获得xgb正在计算的叶子值的总和。

    现在,对于0级,此总和为0.5 + l1_0+l2_0+l3_0,依此类推。您可以通过使用output_margin获取的预测响应来交叉验证这一点。这里0.5是偏见。

  3. 现在假设您将v0,v1和v2作为偏差+叶值求和结果。那么你0级的概率是

       p(class0) = exp(v0)/(exp(v0)+exp(v1)+exp(v2))