2015-07-03 5 views
8

Я пытаюсь представить себе мою DecisionTree, но получаю ошибку Код:Python, PyDot и DecisionTree

X = [i[1:] for i in dataset]#attribute 
y = [i[0] for i in dataset] 
clf = tree.DecisionTreeClassifier() 

dot_data = StringIO() 
tree.export_graphviz(clf.fit(train_X, train_y), out_file=dot_data) 
graph = pydot.graph_from_dot_data(dot_data.getvalue()) 
graph.write_pdf("tree.pdf") 

И ошибка

Traceback (most recent call last): 
if data.startswith(codecs.BOM_UTF8): 
TypeError: startswith first arg must be str or a tuple of str, not bytes 

Может кто-нибудь объяснить мне, Что проблема? Большое спасибо!

+0

Вы показываете нам весь код? Я не вижу инструкции if, указывающей трассировку. Кроме этого, очевидно, что метод startswith() ожидает либо строку как входную строку, либо кортеж строк («st», «st2», «st3»). Вы передали неправильный тип данных в вызов метода startswith(). Либо вы не используете codecs.BOM_UTF8 правильно, либо вам нужно передать его в строку -> str (codecs.BOM_UTF8) – reticentroot

ответ

4

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

  1. Я попытался установить официальные пакеты pydot, но у меня есть Python 3, и они просто не работают. Найдя заметку в потоке с одного из многих сайтов, которые я пробрал, я закончил установку this forked repository of pydot.
  2. Я пошел в graphviz.org и установил их программное обеспечение на своей машине с Windows 7. Если у вас нет Windows, посмотрите в разделе «Загрузка» для своей системы.
  3. После успешной установки в переменных окружения (Control Panel\All Control Panel Items\System\Advanced system settings> нажмите Environment Variables кнопку> под System variables я нашел переменную path> нажмите Edit...> Я добавил ;C:\Program Files (x86)\Graphviz2.38\bin до конца в Variable value: поле.
  4. Для подтверждения теперь я могу использовать dot команды в командной строке (Windows Command Processor), я напечатал dot -V, возвращающей dot - graphviz version 2.38.0 (20140413.2041).

в коде ниже, имейте в виду, что я читал dataframe из моего буфера обмена. Вы можете быть чтение его из файла или whathaveyou.

В IPython Notebook:

import pandas as pd 
import numpy as np 
from sklearn import tree 
import pydot 
from IPython.display import Image 
from sklearn.externals.six import StringIO 

df = pd.read_clipboard() 
X = df[df.columns[:-1]] 
y = df[df.columns[-1]] 

dtr = tree.DecisionTreeRegressor(max_depth=3) 
dtr.fit(X, y) 

dot_data = StringIO() 
tree.export_graphviz(dtr, out_file=dot_data, feature_names=X.columns) 
graph = pydot.graph_from_dot_data(dot_data.getvalue()) 
Image(graph.create_png()) 

Decision Tree Visualization

В качестве альтернативы, если вы не используете IPython, вы можете создать свой собственный образ из командной строки до тех пор, как вы Graphviz установили (шаг 2 выше). Используя мой же пример кода выше, вы используете эту строку после подгонки модели:

tree.export_graphviz(dtr.tree_, out_file='treepic.dot', feature_names=X.columns) 

затем откройте командную строку, где файл treepic.dot это и введите команду:

dot -T png treepic.dot -o treepic.png 

файл .png должен быть создан с вашим деревом решений.

0

линия в вопросе проверки, чтобы увидеть, если поток/файл кодируется как UTF-8

Вместо:

if data.startswith(codecs.BOM_UTF8): 

использование:

if codecs.BOM_UTF8 in data: 

Вы, вероятно, придется больше успеха ...

+0

Следует отметить, что эти две строки не совсем эквивалентны, если данные должны начинаться с нее то второй может не работать. – Rick

+0

Он ищет юникод в строковом методе. Не работает. Хотя они могут и не быть эквивалентными, спецификация обычно находится в начале файла и не используется нигде (если вы действительно не перепутали ваш файл) см. Https://en.wikipedia.org/wiki/Byte_order_mark – Incognos

+0

Я предполагаю, что проблема в моем файле данных, кто-нибудь знает, как он должен выглядеть? У меня есть файл csv, где первая строка содержит имена атрибутов в каждом столбце, а дальнейшие строки содержат числовые данные. Таким образом, мои X и Y являются числовыми данными из файла, у меня есть их создание «skiprows = 1» при открытии моего файла – Polly

6

В случае использования Python 3, просто используйте pydotplus вместо pydot. Он также будет иметь мягкий процесс установки по протоколу.

import pydotplus 

<your code> 

dot_data = StringIO() 
tree.export_graphviz(clf, out_file=dot_data) 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
graph.write_pdf("iris.pdf") 
+0

может кто-то поставить это на документацию sklearn? – maxymoo

+0

Это лучшее пособие - спасибо +1 Я использовал его с помощью 'Image (graph.create_png())' на Jupyter вместо того, чтобы записывать его в PDF-файл, а работая в виде строки charm –

+0

Вы также можете сделать 'dot_data = tree.export_graphviz (clf, out_file = None) ' – mgcdanny