Есть ли способ изменить метку конечного узла в дереве xgboost с помощью graphviz? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытался поместить изображение дерева, но моей репутации было недостаточно ...
Во всяком случае, в XGBoost я проверял дерево, чтобы интерпретировать модель.Кстати, метка конечного узла означает сырой счет.Я хочу видеть вероятность предсказания в дереве.Например, если значение конечного узла равно 0,0856821, то требуемое значение равно 1 / (1 + exp (-1 * 0,0856821).
Есть ли способ изменить метку конечного узла?

to_graphviz(model, num_trees=99)

В одну сторонуЯ думаю, что дамп модели xgboost в формате json. Затем измените значение в json. Наконец, измените формат json на точечный формат с помощью graphviz. Проблема в том, что я не знаю, как изменить формат json на точечный формат. Ниже приведен пример, нона самом деле дерево глубокое и более сложное.

До:

{ "nodeid": 0, "depth": 0, "split": "f0", "split_condition": 5.03515, "yes": 1, "no": 2, "missing": 1, "children": [
    { "nodeid": 1, "depth": 1, "split": "f0", "split_condition": 3.0743, "yes": 3, "no": 4, "missing": 3, "children": [
        { "nodeid": 3, "leaf": 0.0856821 },
        { "nodeid": 4, "leaf": 0.158854 }
      ]
    },
    { "nodeid": 2, "depth": 1, "split": "f0", "split_condition": 6.81955, "yes": 5, "no": 6, "missing": 5, "children": [
        { "nodeid": 5, "leaf": 0.240472 },
        { "nodeid": 6, "leaf": 0.371366 }
      ]
    }
  ]
}

После:

{ "nodeid": 0, "depth": 0, "split": "f0", "split_condition": 5.03515, "yes": 1, "no": 2, "missing": 1, "children": [
    { "nodeid": 1, "depth": 1, "split": "f0", "split_condition": 3.0743, "yes": 3, "no": 4, "missing": 3, "children": [
        { "nodeid": 3, "leaf": 0.5214074298536938 },
        { "nodeid": 4, "leaf": 0.5396301973693495 }
      ]
    },
    { "nodeid": 2, "depth": 1, "split": "f0", "split_condition": 6.81955, "yes": 5, "no": 6, "missing": 5, "children": [
        { "nodeid": 5, "leaf": 0.5598299629669533 },
        { "nodeid": 6, "leaf": 0.5917890109082163 }
      ]
    }
  ]
}

Желаемый результат:

digraph {
    graph [rankdir=UT]
    0 [label="f0<5.03515"]
    0 -> 1 [label="yes, missing" color="#0000FF"]
    0 -> 2 [label="no" color="#FF0000"]
    1 [label="f0<3.0743"]
    1 -> 3 [label="yes, missing" color="#0000FF"]
    1 -> 4 [label="no" color="#FF0000"]
    3 [label="leaf=0.5214074298536938"]
    4 [label="leaf=0.5396301973693495"]
    2 [label="f0<6.81955"]
    2 -> 5 [label="yes, missing" color="#0000FF"]
    2 -> 6 [label="no" color="#FF0000"]
    5 [label="leaf=0.5598299629669533"]
    6 [label="leaf=0.5917890109082163"]
}
...