2015-07-03 10 views
8

benim DecisionTree görselleştirmek için çalışıyorum, ama hata alıyorum kodudur:Python, PyDot ve 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") 

Ve hata

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 

kimse bana açıklayabilir whats sorun? Çok teşekkür ederim!

Söz konusu hat akışı/dosya olarak kodlanmış olup olmadığını görmek için kontrol ediyor
+0

Bize tüm kodu gösteriyorsun? If deyimi, traceback'in işaret ettiğini görmüyorum. Bunun dışında, açıkça yöntem() ile başlayan "string" veya string dizisi ("st", "st2", "st3") olarak bir dizge bekler. Yanlış veri tipine beginwith() yöntem çağrısına geçtiniz. Ya doğru codecs.BOM_UTF8 kullanmıyorsanız veya bir dizeye döküm zorunda -> str (codecs.BOM_UTF8) – reticentroot

cevap

4

Aynı problemi yaşadım ve sadece birkaç saat t onun dışarı. Burada paylaştığım şeyin başkaları için işe yarayacağını garanti edemiyorum ama bu bir çekim olabilir.

  1. Ben resmi pydot paketlerin kurulumu denedim ama Python 3 var ve onlar sadece işe yaramadı. Aradan geçen birçok web sitesinden bir ipte bir not bulduktan sonra, this forked repository of pydot'u yükledim.
  2. graphviz.org'a gittim ve yazılımlarını Windows 7 makinem üzerine yükledim. Windows yoksa, sisteminizin İndirme bölümünün altına bakın. Başarılı sonra
  3. > Ortam değişkenleri (Control Panel\All Control Panel Items\System\Advanced system settings yılında, yüklemek System variables altında Environment Variables düğmesi> tıklayın ben değişken path bulundu>Edit... tıklayın> Ben Variable value: alanda sonuna ;C:\Program Files (x86)\Graphviz2.38\bin eklendi.
  4. Şimdi dot komutları kullanabilirsiniz onaylamak için Komut Satırı (Windows Komut İşlemci) 'de, ben dot - graphviz version 2.38.0 (20140413.2041) döndü dot -V yazdınız.

aşağıdaki kodda, benim panodan bir dataframe okuyorum unutmayın. Olabilirsin dosyadan veya whathaveyou'dan okumak. IPython kullanmıyorsanız

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

Alternatif olarak, (sürece graphviz kurduktan olarak komut satırından kendi resminizi oluşturabilir:

ipython Notebook yılında yukarıdaki adım 2). Yukarıda benim aynı örnek kodu kullanarak, modelin yerleştirilmesi sonra bu hattı kullanın:

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

sonra treepic.dot dosyanın nerede komut istemini açmak ve bu komut satırını girin:

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

bir .png dosyası karar ağacınızla oluşturulmalıdır.

0

UTF-8

yerine:

if data.startswith(codecs.BOM_UTF8): 

kullanımı: Büyük olasılıkla olacak

if codecs.BOM_UTF8 in data: 

devamı ...

+0

Bir veri onunla başlamak gerekiyorsa bu iki çizgi, oldukça eşdeğer değildir dikkat etmelidir o zaman ikincisi işe yaramayabilir. – Rick

+0

Bir dize yönteminde bir unicode arıyor. Çalışması olası değil. https://en.wikipedia.org/wiki/Byte_order_mark bkz – Incognos

+0

Sorunu tahmin onlar eşdeğer olmayabilir de, BOM bir dosyanın başında genellikle ve (gerçekten dosyayı mussed sürece) başka bir yerde kullanılmayan veri dosyasımda, nasıl göründüğünü bilen var mı? İlk dizenin her sütunda öznitelik adlarını içerdiği ve diğer dizelerin sayısal verileri içerdiği bir csv dosyası var. Yani benim X ve Y bir dosyadan sayısal veri, ben dosyayı görmeden – Polly

6

Python 3 kullanılması durumunda, sadece pydotplus yerine pydot kullanın. Ayrıca pip ile yumuşak bir yükleme işlemine sahip olacak.

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

birisi bunu sklearn belgelerine koyabilir mi? – maxymoo

+0

Bu en iyi tavsiyedir - Teşekkür ederim +1 Jupyter ile kullanıyorum yerine onu bir pdf içine yazdım ve çizgi çalıştıran bir çekicilik –

+0

Ayrıca yapabilirsiniz 'dot_data = tree.export_graphviz (clf, out_file = Yok) – mgcdanny