【问题标题】:XGBoost. How to get probabilities of class from xgb.dump (multi:softprob objective)XGBoost。如何从 xgb.dump 获取类概率(multi:softprob 目标)
【发布时间】:2016-11-16 22:18:55
【问题描述】:

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

<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>

附言由于速度限制,使用 .Net 中的 python 函数并不是一个好主意

【问题讨论】:

  • 如果您使用 GBM 而不是 XGBOOST(我知道它不太好),那么您可以使用 GBM2SAS 将其转换为一系列 if 语句。不过我不知道有类似的 XGBOOST 包。

标签: r xgboost


【解决方案1】:

这需要一段时间才能弄清楚。一旦你得到你的树,要遵循的步骤是

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

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

  2. 假设您有 3 个回合。然后你最终会得到这样的值 l1_0,l2_0,l3_0 用于 0 类 - 和 l1_1,l2_1,l3_1 用于 1 类和 l1_2,l2_2,l3_2 用于 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))
    

【讨论】:

  • Drew 我不确定我是否同意这里的反对票。这真的很难弄清楚,所以可能是,我用几句话写下了我的兴奋——你编辑了它——没关系——但为什么要投反对票呢?反正Regds
  • 现在这篇文章值得点赞。另一个帖子没有回答,现在你已经删除它很好。祝你好运。
  • 好的 - 我已经删除了我在另一个线程上的链接答案 - 正如你的建议 - 并将其作为评论。注册表
猜你喜欢
  • 2015-12-11
  • 2017-09-23
  • 1970-01-01
  • 2016-06-28
  • 2020-02-02
  • 2022-01-25
  • 2014-11-18
  • 2018-08-28
  • 2020-03-18
相关资源
最近更新 更多