2012-05-13 26 views
9

Tôi là một noob trong việc sử dụng sciki-learn vì vậy hãy chịu với tôi.Trực quan hóa cây quyết định (ví dụ từ học tiếng scikit)

tôi đang trải qua ví dụ: http://scikit-learn.org/stable/modules/tree.html#tree

>>> from sklearn.datasets import load_iris 
>>> from sklearn import tree 
>>> iris = load_iris() 
>>> clf = tree.DecisionTreeClassifier() 
>>> clf = clf.fit(iris.data, iris.target) 
>>> from StringIO import StringIO 
>>> out = StringIO() 
>>> out = tree.export_graphviz(clf, out_file=out) 

Rõ ràng file graphiz đã sẵn sàng để sử dụng.

Nhưng làm cách nào để vẽ cây bằng tệp graphiz? (ví dụ đã không đi vào chi tiết như thế nào cây được rút ra).

Mã mẫu và mẹo được hoan nghênh hơn!

Cảm ơn!


Cập nhật

Tôi đang sử dụng ubuntu 12.04, Python 2.7.3

Trả lời

6

Những hệ điều hành nào bạn chạy? Bạn đã cài đặt graphviz chưa?

Trong ví dụ của bạn, StringIO() đối tượng, tổ chức dữ liệu graphviz, đây là một cách để kiểm tra dữ liệu:

... 
>>> print out.getvalue() 

digraph Tree { 
0 [label="X[2] <= 2.4500\nerror = 0.666667\nsamples = 150\nvalue = [ 50. 50. 50.]", shape="box"] ; 
1 [label="error = 0.0000\nsamples = 50\nvalue = [ 50. 0. 0.]", shape="box"] ; 
0 -> 1 ; 
2 [label="X[3] <= 1.7500\nerror = 0.5\nsamples = 100\nvalue = [ 0. 50. 50.]", shape="box"] ; 
0 -> 2 ; 
3 [label="X[2] <= 4.9500\nerror = 0.168038\nsamples = 54\nvalue = [ 0. 49. 5.]", shape="box"] ; 
2 -> 3 ; 
4 [label="X[3] <= 1.6500\nerror = 0.0407986\nsamples = 48\nvalue = [ 0. 47. 1.]", shape="box"] ; 
3 -> 4 ; 
5 [label="error = 0.0000\nsamples = 47\nvalue = [ 0. 47. 0.]", shape="box"] ; 
4 -> 5 ; 
6 [label="error = 0.0000\nsamples = 1\nvalue = [ 0. 0. 1.]", shape="box"] ; 
4 -> 6 ; 
7 [label="X[3] <= 1.5500\nerror = 0.444444\nsamples = 6\nvalue = [ 0. 2. 4.]", shape="box"] ; 
3 -> 7 ; 
8 [label="error = 0.0000\nsamples = 3\nvalue = [ 0. 0. 3.]", shape="box"] ; 
7 -> 8 ; 
9 [label="X[0] <= 6.9500\nerror = 0.444444\nsamples = 3\nvalue = [ 0. 2. 1.]", shape="box"] ; 
7 -> 9 ; 
10 [label="error = 0.0000\nsamples = 2\nvalue = [ 0. 2. 0.]", shape="box"] ; 
9 -> 10 ; 
11 [label="error = 0.0000\nsamples = 1\nvalue = [ 0. 0. 1.]", shape="box"] ; 
9 -> 11 ; 
12 [label="X[2] <= 4.8500\nerror = 0.0425331\nsamples = 46\nvalue = [ 0. 1. 45.]", shape="box"] ; 
2 -> 12 ; 
13 [label="X[0] <= 5.9500\nerror = 0.444444\nsamples = 3\nvalue = [ 0. 1. 2.]", shape="box"] ; 
12 -> 13 ; 
14 [label="error = 0.0000\nsamples = 1\nvalue = [ 0. 1. 0.]", shape="box"] ; 
13 -> 14 ; 
15 [label="error = 0.0000\nsamples = 2\nvalue = [ 0. 0. 2.]", shape="box"] ; 
13 -> 15 ; 
16 [label="error = 0.0000\nsamples = 43\nvalue = [ 0. 0. 43.]", shape="box"] ; 
12 -> 16 ; 
} 

bạn có thể viết nó như .dot file và sản xuất sản lượng hình ảnh, như thể hiện trong nguồn mà bạn liên kết:

$ dot -Tpng tree.dot -o tree.png (đầu ra định dạng PNG)

+0

Xin cảm ơn! Tôi đang sử dụng Ubuntu 12.04, Python phiên bản 2.7.3. Tôi đã tự hỏi nếu có anyway tôi có thể làm điều đó trong kịch bản python và không phải trong dòng lệnh? – DjangoRocks

+1

Chắc chắn, chỉ cần lấy một trong những [Python bindings to graphviz] (https://www.google.com/search?q=python+graphviz+binding) và bạn sẽ có thể làm điều đó từ bên trong shell python – theta

+0

cảm ơn! đó là hữu ích! – DjangoRocks

4

Bạn đã rất thân thiết! Chỉ cần làm:

graph_from_dot_data(out.getvalue()).write_pdf("somefile.pdf") 
+1

điều này sẽ chỉ hoạt động nếu # lớp nhỏ đủ để các mảng nvalue trong văn bản không bị hỏng trên các dòng ... trong trường hợp này, tôi phải tìm kiếm/thay thế bằng tay \ n bằng '' (bảo toàn các giá trị hợp lệ, của tất nhiên) ... hơi đau. ditto cho các nhãn được mã hóa một lần ... chúng sẽ phát hiện các lỗi ngay lập tức. – user1269942

Các vấn đề liên quan