Визуализация дерева решений в scikit-learn

Я пытаюсь создать простое Дерево решений, используя scikit-learn в Python (я использую Anaconda Ipython Notebook с Python 2.7.3 в ОС Windows) и визуализирую его следующим образом:

from pandas import read_csv, DataFrame
from sklearn import tree
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")

Однако я получаю следующую ошибку:

AttributeError: 'NoneType' object has no attribute 'close'

Я использую следующий пост в блоге в качестве ссылки: ссылка в Blogpost

Следующий вопрос stackoverflow, похоже, не работает для меня: Question

Может ли кто-нибудь помочь мне в том, как визуализировать дерево решений в scikit-learn?

Ответы

Ответ 1

sklearn.tree.export_graphviz ничего не возвращает, и поэтому по умолчанию возвращается None.

Выполняя dotfile = tree.export_graphviz(...), вы перезаписываете свой открытый файл-объект, который ранее был назначен dotfile, поэтому вы получаете сообщение об ошибке при попытке закрыть файл (как сейчас None).

Чтобы исправить это, измените свой код на

...
dotfile = open("D:/dtree2.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...

Ответ 2

Вот один лайнер для тех, кто использует jupyter и sklearn (18. 2+) Для этого вам даже не нужен matplotlib. Единственным требованием является graphviz

pip install graphviz

чем запуск (согласно коду, о котором идет речь, X является панда DataFrame)

from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))

Это отобразит его в формате SVG. Код выше создает объект источника Graphviz Source (source_code - не страшно). Это будет отображаться непосредственно в jupyter.

Некоторые вещи, которые вы, вероятно, будете делать с ним

Отобразите его в jupter:

from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format='svg'))

Сохранить как png:

graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = 'png'
graph.render('dtree_render',view=True)

Получите png-изображение, сохраните его и просмотрите:

graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
png_bytes = graph.pipe(format='png')
with open('dtree_pipe.png','wb') as f:
    f.write(png_bytes)

from IPython.display import Image
Image(png_bytes)

Если вы собираетесь играть с этой библиотекой, здесь приведены ссылки на примеры и userguide

Ответ 3

Если, как и я, у вас возникла проблема с установкой графика, вы можете визуализировать дерево

  • экспортировать его с помощью export_graphviz, как показано в предыдущих ответах
  • Откройте файл .dot в текстовом редакторе
  • Скопируйте фрагмент кода и вставьте его @webgraphviz.com

Ответ 4

В качестве альтернативы вы можете попробовать использовать pydot для создания файла png из точки:

...
tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file

import pydot
dotfile = StringIO()
tree.export_graphviz(dtreg, out_file=dotfile)
pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png")
...

Ответ 6

Если у вас Source.from_file проблемы с захватом исходного.dot, вы также можете использовать Source.from_file следующим образом:

from graphviz import Source
from sklearn import tree
tree.export_graphviz(dtreg, out_file='tree.dot', feature_names=X.columns)
Source.from_file('tree.dot')

Ответ 7

Я копирую и изменяю часть вашего кода, как показано ниже:

from pandas import read_csv, DataFrame
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from os import system

data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)

Убедившись, что у вас есть dtree, что означает, что вышеприведенный код работает хорошо, вы добавляете приведенный ниже код для визуализации дерева решений:

Не забудьте сначала установить graphviz: pip install graphviz

import graphviz 
from graphviz import Source
dot_data = tree.export_graphviz(dtree, out_file=None, feature_names=X.columns)
graph = graphviz.Source(dot_data) 
graph.render("name of file",view = True)

Я попытался с моими данными, визуализация работала хорошо, и я сразу же получил PDF файл.

Ответ 8

Следующее также отлично работает:

from sklearn.datasets import load_iris
iris = load_iris()

# Model (can also use single decision tree)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)

# Train
model.fit(iris.data, iris.target)
# Extract single tree
estimator = model.estimators_[5]

from sklearn.tree import export_graphviz
# Export as dot file
export_graphviz(estimator, out_file='tree.dot', 
                feature_names = iris.feature_names,
                class_names = iris.target_names,
                rounded = True, proportion = False, 
                precision = 2, filled = True)

# Convert to png using system command (requires Graphviz)
from subprocess import call
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])

# Display in jupyter notebook
from IPython.display import Image
Image(filename = 'tree.png')

enter image description here

Вы можете найти источник здесь

Ответ 9

Простой способ, основанный здесь с pydotplus (необходимо установить graphviz):

from IPython.display import Image  
from sklearn import tree
import pydotplus # installing pyparsing maybe needed

...

dot_data = tree.export_graphviz(best_model, out_file=None, feature_names = X.columns)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())