sklearn.tree.export_graphviz альтернативы

Можно визуализировать деревья решений, используя pydotplus из pypi, но у него есть проблемы на моей машине (он говорит, что он не был собран с помощью libexpat, и поэтому он показывает только число на узле вместо таблицы с некоторой информацией), и я бы нравится использовать альтернативу. Я уже пытался использовать networkx, но для чтения файлов .dot и создания из них графика networkx требуется pygraphviz. Когда я попытался установить его с помощью pip, это также не удалось.

Так что теперь я ищу альтернативный способ визуализации деревьев решений, который можно установить с помощью pip или anaconda.

Какие альтернативы существуют?

ИЗМЕНИТЬ №1

Выход conda list:

# packages in environment at /home/xiaolong/development/anaconda3/envs/coursera_ml_classification:
#
alabaster                 0.7.7                    py34_0    defaults
awscli                    1.6.2                     <pip>
babel                     2.3.3                    py34_0    defaults
backports                 1.0                      py34_0    defaults
backports-abc             0.4                       <pip>
backports.shutil-get-terminal-size 1.0.0                     <pip>
backports_abc             0.4                      py34_0    defaults
bcdoc                     0.12.2                    <pip>
boto                      2.33.0                    <pip>
botocore                  0.73.0                    <pip>
cairo                     1.12.18                       6    defaults
certifi                   2015.4.28                 <pip>
colorama                  0.2.5                     <pip>
cycler                    0.10.0                   py34_0    defaults
decorator                 4.0.9                    py34_0    defaults
docutils                  0.12                     py34_0    defaults
entrypoints               0.2                      py34_1    defaults
expat                     2.1.0                         0    defaults
fontconfig                2.11.1                        5    defaults
freetype                  2.5.5                         0    defaults
get_terminal_size         1.0.0                    py34_0    defaults
glib                      2.43.0                        2    asmeurer
graphviz                  2.38.0                        1    defaults
harfbuzz                  0.9.39                        0    defaults
imagesize                 0.7.0                    py34_0    defaults
ipykernel                 4.3.1                    py34_0    defaults
ipython                   4.2.0                    py34_0    defaults
ipython-genutils          0.1.0                     <pip>
ipython_genutils          0.1.0                    py34_0    defaults
ipywidgets                4.1.1                    py34_0    defaults
jedi                      0.9.0                    py34_0    defaults
jinja2                    2.8                      py34_0    defaults
jmespath                  0.5.0                     <pip>
jsonschema                2.5.1                    py34_0    defaults
jupyter                   1.0.0                    py34_2    defaults
jupyter-client            4.2.2                     <pip>
jupyter-console           4.1.1                     <pip>
jupyter-core              4.1.0                     <pip>
jupyter_client            4.2.2                    py34_0    defaults
jupyter_console           4.1.1                    py34_0    defaults
jupyter_core              4.1.0                    py34_0    defaults
libffi                    3.2.1                         0    defaults
libgcc                    5.2.0                         0    defaults
libgfortran               3.0.0                         1    defaults
libpng                    1.6.17                        0    defaults
libsodium                 1.0.3                         0    defaults
libxml2                   2.9.2                         0    defaults
llvmlite                  0.10.0                   py34_0    defaults
markupsafe                0.23                     py34_0    defaults
matplotlib                1.5.1               np111py34_0    defaults
mistune                   0.7.2                    py34_0    defaults
mkl                       11.3.1                        0    defaults
multipledispatch          0.4.8                     <pip>
nbconvert                 4.2.0                    py34_0    defaults
nbformat                  4.0.1                    py34_0    defaults
notebook                  4.2.0                    py34_0    defaults
numpy                     1.11.0                   py34_0    defaults
openssl                   1.0.2h                        0    defaults
pandas                    0.18.1              np111py34_0    defaults
pango                     1.39.0                        0    defaults
path.py                   8.2.1                    py34_0    defaults
pep8                      1.7.0                    py34_0    defaults
pexpect                   4.0.1                    py34_0    defaults
pickleshare               0.5                      py34_0    defaults
pip                       8.1.1                    py34_1    defaults
pixman                    0.32.6                        0    defaults
prettytable               0.7.2                     <pip>
psutil                    4.1.0                    py34_0    defaults
ptyprocess                0.5                      py34_0    defaults
pyasn1                    0.1.9                     <pip>
pydotplus                 2.0.2                    py34_0    file:///home/xiaolong/development/anaconda3/conda-bld/linux-64/pydotplus-2.0.2-py34_0.tar.bz2
pyflakes                  1.1.0                    py34_0    defaults
pygments                  2.1.3                    py34_0    defaults
pyparsing                 2.1.1                    py34_0    defaults
pyqt                      4.11.4                   py34_1    defaults
python                    3.4.4                         0    defaults
python-contrib-nbextensions alpha                     <pip>
python-dateutil           2.5.2                    py34_0    defaults
pytz                      2016.3                   py34_0    defaults
pyyaml                    3.11                      <pip>
pyzmq                     15.2.0                   py34_0    defaults
qt                        4.8.7                         1    defaults
qtconsole                 4.2.1                    py34_0    defaults
readline                  6.2                           2    defaults
requests                  2.9.1                     <pip>
rope                      0.9.4                    py34_1    defaults
rope-py3k                 0.9.4.post1               <pip>
rsa                       3.1.2                     <pip>
scikit-learn              0.17.1              np111py34_0    defaults
scipy                     0.17.0              np111py34_3    defaults
setuptools                20.7.0                   py34_0    defaults
sframe                    1.8.5                     <pip>
simplegeneric             0.8.1                    py34_0    defaults
sip                       4.16.9                   py34_0    defaults
six                       1.10.0                   py34_0    defaults
snowballstemmer           1.2.1                    py34_0    defaults
sphinx                    1.4.1                    py34_0    defaults
sphinx-rtd-theme          0.1.9                     <pip>
sphinx_rtd_theme          0.1.9                    py34_0    defaults
spyder                    2.3.8                    py34_1    defaults
sqlite                    3.9.2                         0    defaults
terminado                 0.5                      py34_1    defaults
tk                        8.5.18                        0    defaults
tornado                   4.3                      py34_0    defaults
traitlets                 4.2.1                    py34_0    defaults
wheel                     0.29.0                   py34_0    defaults
xz                        5.0.5                         1    defaults
zeromq                    4.1.3                         0    defaults
zlib                      1.2.8                         0    defaults

