h2oai / h2o-tutorials

Tutorials and training material for the H2O Machine Learning Platform
http://h2o.ai
1.48k stars 1.01k forks source link

PNG not generating in Python3 tutorial on Windows machine #147

Open aw236 opened 3 years ago

aw236 commented 3 years ago

I tried to run the code found in: https://github.com/h2oai/h2o-tutorials/blob/master/tutorials/isolation-forest/interpreting_isolation-forest.ipynb

I tried the code on two different machines and got the same issue:

FileNotFoundError: No such file or directory: './global_surrogate_decision_tree.png'

the problem is generated by the following code:

def generateTreeImage(decision_tree, image_file_path):
    # Download MOJO
    mojo_path = decision_tree.download_mojo(get_genmodel_jar=True)
    directory = os.path.dirname(mojo_path)
    h2o_jar_path = os.path.join(directory, "h2o-genmodel.jar")
    # Create Graphviz file
    gv_file_path = os.path.join(directory, "decision_tree.gv")
    gv_call = " ".join(["java", "-cp", h2o_jar_path, "hex.genmodel.tools.PrintMojo", "--tree 0 -i", mojo_path , "-o", gv_file_path])
    result = subprocess.call(gv_call, shell=True)
    result = subprocess.call(["ls", gv_file_path], shell = False)
    result = subprocess.call(["dot", "-Tpng", gv_file_path, "-o", image_file_path], shell=False)
    result = subprocess.call(["ls",image_file_path], shell = False)

    return Image(image_file_path)

generateTreeImage(global_surrogate_dt, "./global_surrogate_decision_tree.png")

I ripped out the guts of the function and ran it line by line as shown below, to try to narrow down the offending line of code:

decision_tree = global_surrogate_dt
mojo_path = decision_tree.download_mojo(get_genmodel_jar=True); mojo_path

I verified that global_surrogate_decision_tree_hex.zip existed at mojo_path.

directory = os.path.dirname(mojo_path); directory
h2o_jar_path = os.path.join(directory, "h2o-genmodel.jar"); h2o_jar_path

I verified that h2o-genmodel.jar existed at h2o_jar_path.

gv_file_path = os.path.join(directory, "decision_tree.gv"); gv_file_path
gv_call = " ".join(["java", "-cp", h2o_jar_path, "hex.genmodel.tools.PrintMojo", "--tree 0 -i", mojo_path , "-o", gv_file_path]); gv_call

The code fails here:

image_file_path = "./global_surrogate_decision_tree.png"
result = subprocess.call(["dot", "-Tpng", gv_file_path, "-o", image_file_path], shell=False); result

and the error message is below:

FileNotFoundError                         Traceback (most recent call last)
<ipython-input-69-7101915e3dd9> in <module>
      1 image_file_path = "./global_surrogate_decision_tree.png"
----> 2 result = subprocess.call(["dot", "-Tpng", gv_file_path, "-o", image_file_path], shell=False); result

~\AppData\Local\Continuum\anaconda2\envs\pyod_iforest\lib\subprocess.py in call(timeout, *popenargs, **kwargs)
    338     retcode = call(["ls", "-l"])
    339     """
--> 340     with Popen(*popenargs, **kwargs) as p:
    341         try:
    342             return p.wait(timeout=timeout)

~\AppData\Local\Continuum\anaconda2\envs\pyod_iforest\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)
    852                             encoding=encoding, errors=errors)
    853 
--> 854             self._execute_child(args, executable, preexec_fn, close_fds,
    855                                 pass_fds, cwd, env,
    856                                 startupinfo, creationflags, shell,

~\AppData\Local\Continuum\anaconda2\envs\pyod_iforest\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)
   1305             # Start the process
   1306             try:
-> 1307                 hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
   1308                                          # no special security
   1309                                          None, None,

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

I checked the directory and indeed, I could not find the file: global_surrogate_decision_tree.png. Not sure if there is an obvious solution here but I think the tutorial should be updated such that this issue doesn't happen for others who may try it.

Alex-Wenner-FHR commented 3 years ago

Was this ever resolved? I am having the same issue... I tried creating the file in the directory as well and am still not having luck. However, it is very possible that I did create this file in the wrong directory. I am unsure, please help!

UtkarshaGupte commented 2 years ago

When I ran the above commands, I found that the command "dot" was not recognised: java -cp h2o-genmodel.jar hex.genmodel.tools.PrintMojo --tree 0 -i surrogate_hex.zip -o gv_file.gv dot -Tpng gv_file.gv -o decision_tree.png

To make this work, I added the path for Graphviz bin folder in my system and user env variables and it worked (Ref - https://bobswift.atlassian.net/wiki/spaces/GVIZ/pages/20971549/How+to+install+Graphviz+software)