interpretml / interpret

Fit interpretable models. Explain blackbox machine learning.
https://interpret.ml/docs
MIT License
6.04k stars 714 forks source link

cannot import name 'url_quote' from 'werkzeug.urls' when using show(dt.explain_global()) #509

Closed Exitare closed 3 months ago

Exitare commented 3 months ago

Installed interpreter & werkzeug versions: interpret==0.4.3 interpret-core==0.4.3 interpret_community==0.31.0 Werkzeug==3.0.1

python version 3.9

` from sklearn.metrics import roc_auc_score from interpret import set_visualize_provider from interpret.provider import InlineProvider set_visualize_provider(InlineProvider())

from interpret.glassbox import ClassificationTree from interpret import show`

`X_train = train_set[COLUMNS_OF_INTEREST] y_train = train_set[TARGET]

X_test = test_set[COLUMNS_OF_INTEREST] y_test = test_set[TARGET]`

dt = ClassificationTree(random_state=42) dt.fit(X_train, y_train)

show(dt.explain_global()) <---- causes error

Error: cannot import name 'url_quote' from 'werkzeug.urls' (.../venv/lib/python3.9/site-packages/werkzeug/urls.py)

I am using a Jupyter notebook running a venv using python 3.9. When using the show function the aforementioned import error occurs. Did I miss an import or a particular setup?

paulbkoch commented 3 months ago

Hi @Exitare -- It looks like werkzeug 0.3.0 removed some previously deprecated code which led to this error, so downgrading werkzeug to 0.2.x would probably solve it. Do you have a more detailed stack trace?

https://stackoverflow.com/questions/77213053/why-did-flask-start-failing-with-importerror-cannot-import-name-url-quote-fr

Exitare commented 3 months ago

Hi @paulbkoch, thanks for getting back to me! I added the full stack trace.

` ImportError Traceback (most recent call last) Cell In[44], line 1 ----> 1 show(dt.explain_global())

File ~/venv/lib/python3.9/site-packages/interpret/visual/_interactive.py:172, in show(explanation, key, **kwargs) 170 except Exception as e: # pragma: no cover 171 _log.error(e, exc_info=True) --> 172 raise e 174 return None

File ~/venv/lib/python3.9/site-packages/interpret/visual/_interactive.py:169, in show(explanation, key, kwargs) 166 _current_module.visualize_provider = AutoVisualizeProvider() 168 # Render --> 169 _current_module.visualize_provider.render(explanation, key=key, kwargs) 170 except Exception as e: # pragma: no cover 171 _log.error(e, exc_info=True)

File ~/venv/lib/python3.9/site-packages/interpret/provider/_visualize.py:234, in InlineProvider.render(self, explanation, key, kwargs) 231 def render(self, explanation, key=-1, kwargs): 232 from ..visual._inline import render --> 234 render( 235 explanation, 236 default_key=key, 237 detected_envs=self.detected_envs, 238 js_url=self.js_url, 239 )

File ~/venv/lib/python3.9/site-packages/interpret/visual/_inline.py:232, in render(explanation, id_str, default_key, detected_envs, js_url) 230 viz_obj = _build_viz_err_obj(msg) 231 else: --> 232 viz_obj = _build_viz_obj(explanation, detected_envs) 234 init_js, body_js = _build_javascript( 235 viz_obj, id_str, default_key=default_key, js_url=js_url 236 ) 238 if "databricks" in detected_envs:

File ~/venv/lib/python3.9/site-packages/interpret/visual/_inline.py:109, in _build_viz_obj(explanation, detected_envs) 108 def _build_viz_obj(explanation, detected_envs): --> 109 overall = _build_viz_figure(explanation.visualize(), detected_envs) 110 if explanation.selector is None: 111 # NOTE: Unsure if this should be a list or None in the long term. 112 specific = []

File ~/venv/lib/python3.9/site-packages/interpret/glassbox/_decisiontree.py:92, in TreeExplanation.visualize(self, key) 81 def visualize(self, key=None): 82 """Provides interactive visualizations. 83 84 Args: (...) 90 A Dash Cytoscape object. 91 """ ---> 92 import dash_cytoscape as cyto 94 data_dict = self.data(key) 95 if data_dict is None:

File ~/venv/lib/python3.9/site-packages/dash_cytoscape/init.py:7 4 import sys as _sys 5 import json ----> 7 import dash as _dash 9 # noinspection PyUnresolvedReferences 10 from .imports import *

File ~/venv/lib/python3.9/site-packages/dash/init.py:5 1 # pylint: disable=C0413 2 # __plotly_dash is for the "make sure you don't have a dash.py" check 3 # must come before any other imports. 4 __plotly_dash = True ----> 5 from .dependencies import ( # noqa: F401,E402 6 Input, # noqa: F401,E402 7 Output, # noqa: F401,E402, 8 State, # noqa: F401,E402 9 ClientsideFunction, # noqa: F401,E402 10 MATCH, # noqa: F401,E402 11 ALL, # noqa: F401,E402 12 ALLSMALLER, # noqa: F401,E402 13 ) # noqa: F401,E402 14 from . import development # noqa: F401,E402 15 from . import exceptions # noqa: F401,E402

File ~/venv/lib/python3.9/site-packages/dash/dependencies.py:4 1 import json 2 from dash.development.base_component import Component ----> 4 from ._validate import validate_callback 5 from ._grouping import flatten_grouping, make_grouping_by_index 8 class _Wildcard: # pylint: disable=too-few-public-methods

File ~/venv/lib/python3.9/site-packages/dash/_validate.py:5 3 from textwrap import dedent 4 from keyword import iskeyword ----> 5 import flask 7 from ._grouping import grouping_len, map_grouping 8 from .development.base_component import Component

File ~/venv/lib/python3.9/site-packages/flask/init.py:5 2 from markupsafe import Markup 4 from . import json as json ----> 5 from .app import Flask as Flask 6 from .app import Request as Request 7 from .app import Response as Response

File ~/venv/lib/python3.9/site-packages/flask/app.py:30 28 from werkzeug.routing import Rule 29 from werkzeug.serving import is_running_from_reloader ---> 30 from werkzeug.urls import url_quote 31 from werkzeug.utils import redirect as _wz_redirect 32 from werkzeug.wrappers import Response as BaseResponse

ImportError: cannot import name 'url_quote' from 'werkzeug.urls' (venv/lib/python3.9/site-packages/werkzeug/urls.py) `

paulbkoch commented 3 months ago

Hi @Exitare --

What version of flask do you have installed? It looks like the error originates here:

https://github.com/pallets/flask/blame/6b422a05f37641ca0b84422f2436e9d4bd144376/src/flask/app.py#L12

But they changed it 6 months ago and there have been releases of flask since then.

Exitare commented 3 months ago

Flask==2.2.3 flask-simplelogin==0.1.2 Flask-WTF==1.2.1

These are the versions installed. But I they have been installed as a dependency.

Downgrading helped btw.

Exitare commented 3 months ago

As downgrading Werkzeug worked, I am closing this issue as resolved