Версия SciPy: 0.17.0

digraph Tree {
node [shape=box, style="filled", color="black"] ;
0 [label="grade.B <= 0.5\ngini = 0.5\nsamples = 37224\nvalue = [18476, 18748]", fillcolor="#399de504"] ;
1 [label="grade.C <= 0.5\ngini = 0.4973\nsamples = 32094\nvalue = [17218, 14876]", fillcolor="#e5813923"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="gini = 0.4829\nsamples = 21728\nvalue = [12875, 8853]", fillcolor="#e5813950"] ;
1 -> 2 ;
3 [label="gini = 0.4869\nsamples = 10366\nvalue = [4343, 6023]", fillcolor="#399de547"] ;
1 -> 3 ;
4 [label="grade.A <= 14.8301\ngini = 0.3702\nsamples = 5130\nvalue = [1258, 3872]", fillcolor="#399de5ac"] ;
0 -> 4 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
5 [label="gini = 0.3555\nsamples = 4987\nvalue = [1153, 3834]", fillcolor="#399de5b2"] ;
4 -> 5 ;
6 [label="gini = 0.3902\nsamples = 143\nvalue = [105, 38]", fillcolor="#e58139a3"] ;
4 -> 6 ;
}

ИЗМЕНИТЬ №2

Я запрограммировал это в блокноте Jupyter, но в нем есть ошибка, связанная с тем, что SVG не окрашивается, если вы пытаетесь отобразить SVG, используя:

![Decision Tree]('dtree.svg')

Я нашел обходной путь здесь:

from IPython.display import HTML

svg = None
with open('dtree.svg') as svg_file:
    svg = svg_file.read()

HTML(svg)

person Zelphir Kaltstahl    schedule 12.05.2016    source источник


Ответы (2)


Это не самое привлекательное решение, но я использую интерфейс командной строки Grapviz (он называется dot), вызываемый через subprocess, я на Mac, поэтому я установил его с помощью homebrew, но вы можете скачать двоичные файлы для других платформ со страницы загрузок. Вот пример использования набора данных Titanic:

import pandas as pd
import subprocess
import seaborn.apionly as sns
fromwd sklearn.preprocessing import Imputer
from sklearn.tree import DecisionTreeClassifier, export_graphviz

