Вопрос:
Я пытаюсь создать простое Дерево решений, используя 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?
Лучший ответ:
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() … Ответ №1
Вот один лайнер для тех, кто использует 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
Ответ №2
Если, как и я, у вас возникла проблема с установкой графика, вы можете визуализировать дерево
- экспортировать его с помощью export_graphviz, как показано в предыдущих ответах
- Откройте файл .dot в текстовом редакторе
- Скопируйте фрагмент кода и вставьте его @webgraphviz.com
Ответ №3
В качестве альтернативы вы можете попробовать использовать 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») … Ответ №4
Вы можете скопировать содержимое файла export_graphviz, и вы можете вставить его на сайт webgraphviz.com.
Вы можете проверить статью о визуализировать дерево решений в Python с помощью графического интерфейса для получения дополнительной информации.
Ответ №5
Если у вас 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’) Ответ №6
Я копирую и изменяю часть вашего кода, как показано ниже:
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 файл.
Ответ №7
Следующее также отлично работает:
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’)
Вы можете найти источник здесь
Ответ №8
Простой способ, основанный здесь с 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())