Визуализация дерева решений в 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")
...
Ответ 5
Вы можете скопировать содержимое файла export_graphviz, и вы можете вставить его на сайт webgraphviz.com.
Вы можете проверить статью о визуализировать дерево решений в Python с помощью графического интерфейса для получения дополнительной информации.
Ответ 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())