2015-07-03 29 views
8

Sto cercando di visualizzare il mio DecisionTree, ma ottenere l'errore Il codice è:Python, PyDot e 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") 

E l'errore è

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 

Qualcuno mi può spiegare che cosa è il problema? Grazie mille!

+0

Ci stai mostrando tutto il codice? Non vedo la dichiarazione if che indica il traceback. Oltre a questo, ovviamente il metodo startswith() si aspetta una stringa come input "stringa" o una tupla di stringhe ("st", "st2", "st3"). Hai passato il tipo di dati sbagliato nella chiamata al metodo startswith(). O non stai usando correttamente codecs.BOM_UTF8, o devi lanciarlo su una stringa -> str (codecs.BOM_UTF8) – reticentroot

risposta

4

Ho avuto lo stesso esatto problema e ho appena passato un paio d'ore cercando di capire il suo fuori. Non posso garantire che ciò che condivido qui funzionerà per gli altri, ma potrebbe valerne la pena.

  1. Ho provato a installare i pacchetti ufficiali pydot ma ho Python 3 e semplicemente non hanno funzionato. Dopo aver trovato una nota in una discussione da uno dei tanti siti Web da cui sono uscito, ho finito con l'installare this forked repository of pydot.
  2. Sono andato a graphviz.org e ho installato il loro software sul mio computer Windows 7. Se non hai Windows, guarda sotto la sezione Download del tuo sistema.
  3. Dopo il successo di montaggi, in Variabili d'ambiente (Control Panel\All Control Panel Items\System\Advanced system settings> cliccare Environment Variables pulsante> sotto System variables ho trovato la variabile path> cliccare Edit...> Ho aggiunto ;C:\Program Files (x86)\Graphviz2.38\bin alla fine nel campo Variable value:.
  4. Per confermare Ora posso usare dot comandi nella riga di comando (Command Processor Windows), ho digitato dot -V che ha restituito dot - graphviz version 2.38.0 (20140413.2041).

nel codice qui sotto, tenere a mente che sto leggendo un dataframe dal mio appunti. Si potrebbe essere leggendolo dal file o da cosa.

In 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

In alternativa, se non si sta usando IPython, è possibile generare la propria immagine dalla riga di comando fino a quando si hanno graphviz installato (punto 2 sopra). Usando il mio stesso codice esempio di cui sopra, si utilizza questa linea dopo il montaggio del modello:

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

poi aprono prompt dei comandi in cui il file è treepic.dot e immettere questa riga di comando:

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

Un file .png dovrebbe essere creato con il tuo albero decisionale.

0

La linea in questione è il controllo per vedere se il/file di flusso è codificato come UTF-8

Invece di:

if data.startswith(codecs.BOM_UTF8): 

uso:

if codecs.BOM_UTF8 in data: 

Si dovrà probabilmente più successo ...

+0

Si noti che queste due righe non sono del tutto equivalenti, se i dati devono iniziare con esso allora il secondo potrebbe non funzionare. – Rick

+0

Sta cercando un unicode in un metodo stringa. Non è probabile che funzioni. Anche se potrebbero non essere equivalenti, la distinta base è solitamente all'inizio di un file e non viene utilizzata da nessun'altra parte (a meno che tu non abbia veramente perso il tuo file) vedi https://en.wikipedia.org/wiki/Byte_order_mark – Incognos

+0

Immagino che il problema è nel mio file di dati, qualcuno sa come dovrebbe essere? Ho un file CSV, dove la prima stringa contiene i nomi degli attributi in ogni colonna, e le ulteriori stringhe contengono dati numerici. Quindi i miei X e Y sono i dati numerici di un file, li ho fatti fare "skiprows = 1" quando apri il mio file – Polly

6

In caso di utilizzo di Python 3, basta usare pydotplus anziché pydot. Avrà anche un processo di installazione soft tramite pip.

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

qualcuno può inserire questo nella documentazione di sklearn? – maxymoo

+0

Questo è il miglior consiglio - grazie +1 l'ho usato con 'Image (graph.create_png())' su Jupyter invece di scriverlo in un pdf e ha funzionato un fascino –

+0

Puoi anche fare 'dot_data = tree.export_graphviz (clf, out_file = Nessuno) ' – mgcdanny