Почему только ребра родительского узла помечены в экспортированном дереве решений - PullRequest
0 голосов
/ 08 июня 2018

У меня есть обученный экземпляр DecisionTreeClassifier, и я на самом деле интересуюсь предикатами самого базового дерева решений. Так что мне нужен чистый способ прохождения этого дерева.

Так как единственный официальный способ получитьОбходное представление выполняется путем экспорта в файл graphviz / dot с использованием функции scikit export_graphviz.После этого я могу проанализировать и проанализировать графическое представление дерева, используя, например, комбинацию networkx и pydot.

Но ...

содержимое моего конкретного точечного файла выглядит следующим образом:

digraph Tree {

node [shape=box] ;

0 [label="X[0] <= 15.0\ngini = 0.75\nsamples = 8\nvalue = [2, 2, 2, 2]"] ;

1 [label="X[1] <= 3.0\ngini = 0.5\nsamples = 4\nvalue = [2, 0, 2, 0]"] ;

0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;

2 [label="gini = 0.0\nsamples = 2\nvalue = [0, 0, 2, 0]"] ;

1 -> 2 ;

3 [label="gini = 0.0\nsamples = 2\nvalue = [2, 0, 0, 0]"] ;

1 -> 3 ;

4 [label="X[1] <= 3.0\ngini = 0.5\nsamples = 4\nvalue = [0, 2, 0, 2]"] ;

0 -> 4 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;

5 [label="gini = 0.0\nsamples = 2\nvalue = [0, 0, 0, 2]"] ;

4 -> 5 ;

6 [label="gini = 0.0\nsamples = 2\nvalue = [0, 2, 0, 0]"] ;

4 -> 6 ;

}

Так что все выглядит хорошо и прекрасно, но почему подключены только краяк родительскому узлу, правильно обозначенному логическим значением?Не должны ли все ребра в этом графе иметь правильную логическую метку / атрибут, прикрепленный к нему ??

Или если существует какое-то странное соглашение о графике / точке, которое помогает мне отличить последующие ребра, каково правило?

Я заметил из документации scikit по классификатору дерева решений , что в приведенном в качестве примера дереве решений графического графического интерфейса на самом деле также отсутствуют логические метки.Что касается моего понимания деревьев решений, это оставляет важную информацию о дереве.Опять же есть какие-то соглашения, которые я здесь пропускаю?Например, левый край всегда неявно True?И как я могу узнать это из файла точек, поскольку он организован вертикально?

1 Ответ

0 голосов
/ 09 июня 2018

После того, как случайно наткнулся на пример на веб-сайте scikit-learn, я понял, что мне не нужно анализировать экспортированный файл точек, чтобы получить структуру дерева Python для представления моего построенного дерева решений.Очевидно, я могу использовать атрибут tree_ экземпляра DecisionTreeClassifier, который является открытым атрибутом в соответствии с официальной ссылкой API 1004 * (полностью внизу), и в нем есть документированный пример использованияэтот tree_ объект здесь .

Однако довольно странно - по крайней мере для меня - что этот объект дерева, по-видимому, представлен как часть DecisionTreeClassifier API и имеет документированныйпример того, как использовать его определенным образом, но нет официально опубликованной документации его базового класса sklearn.tree._tree.Tree.Вам просто нужно заглянуть в исходный код.

Что касается точечного файла, я теперь уверен, что его единственная цель - просто визуализировать дерево решений.Этот вывод подтверждается после просмотра исходного кода из export_graphviz, где я заметил, что он действительно жестко запрограммирован, чтобы пропустить только метки краев для тех, которые связаны с родителем.export_graphviz использует атрибут tree_ DecisionTreeClassifier.И исходя из способа использования этого атрибута, я думаю, вы можете смело сделать вывод, что он всегда сначала записывает ребро «Истина», прежде чем записывает ребро «Ложь» для любого узла.ИМХО, это оправдывает запрос функции, позволяющий пометить все ребра с учетом определенного флага параметра.

...