Skip to content

Instantly share code, notes, and snippets.

@WillKoehrsen
Last active May 24, 2024 23:59
Show Gist options
  • Select an option

  • Save WillKoehrsen/ff77f5f308362819805a3defd9495ffd to your computer and use it in GitHub Desktop.

Select an option

Save WillKoehrsen/ff77f5f308362819805a3defd9495ffd to your computer and use it in GitHub Desktop.
How to visualize a single decision tree in Python
from sklearn.datasets import load_iris
iris = load_iris()
# Model (can also use single decision tree)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)
# Train
model.fit(iris.data, iris.target)
# Extract single tree
estimator = model.estimators_[5]
from sklearn.tree import export_graphviz
# Export as dot file
export_graphviz(estimator, out_file='tree.dot',
feature_names = iris.feature_names,
class_names = iris.target_names,
rounded = True, proportion = False,
precision = 2, filled = True)
# Convert to png using system command (requires Graphviz)
from subprocess import call
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])
# Display in jupyter notebook
from IPython.display import Image
Image(filename = 'tree.png')
@BarryDeCicco
Copy link
Copy Markdown

Note, this doesn't work in my jupyter notebook running python 3.7.4

`FileNotFoundError Traceback (most recent call last)
in
21 # Convert to png using system command (requires Graphviz)
22 from subprocess import call
---> 23 call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])
24
25 # Display in jupyter notebook

C:\ProgramData\Anaconda3\lib\subprocess.py in call(timeout, *popenargs, **kwargs)
321 retcode = call(["ls", "-l"])
322 """
--> 323 with Popen(*popenargs, **kwargs) as p:
324 try:
325 return p.wait(timeout=timeout)

C:\ProgramData\Anaconda3\lib\subprocess.py in init(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
773 c2pread, c2pwrite,
774 errread, errwrite,
--> 775 restore_signals, start_new_session)
776 except:
777 # Cleanup if the child failed starting.

C:\ProgramData\Anaconda3\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
1176 env,
1177 os.fspath(cwd) if cwd is not None else None,
-> 1178 startupinfo)
1179 finally:
1180 # Child is launched. Close the parent's copy of those pipe

FileNotFoundError: [WinError 2] The system cannot find the file specified
`

@skmishra0628
Copy link
Copy Markdown

@barry - You will need to run the jupyter notebook on a Linux or Linux-like platform. If you work on a Windows 10 O/S, try installing the Ubuntu O/S - comes free with Windows 10. You can use this Windows Subsystem Linux to run the jupyter notebook (after installation of the Anaconda package) and then above notebook should work.

@taekhoonkim
Copy link
Copy Markdown

It doesn't work in my jupyter
I run in Centos 8 and python 3.6.7


FileNotFoundError Traceback (most recent call last)
in
1 # Convert to png using system command (requires Graphviz)
2 from subprocess import call
----> 3 call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])

/usr/lib64/python3.6/subprocess.py in call(timeout, *popenargs, **kwargs)
285 retcode = call(["ls", "-l"])
286 """
--> 287 with Popen(*popenargs, **kwargs) as p:
288 try:
289 return p.wait(timeout=timeout)

/usr/lib64/python3.6/subprocess.py in init(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors)
727 c2pread, c2pwrite,
728 errread, errwrite,
--> 729 restore_signals, start_new_session)
730 except:
731 # Cleanup if the child failed starting.

/usr/lib64/python3.6/subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session)
1362 if errno_num == errno.ENOENT:
1363 err_msg += ': ' + repr(err_filename)
-> 1364 raise child_exception_type(errno_num, err_msg, err_filename)
1365 raise child_exception_type(err_msg)
1366

FileNotFoundError: [Errno 2] No such file or directory: 'dot': 'dot'

@9kwon
Copy link
Copy Markdown

9kwon commented Jul 28, 2020

I use this on Ubuntu 16 based jupyter notebook but have the same problem as the first question.

FileNotFoundError: [Errno 2] No such file or directory: 'dot': 'dot'

@thecml
Copy link
Copy Markdown

thecml commented Aug 2, 2021

Hi, installing Graphwiz on Windows makes the script work on Windows. Remember to add Graphwiz to PATH for current user.
https://graphviz.org/download/

@Arielcchy
Copy link
Copy Markdown

Note for thecml's solution - add Graphwiz to PATH:
https://stackoverflow.com/questions/35064304/runtimeerror-make-sure-the-graphviz-executables-are-on-your-systems-path-aft
,answered Jun 19 '17 at 8:43, Aprameyo Roy
works on Jupyter

@maheshkendre161
Copy link
Copy Markdown

maheshkendre161 commented Jun 11, 2022

Use below command in your terminal if you are using ubuntu 20.04

sudo apt-get install graphviz

Before this i was getting below error

Traceback (most recent call last):
File "visualize_decision_tree.py", line 23, in
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600'])
File "/usr/lib/python3.8/subprocess.py", line 340, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib/python3.8/subprocess.py", line 858, in init
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.8/subprocess.py", line 1704, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'dot'

Then I got result
tree

@atonui
Copy link
Copy Markdown

atonui commented Mar 26, 2024

Hi, installing Graphwiz on Windows makes the script work on Windows. Remember to add Graphwiz to PATH for current user. https://graphviz.org/download/

This works! Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment