2016-07-07 3 views
1

안녕하세요 저는이 코드를 발견했으며 의사 결정 트리를 그려보고 있습니다.하지만이 "visualize_tree (test, columns)"는 오류가 발생합니다.이 코드는 난 단지 매우 마지막 줄이 나에게 오류를 제공 말했듯이결정 트리를 파이썬으로 그릴

from __future__ import print_function 

import os 
import subprocess 

import pandas as pd 
import numpy as np 
from sklearn.tree import DecisionTreeClassifier, export_graphviz 



y = test["churn"] 
X = test[columns] 
dt = DecisionTreeClassifier(min_samples_split=20, random_state=99) 
dt.fit(X, y) 

def visualize_tree(tree, feature_names): 
    """Create tree png using graphviz. 

    Args 
    ---- 
    tree -- scikit-learn DecsisionTree. 
    feature_names -- list of feature names. 
    """ 
    with open("dt.dot", 'w') as f: 
     export_graphviz(tree, out_file=f, 
         feature_names=feature_names) 

    command = ["dot", "-Tpng", "dt.dot", "-o", "dt.png"] 
    try: 
     subprocess.check_call(command) 
    except: 
     exit("Could not run dot, ie graphviz, to " 
      "produce visualization") 



visualize_tree(test,columns) 

는 :

In[471]: visualize_tree(test,columns) 

Traceback (most recent call last): 
    File "C:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3066, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-471-ccc62a7b61d9>", line 1, in <module> 
    visualize_tree(test,columns) 
    File "<ipython-input-470-be9bd10e9f84>", line 81, in visualize_tree 
    feature_names=feature_names) 
    File "C:\Anaconda\lib\site-packages\sklearn\tree\export.py", line 403, in export_graphviz 
    recurse(decision_tree.tree_, 0, criterion=decision_tree.criterion) 
    File "C:\Anaconda\lib\site-packages\pandas\core\generic.py", line 2360, in __getattr__ 
    (type(self).__name__, name)) 
AttributeError: 'DataFrame' object has no attribute 'tree_' 
+0

스택 추적을 추가 할 수 있습니까? (가장 최근의 마지막 호출) : 파일 "C : \ lib \ site-packages \ IPython \ core \ interactiveshell.py"3066 행의 원본 파일에 –

+0

이 완료되었습니다.이 경우 오류 – progster

답변

1

visualize_tree의 문서화 문자열은 첫 번째 인수가 DecisionTreeClassifier의 인스턴스가되어야한다고 주장한다. 그래서 전화를하는 올바른 방법은

visualize_tree(dt, columns) 

하지

visualize_tree(test, columns) 

(스택 트레이스에 따라) testDataFrame이기 때문이다.


exit의 사용에 대한 업데이트는 : 나는 str 인수를 사용하여 허용 sys.exit를 사용하도록 코드를 생각한다. 그러나 PyCharm 내에서 IPython을 실행하는 경우에도 실패합니다 (이 issue 참조). Whay 대신 할 수있는 것은 이것이다 :

sys.stderr.write("Could not run dot, ie graphviz, to produce visualization") 
sys.exit(1) 

더 중요한 부분은 subprocess.check_call 예외로 종료 된 경우 visualize_tree에만이 문에 도달 할 수 있다는 것입니다. 따라서 Graphviz installed이 있는지 확인하십시오.

+0

이 발생합니다. "", 라인 1에 visualize_tree (DT, 열) 파일 " ", line 86, visualize_tree에서 exit ("타입 오류 : __call __()은 정확히 1 인수 (주어진 2) – progster

+0

을 가져옵니다. 바로 'sys.exit'로 변경하십시오. . 내장 된 'exit' (IPython에서)는 인수를 허용하지 않습니다. . –

+0

당신은 다음을 의미합니까 : except : sys.exit (" "에 도트를 실행할 수 없습니다.) 또한 오류가 발생하기 때문에 graph.vi를 실행하십시오. 파일 "C : \ Program Files (x86) 에디션 5.0.4 \ helpers \ pydev \ pydevconsole.py ", 260 행, DoExit에서 os._exit (args [0]) TypeError : 정수가 필요함 – progster

관련 문제