2015-07-03 12 views
8

Tôi đang cố gắng để hình dung DecisionTree của tôi, nhưng nhận được lỗi Mã này là:Python, PyDot và 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") 

Và lỗi là

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 

thể bất cứ ai giải thích cho tôi whats vấn đề? Cảm ơn bạn rất nhiều!

+0

Bạn có hiển thị cho chúng tôi tất cả mã không? Tôi không thấy câu lệnh if rằng truy nguyên được chỉ ra. Ngoài ra, rõ ràng là phương thức startswith() dự kiến ​​hoặc là một chuỗi là đầu vào "chuỗi" hoặc một chuỗi các chuỗi ("st", "st2", "st3"). Bạn đã truyền vào kiểu dữ liệu sai trong lời gọi phương thức startswith(). Hoặc bạn không sử dụng codec.BOM_UTF8 một cách chính xác, hoặc bạn phải chuyển nó thành chuỗi -> str (codecs.BOM_UTF8) – reticentroot

Trả lời

4

Tôi có cùng một vấn đề chính xác và chỉ dành một vài giờ cố gắng tìm t của anh ấy. Tôi không thể đảm bảo những gì tôi chia sẻ ở đây sẽ làm việc cho những người khác nhưng nó có thể có giá trị một shot.

  1. Tôi đã cố gắng cài đặt các gói pydot chính thức nhưng tôi có Python 3 và đơn giản là chúng không hoạt động. Sau khi tìm thấy một ghi chú trong một chủ đề từ một trong nhiều trang web mà tôi đã lướt qua, tôi đã cài đặt this forked repository of pydot.
  2. Tôi đã truy cập graphviz.org và cài đặt phần mềm của họ trên máy tính Windows 7 của tôi. Nếu bạn không có Windows, hãy xem phần Tải xuống cho hệ thống của bạn.
  3. Sau khi cài đặt thành công, trong Environment Variables (Control Panel\All Control Panel Items\System\Advanced system settings> nhấp Environment Variables nút> dưới System variables tôi thấy biến path> nhấp Edit...> Tôi thêm ;C:\Program Files (x86)\Graphviz2.38\bin đến cuối trong lĩnh vực Variable value:.
  4. Để xác nhận bây giờ tôi có thể sử dụng dot lệnh trong dòng lệnh (Windows Command Processor), tôi gõ dot -V mà trở dot - graphviz version 2.38.0 (20140413.2041).

trong đoạn mã dưới đây, hãy ghi nhớ rằng tôi đang đọc một dataframe từ clipboard của tôi. Bạn có thể đọc nó từ tập tin hoặc whathaveyou.

Trong 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

Ngoài ra, nếu bạn không sử dụng IPython, bạn có thể tạo ra hình ảnh riêng của bạn từ dòng lệnh miễn là bạn đã cài đặt graphviz (bước 2 ở trên). Sử dụng cùng một mã ví dụ của tôi ở trên, bạn sử dụng dòng này sau khi lắp mô hình:

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

sau đó mở lên cửa sổ lệnh mà tập tin treepic.dot là và nhập dòng lệnh sau:

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

Một file .png nên được tạo bằng cây quyết định của bạn.

0

Dòng trong câu hỏi là kiểm tra để xem nếu dòng/tập tin được mã hóa theo UTF-8

Thay vì:

if data.startswith(codecs.BOM_UTF8): 

sử dụng:

if codecs.BOM_UTF8 in data: 

Bạn có thể sẽ có thành công hơn ...

+0

Bạn nên lưu ý rằng hai dòng này không hoàn toàn tương đương, nếu dữ liệu cần bắt đầu bằng thì cái thứ hai có thể không hoạt động. – Rick

+0

Ông đang tìm kiếm một unicode trong một phương pháp chuỗi. Không có khả năng làm việc. Mặc dù chúng có thể không tương đương, nhưng BOM thường ở đầu tệp và không được sử dụng ở bất kỳ nơi nào khác (trừ khi bạn thực sự mussed lên tệp của mình) xem https://en.wikipedia.org/wiki/Byte_order_mark – Incognos

+0

Tôi đoán vấn đề trong tệp dữ liệu của tôi, có ai biết nó trông như thế nào không? Tôi có một tệp csv, trong đó chuỗi đầu tiên chứa tên của các thuộc tính trong mỗi cột và các chuỗi tiếp theo chứa dữ liệu số. Vì vậy, X và Y của tôi là dữ liệu số từ một tệp, tôi đã khiến họ tạo "skiprows = 1" khi mở tệp của tôi – Polly

6

Trong trường hợp sử dụng Python 3, chỉ cần sử dụng pydotplus thay vì pydot. Nó cũng sẽ có một quá trình cài đặt mềm bằng 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

ai đó có thể đặt tài liệu này trên tài liệu sklearn? – maxymoo

+0

Đây là lời khuyên tốt nhất - cảm ơn bạn +1 Tôi đã sử dụng nó với 'Image (graph.create_png())' trên Jupyter thay vì viết nó thành một dòng pdf và làm việc một nét duyên dáng –

+0

Bạn cũng có thể làm 'dot_data = tree.export_graphviz (clf, out_file = Không có) ' – mgcdanny