raw_data = sns.load_dataset('titanic')
predictors = ['pclass','sex','age','sibsp','parch','fare','embarked','alone','adult_male']
categorical = ['sex','embarked']
numeric = [c for c in predictors if c not in categorical]
target='survived'

encoded_data = pd.get_dummies(raw_data[predictors], columns=categorical)

imputer = Imputer()
X = imputer.fit_transform(encoded_data).astype('float32')
Y = raw_data[target].astype('float32')

model = DecisionTreeClassifier(min_samples_leaf=10, max_depth=3)
model.fit(X, Y)

export_graphviz(model,
                out_file='tree.dot',
                feature_names=encoded_data.columns,
                proportion=True,
                filled=True,
                impurity=False)

subprocess.call(['dot', '-Tpdf', 'tree.dot', '-o' 'tree.pdf'])
person maxymoo    schedule 12.05.2016
comment
~~ Пробовал и работает. Однако раскраска отсутствует на графике. Есть ли простое решение для этого?~~ Nvm, цвет исходит от pydotplus, который, в свою очередь, не может правильно отображать метки, поэтому я выбираю ваш выбор. - person Zelphir Kaltstahl; 12.05.2016
comment
я получаю цвета на своем, на какой платформе вы находитесь? - person maxymoo; 13.05.2016
comment
Я на Linux, но дело в том, что pydotplus также выдает мне предупреждение о том, что он не был собран с libexpat, и я не нашел способа исправить это и установить его в virtualenv, используя pip или лучше anaconda. Так что без libexpat он не может отображать табличные данные как метки узлов. Однако, если я использую сам инструмент dot, как предложено в ответе, кажется, что в моих точечных файлах нет информации о цвете, поэтому кажется вполне логичным, что ее нет ни в одной графике, созданной из точечного файла. Я где-то ошибся? Цвета были бы хороши в конце концов :) - person Zelphir Kaltstahl; 13.05.2016
comment
Вы используете последнюю версию sklearn? в моем точечном файле есть информация о цвете, первый узел [label="adult_male <= 0.5\nsamples = 100.0%\nvalue = [0.62, 0.38]", fillcolor="#e5813960"] ; - person maxymoo; 13.05.2016
comment
Я снова пересмотрел свой код, и что вы знаете, я забыл добавить filled=True. Однако даже со значениями fillcolor в точечном файле и цветами в выходном SVG, который я создаю, блокнот по-прежнему показывает черно-белый SVG. Возможно, это проблема браузера с цветным SVG или проблема с ноутбуком Jupyter. - person Zelphir Kaltstahl; 13.05.2016
comment
Нашел обходной путь для проблемы с ноутбуком. Спасибо, что заявили, что у вас есть цвет на вашем конце, я, возможно, не проверял это снова! Теперь у меня есть именно та визуализация, которую я хотел. - person Zelphir Kaltstahl; 13.05.2016
comment
рад, что у вас это работает. как вы отображаете svg в блокноте .. вам пришлось вручную связать его? - person maxymoo; 19.05.2016
comment
Ознакомьтесь с ОП или этим: github.com/scikit-learn/scikit- узнать/проблемы/6522 :) - person Zelphir Kaltstahl; 19.05.2016

Начиная с версии 0.21 scikit-learn имеет plot_tree метод построения дерева с помощью matplotlib.

Код для использования plot_tree:

from sklearn import tree
# the clf is Decision Tree object
tree.plot_tree(clf,feature_names=iris.feature_names,  
                   class_names=iris.target_names,
                   filled=True)

Альтернативой графикам sklearn может быть пакет dtreeviz. Пример дерева ниже. Код для использования dtreeviz:

from dtreeviz.trees import dtreeviz # remember to load the package
# the clf is Decision Tree object
viz = dtreeviz(clf, X, y,
                target_name="target",
                feature_names=iris.feature_names,
                class_names=list(iris.target_names))

viz

Вы можете найти сравнение различных методов построения дерева scikit-learn здесь.

Визуализация дерева решений dtreeviz

person pplonski    schedule 24.06.2020
comment
Это выглядит действительно хорошо. Не могли бы вы привести код для генерации? Это улучшит ваш ответ. - person Zelphir Kaltstahl; 24.06.2020