【问题标题】:find all path for binary tree from xgboost.dump从 xgboost.dump 中找到二叉树的所有路径
【发布时间】:2017-08-14 00:09:28
【问题描述】:

我有一个用于许多树的 xgboost.dump 文本文件。 我想找到所有路径以获得每条路径的价值。 这是一棵树。

tree[0]:
0:[a<0.966398] yes=1,no=2,missing=1
    1:[b<0.323071] yes=3,no=4,missing=3
        3:[c<0.461248] yes=7,no=8,missing=7
            7:leaf=0.00972768
            8:leaf=-0.0179376
        4:[a<0.379082] yes=9,no=10,missing=9
            9:leaf=0.0146003
            10:leaf=0.0454369
    2:[b<0.322352] yes=5,no=6,missing=5
        5:[c<0.674868] yes=11,no=12,missing=11
            11:leaf=0.0497964
            12:leaf=0.00953781
        6:[f<0.598267] yes=13,no=14,missing=13
            13:leaf=0.0504545
            14:leaf=0.0867654

我想将所有路径转换成

path1, a<0.966398, b<0.323071, c<0.461248, leaf = 0.00097268
path2, a<0.966398, b<0.323071, c>0.461248, leaf = -0.0179376
path3, a<0.966398, b>0.323071, a<0.379082, leaf = 0.0146003
path4, a<0.966398, b>0.323071, a>0.379082, leaf = 0.0454369
path5, a>0.966398, b<0.322352, c<0.674868, leaf = 0.0497964
path6, a>0.966398, b<0.322352, c>0.674868, leaf = 0.00953781
path7, a>0.966398, b>0.322352, f<0.598267, leaf = 0.0504545
path8, a>0.966398, b>0.322352, f>0.598267, leaf = 0.0864654

我已经尝试列出所有可能的路径,例如

array([[ 0,  1,  3,  7],
       [ 0,  1,  3,  8],
       [ 0,  1,  4,  9],
       [ 0,  1,  4, 10],
       [ 0,  2,  5, 11],
       [ 0,  2,  5, 12],
       [ 0,  2,  6, 13],
       [ 0,  2,  6, 14]])

但是一旦 max_depth 更高,这种方式会导致错误,一些分支将停止增长并且路径将是错误的。 所以我需要解析文本文件中的是,否来生成真实、正确的路径。 有什么建议? 谢谢!

【问题讨论】:

    标签: python decision-tree xgboost


    【解决方案1】:

    这是我使用 R 实现解决此问题的方法。其他语言的用户可以按照逻辑进行实物复制。

    首先,我从 xgb.model.dt.tree() 生成的模型转储文件开始。

    然后,我编写了一个函数来解析从转储模型的单个树中的任意节点到最终父节点的有效路径。

    稍后,我使用 purrr::by_row() 将此函数应用于模型转储中的所有终端节点“Leaf”记录,并将结果转换为目的。

    这个函数有两个参数,一个是它正在测试的树,另一个是终端节点的标识。它遵循以下一般步骤:

    1. 从每个树的目标(终端)节点开始,在 c("Yes" "No", "Missing") 决策拆分中找到将目标节点作为有效子节点的行。李>
    2. 将此有效的父节点 ID 连接到一个向量中,该向量将用于跟踪从目标节点到最终父节点的路径的每个步骤。该向量在函数完成时返回。
    3. 接下来,对链上的每个节点重复“谁是我的父节点”步骤,直到路径到达最终父节点(此节点 ID 始终以“-0”结尾),同时为每个新步骤更新路径向量链条。
    4. 一旦函数到达终端节点,return() 路径。

    在我的例子中,我使用 purrr::by_row() 将此函数应用于模型转储中的所有“叶子”节点,而 .collat​​ing = "rows" 将路径表示为输出中的附加行。

    这也很可能不是最快的方法。

    xgb.booster 模型中 nrounds 或 max_depth 的增加将导致此过程的运行时间增加。您可以使用树的子集(xgb.model.dt.tree() 的参数 n_first_tree = N)开发您的方法,让您估计解析出最终模型中的全部终端节点路径所需的时间。在我的例子中,在 max_depth = 5 时具有约 500 棵树的模型可能需要 30 分钟以上的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多