From 32e6b1342039fdc9c3e4d914f0843e128e19e2e8 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Thu, 27 May 2021 18:05:02 +0200 Subject: [PATCH 01/20] update extras require --- setup.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index eb73b658..679985ee 100644 --- a/setup.py +++ b/setup.py @@ -22,18 +22,32 @@ 'dash-table==4.11.0', 'nbformat>4.2.0', 'numba==0.51.2', - 'nbconvert==6.0.7', - 'papermill==2.3.2', - 'matplotlib>=3.0', - 'seaborn==0.11.1' + 'scikit-learn' ] +extras = dict() + +# This list should be identical to the list in shapash/report/__init__.py +extras['report'] = [ + 'nbconvert==6.0.7', + 'papermill', + 'matplotlib', + 'seaborn', + 'notebook', + 'Jinja2' +] + +extras['xgboost'] = ['xgboost>=1.0.0'] +extras['lightgbm'] = ['lightgbm>=2.3.0'] +extras['catboost'] = ['catboost>=0.21'] +extras['scikit-learn'] = ['scikit-learn>=0.23.0'] + setup_requirements = ['pytest-runner', ] test_requirements = ['pytest', ] setup( - name="shapash", # Replace with your own username + name="shapash", version="1.3.2", python_requires='>3.5, < 3.9', url='https://github.com/MAIF/shapash', @@ -51,6 +65,7 @@ "Operating System :: OS Independent", ], install_requires=requirements, + extras_require=extras, license="Apache Software License 2.0", keywords='shapash', package_dir={ From a7924ff4e31ce67b81fcfbbff2c47705908340d1 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Thu, 27 May 2021 18:07:28 +0200 Subject: [PATCH 02/20] update dev requirements for Shapash report --- requirements.dev.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/requirements.dev.txt b/requirements.dev.txt index c661730f..e3ba7666 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -28,7 +28,8 @@ xgboost==1.0.0 nbformat>4.2.0 numba==0.51.2 nbconvert==6.0.7 -papermill==2.3.2 -matplotlib==3.3.4 -seaborn==0.11.1 -jupyter==1.0.0 +papermill +matplotlib +seaborn +notebook +Jinja2 From 76286fb56e6d7c1463e2e4753fb1bdc8d5c9ede4 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Thu, 27 May 2021 18:08:19 +0200 Subject: [PATCH 03/20] update Shapash report requirements instructions --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 27728d75..8b173512 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,12 @@ Shapash is intended to work with Python versions 3.6 to 3.8. Installation can be pip install shapash ``` +In order to generate the Shapash Report some extra requirements are needed. +You can install these using the following command : +``` +pip install shapash[report] +``` + ## 🕐 Quickstart The 4 steps to display results: From 99fcbce5448cf042b5ef50b2855f37bdd6025da8 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Thu, 27 May 2021 18:09:12 +0200 Subject: [PATCH 04/20] check non necessary pyyaml import --- shapash/utils/io.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/shapash/utils/io.py b/shapash/utils/io.py index 57cf8357..51168c75 100644 --- a/shapash/utils/io.py +++ b/shapash/utils/io.py @@ -2,7 +2,12 @@ IO module """ import pickle -import yaml +try: + import yaml + _is_yaml_available = True +except (ImportError, ModuleNotFoundError): + _is_yaml_available = False + def save_pickle(obj, path, protocol=pickle.HIGHEST_PROTOCOL): """ @@ -72,6 +77,9 @@ def load_yml(path): d : dict Python dict containing the parsed yml file. """ + if _is_yaml_available is False: + raise ModuleNotFoundError('Please install PyYAML using "pip install pyyaml" command.') + if not isinstance(path, str): raise ValueError( """ From 83b35a008deecce755e436ae7e680d829a666c33 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Thu, 27 May 2021 18:10:13 +0200 Subject: [PATCH 05/20] add checks to make sure all required libraries are installed for generating Shapash report --- shapash/explainer/smart_explainer.py | 6 ++++- shapash/report/__init__.py | 25 +++++++++++++++++++ .../explainer/test_smart_explainer.py | 4 +-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/shapash/explainer/smart_explainer.py b/shapash/explainer/smart_explainer.py index 6aa24b4e..2e7865a4 100644 --- a/shapash/explainer/smart_explainer.py +++ b/shapash/explainer/smart_explainer.py @@ -17,7 +17,7 @@ from shapash.utils.check import check_model, check_label_dict, check_ypred, check_contribution_object,\ check_postprocessing, check_features_name from shapash.manipulation.select_lines import keep_right_contributions -from shapash.report.generation import execute_report, export_and_save_report +from shapash.report import check_report_requirements from .smart_state import SmartState from .multi_decorator import MultiDecorator from .smart_plotter import SmartPlotter @@ -1125,6 +1125,10 @@ def generate_report(self, ] ) """ + check_report_requirements() + # Avoid Import Errors with requirements specific to the Shapash Report + from shapash.report.generation import execute_report, export_and_save_report + rm_working_dir = False if not working_dir: working_dir = tempfile.mkdtemp() diff --git a/shapash/report/__init__.py b/shapash/report/__init__.py index e69de29b..09af927f 100644 --- a/shapash/report/__init__.py +++ b/shapash/report/__init__.py @@ -0,0 +1,25 @@ +import importlib + +# This list should be identical to the list in setup.py +report_requirements = [ + 'nbconvert==6.0.7', + 'papermill', + 'matplotlib', + 'seaborn', + 'notebook', + 'Jinja2' +] + + +def check_report_requirements(): + """ + Checks that all required packages for the report are installed. + This function should be called before executing the report. + """ + for req in report_requirements: + pkg = req.split('=')[0] + try: + importlib.import_module(pkg.lower()) + except (ModuleNotFoundError, ImportError): + raise ModuleNotFoundError(f"The following package is necessary to generate the Shapash Report : {pkg}. " + f"Try 'pip install shapash[report]' to install all required packages.") \ No newline at end of file diff --git a/tests/unit_tests/explainer/test_smart_explainer.py b/tests/unit_tests/explainer/test_smart_explainer.py index 7b88d8ae..a69ddb57 100644 --- a/tests/unit_tests/explainer/test_smart_explainer.py +++ b/tests/unit_tests/explainer/test_smart_explainer.py @@ -1302,8 +1302,8 @@ def test_run_app_1(self, mock_get_host_name, mock_custom_thread, mock_smartapp): assert xpl.y_pred is not None - @patch('shapash.explainer.smart_explainer.export_and_save_report') - @patch('shapash.explainer.smart_explainer.execute_report') + @patch('shapash.report.generation.export_and_save_report') + @patch('shapash.report.generation.execute_report') def test_generate_report(self, mock_execute_report, mock_export_and_save_report): """ Test generate report method From 50fa725692c5fba41d60483a3460b52541bd7c58 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 1 Jun 2021 13:47:12 +0200 Subject: [PATCH 06/20] fix get_interaction_values test for newer versions of shap --- tests/unit_tests/explainer/test_smart_explainer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/unit_tests/explainer/test_smart_explainer.py b/tests/unit_tests/explainer/test_smart_explainer.py index a69ddb57..458e3ab4 100644 --- a/tests/unit_tests/explainer/test_smart_explainer.py +++ b/tests/unit_tests/explainer/test_smart_explainer.py @@ -11,6 +11,7 @@ import numpy as np import catboost as cb from sklearn.linear_model import LinearRegression +from sklearn.ensemble import RandomForestClassifier from shapash.explainer.smart_explainer import SmartExplainer from shapash.explainer.multi_decorator import MultiDecorator from shapash.explainer.smart_state import SmartState @@ -1266,12 +1267,12 @@ def test_to_smartpredictor_1(self): def test_get_interaction_values_1(self): df = pd.DataFrame({ - "y": np.random.randint(2, size=50), - "a": np.random.rand(50), - "b": np.random.rand(50), + "y": np.random.randint(2, size=10), + "a": np.random.rand(10)*10, + "b": np.random.rand(10), }) - clf = cb.CatBoostClassifier(n_estimators=1).fit(df[['a', 'b']], df['y']) + clf = RandomForestClassifier(n_estimators=5).fit(df[['a', 'b']], df['y']) xpl = SmartExplainer() xpl.compile(x=df.drop('y', axis=1), model=clf) From 4f2045071f6d65cc7ae13afc6fdcfe3c1cd3562f Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 1 Jun 2021 13:59:18 +0200 Subject: [PATCH 07/20] add category_encoders in extras require --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 679985ee..cdf8fa07 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,7 @@ extras['lightgbm'] = ['lightgbm>=2.3.0'] extras['catboost'] = ['catboost>=0.21'] extras['scikit-learn'] = ['scikit-learn>=0.23.0'] +extras['category_encoders'] = ['category_encoders==2.2.2'] setup_requirements = ['pytest-runner', ] From 0adc02054f7653689a30ec311b30b322a5378b04 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 1 Jun 2021 15:08:32 +0200 Subject: [PATCH 08/20] modify shap version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index cdf8fa07..83e7f2f3 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ 'plotly==4.12.0', 'numpy>1.18.0', 'pandas>1.0.2', - 'shap==0.37.0', + 'shap>=0.36.0', 'dash==1.17.0', 'dash-bootstrap-components==0.9.1', 'dash-core-components==1.13.0', From 96625160d8c9a812d4d800f90260ee865fc74e9e Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 1 Jun 2021 16:10:36 +0200 Subject: [PATCH 09/20] =?UTF-8?q?=F0=9F=8E=89=20add=20shapash=20compatibil?= =?UTF-8?q?ity=20with=20python=20version=203.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 2 +- requirements.dev.txt | 6 +++--- setup.py | 2 +- tests/data/predictor_to_load_39.pkl | Bin 0 -> 9181 bytes .../unit_tests/utils/test_load_smartpredictor.py | 4 ++++ 5 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 tests/data/predictor_to_load_39.pkl diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8768ef28..17d3c9e1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ jobs: strategy: max-parallel: 1 matrix: - python-version: [3.6, 3.7, 3.8] + python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} diff --git a/requirements.dev.txt b/requirements.dev.txt index e3ba7666..32507e0a 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -1,6 +1,6 @@ pip==20.2.4 dash==1.17.0 -catboost==0.22 +catboost>=0.22 category-encoders==2.1.0 dash-bootstrap-components==0.9.1 dash-core-components==1.13.0 @@ -23,10 +23,10 @@ sphinxcontrib-qthelp==1.0.3 sphinxcontrib-serializinghtml==1.1.4 pytest==5.2.3 pytest-cov==2.8.1 -scikit-learn==0.23.2 +scikit-learn>=0.23.2 xgboost==1.0.0 nbformat>4.2.0 -numba==0.51.2 +numba==0.53.1 nbconvert==6.0.7 papermill matplotlib diff --git a/setup.py b/setup.py index 83e7f2f3..439c8520 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ 'dash-renderer==1.8.3', 'dash-table==4.11.0', 'nbformat>4.2.0', - 'numba==0.51.2', + 'numba==0.53.1', 'scikit-learn' ] diff --git a/tests/data/predictor_to_load_39.pkl b/tests/data/predictor_to_load_39.pkl new file mode 100644 index 0000000000000000000000000000000000000000..156ed1bc7afe25491b5afd48e381b5656b582407 GIT binary patch literal 9181 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 X*aNoow Date: Tue, 1 Jun 2021 16:17:51 +0200 Subject: [PATCH 10/20] update compatible python versions in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b173512..d1e3b969 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ to compute contributions. ## 🛠 Installation -Shapash is intended to work with Python versions 3.6 to 3.8. Installation can be done with pip: +Shapash is intended to work with Python versions 3.6 to 3.9. Installation can be done with pip: ``` pip install shapash From c2a30224f1d083f487b18cf797b4f75857f1fc8f Mon Sep 17 00:00:00 2001 From: Thibaud Date: Fri, 4 Jun 2021 14:59:00 +0200 Subject: [PATCH 11/20] add python 3.9 to python_requires --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 439c8520..1bbc0e21 100644 --- a/setup.py +++ b/setup.py @@ -50,7 +50,7 @@ setup( name="shapash", version="1.3.2", - python_requires='>3.5, < 3.9', + python_requires='>3.5, <=3.9', url='https://github.com/MAIF/shapash', author="Yann Golhen, Sebastien Bidault, Yann Lagre, Maxime Gendre", author_email="yann.golhen@maif.fr", From fbe4b22eb2da6cc2771949fc6a368bfcdfa4bb70 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Fri, 4 Jun 2021 17:26:10 +0200 Subject: [PATCH 12/20] add phik to requirements list --- requirements.dev.txt | 1 + setup.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/requirements.dev.txt b/requirements.dev.txt index 32507e0a..456120b4 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -33,3 +33,4 @@ matplotlib seaborn notebook Jinja2 +phik diff --git a/setup.py b/setup.py index 1bbc0e21..f37bd0c3 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,8 @@ 'matplotlib', 'seaborn', 'notebook', - 'Jinja2' + 'Jinja2', + 'phik' ] extras['xgboost'] = ['xgboost>=1.0.0'] From 7a3e053ebf110395da57c0efebc7cd415fea3c9f Mon Sep 17 00:00:00 2001 From: Thibaud Date: Mon, 7 Jun 2021 11:45:19 +0200 Subject: [PATCH 13/20] add extras require instructions to readme and doc --- README.md | 2 ++ docs/installation-instructions/index.rst | 31 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d1e3b969..35c432da 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,8 @@ You can install these using the following command : pip install shapash[report] ``` +If you encounter **compatibility issues** you may check the corresponding section in the Shapash documentation [here](https://shapash.readthedocs.io/en/latest/installation-instructions/index.html). + ## 🕐 Quickstart The 4 steps to display results: diff --git a/docs/installation-instructions/index.rst b/docs/installation-instructions/index.rst index 2f75b3cb..668b7bb8 100644 --- a/docs/installation-instructions/index.rst +++ b/docs/installation-instructions/index.rst @@ -4,12 +4,20 @@ Installation instructions Installing ---------- -Users can install **Shapash** with pip: +**Shapash** is intended to work with Python versions 3.6 to 3.9. Installation can be done with pip: .. code:: bash pip install shapash + +In order to generate the **Shapash Report** you may need to install specific libraries. +You can install these using the following command : + +.. code:: bash + + pip install shapash[report] + Jupyter ------- @@ -213,3 +221,24 @@ To test if plotly works: .. image:: plotly.png + +Compatibility issues +-------------------- + +When using Shapash, you may encounter some compatibility issues related to your environment and the libraries' versions used. +The extras requirements of Shapash allow you to update your requirements to a compatible version. + +For example, if you get an error related to the *xgboost* library, you can use the following command to update it to a working version : + +.. code:: bash + + pip install shapash[xgboost] + +The full list of extras requirements is listed below (replace xgboost with the corresponding library on the command above) : + +* xgboost +* lightgbm +* catboost +* scikit-learn +* category_encoders + From 2b4150aab34f22767cee610e64dd4c94e5371002 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 8 Jun 2021 09:53:24 +0200 Subject: [PATCH 14/20] add correlation plot in grid images --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 35c432da..d6d73c29 100644 --- a/README.md +++ b/README.md @@ -66,9 +66,9 @@ Shapash also contributes to data science auditing by displaying usefull informat

- + - +

From 140abcd167de25a4ef1b72d94ae3965965e4735a Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 8 Jun 2021 10:01:50 +0200 Subject: [PATCH 15/20] add tutorial for groups of features in readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d6d73c29..c85001b0 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@

-🎉 **We just released Shapash 1.3.2 that includes the generation of a standalone HTML report that constitutes a basis of an audit document. [See an example here](https://shapash.readthedocs.io/en/latest/report.html) that was generated [using this tutorial.](https://github.com/MAIF/shapash/blob/master/tutorial/report/tuto-shapash-report01.ipynb)** 🎉 +🎉 **We just released Shapash 1.4.0 that includes the option to group features that share common properties together [See the tutorial here](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html).** 🎉 ## 🔍 Overview @@ -203,6 +203,7 @@ This github repository offers a lot of tutorials to allow you to start more conc - [Launch the webapp with a concrete use case](tutorial/tutorial01-Shapash-Overview-Launch-WebApp.ipynb) - [Jupyter Overviews - The main outputs and methods available with the SmartExplainer object](tutorial/tutorial02-Shapash-overview-in-Jupyter.ipynb) - [Shapash in production: From model training to deployment (API or Batch Mode)](tutorial/tutorial03-Shapash-overview-model-in-production.ipynb) +- [Use groups of features](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html) ### More details about charts and plots - [**Shapash** Features Importance](tutorial/plot/tuto-plot03-features-importance.ipynb) From f9e7223396ca9d4f0d59edcb4703dfd8dfc0772d Mon Sep 17 00:00:00 2001 From: Thibaud Date: Mon, 14 Jun 2021 14:17:42 +0200 Subject: [PATCH 16/20] minor change in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c85001b0..efbd6c74 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@

-🎉 **We just released Shapash 1.4.0 that includes the option to group features that share common properties together [See the tutorial here](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html).** 🎉 +🎉 **We just released Shapash 1.4.0 that includes the option to group features that share common properties together. This option can be useful if your model has a lot of features. [See the tutorial here](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html).** 🎉 ## 🔍 Overview From 592b70f15a58fc7dc0731528dfe56d5acef0b4f8 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Mon, 14 Jun 2021 16:09:51 +0200 Subject: [PATCH 17/20] add groups of features button gif --- README.md | 7 ++++++- docs/_static/groups_features.gif | Bin 0 -> 9009 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/_static/groups_features.gif diff --git a/README.md b/README.md index efbd6c74..dd0fd56b 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,12 @@

-🎉 **We just released Shapash 1.4.0 that includes the option to group features that share common properties together. This option can be useful if your model has a lot of features. [See the tutorial here](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html).** 🎉 +🎉 +**We just released Shapash 1.4.0 that includes the option to group features that share common properties together. +This option can be useful if your model has a lot of features. [See the tutorial here](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html).** + + + ## 🔍 Overview diff --git a/docs/_static/groups_features.gif b/docs/_static/groups_features.gif new file mode 100644 index 0000000000000000000000000000000000000000..2955fd1f6c11a333434bc7b14335cda22941afc4 GIT binary patch literal 9009 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 xr$dxbfP}FIbzFQsPwa^S4ZC Date: Tue, 15 Jun 2021 14:40:15 +0200 Subject: [PATCH 18/20] update new features presentation in readme --- README.md | 14 +++++++------- docs/_static/report-icon.png | Bin 0 -> 27688 bytes 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 docs/_static/report-icon.png diff --git a/README.md b/README.md index dd0fd56b..0f8d744a 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@

+## 🎉 What's new ? + +| Version | New Feature | Description | Tutorial | +|:-------------:|:-------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------:|:--------:| +| 1.4.x | Groups of features
[demo]() | You can now regroup features that share common properties together.
This option can be useful if your model has a lot of features. | [](https://github.com/MAIF/shapash/blob/master/tutorial/common/tuto-common01-groups_of_features.ipynb) | +| 1.3.x | Shapash Report
[demo](https://shapash.readthedocs.io/en/latest/report.html) | A standalone HTML report that constitutes a basis of an audit document. | [](https://github.com/MAIF/shapash/blob/master/tutorial/report/tuto-shapash-report01.ipynb) | -🎉 -**We just released Shapash 1.4.0 that includes the option to group features that share common properties together. -This option can be useful if your model has a lot of features. [See the tutorial here](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html).** - - - ## 🔍 Overview @@ -208,7 +208,7 @@ This github repository offers a lot of tutorials to allow you to start more conc - [Launch the webapp with a concrete use case](tutorial/tutorial01-Shapash-Overview-Launch-WebApp.ipynb) - [Jupyter Overviews - The main outputs and methods available with the SmartExplainer object](tutorial/tutorial02-Shapash-overview-in-Jupyter.ipynb) - [Shapash in production: From model training to deployment (API or Batch Mode)](tutorial/tutorial03-Shapash-overview-model-in-production.ipynb) -- [Use groups of features](https://shapash.readthedocs.io/en/latest/tutorials/tuto-common01-groups_of_features.html) +- [Use groups of features](tutorial/common/tuto-common01-groups_of_features.ipynb) ### More details about charts and plots - [**Shapash** Features Importance](tutorial/plot/tuto-plot03-features-importance.ipynb) diff --git a/docs/_static/report-icon.png b/docs/_static/report-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8290ab938491d7237902750a05b186c7830d99a1 GIT binary patch literal 27688 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 OW4)%HM&_DrNB=(sVS|1E literal 0 HcmV?d00001 From 17a6d91f37fddde97d072fb3e210d920cf426924 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 15 Jun 2021 14:56:18 +0200 Subject: [PATCH 19/20] fix links to png images --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f8d744a..c967f47e 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ | Version | New Feature | Description | Tutorial | |:-------------:|:-------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------:|:--------:| -| 1.4.x | Groups of features
[demo]() | You can now regroup features that share common properties together.
This option can be useful if your model has a lot of features. | [](https://github.com/MAIF/shapash/blob/master/tutorial/common/tuto-common01-groups_of_features.ipynb) | -| 1.3.x | Shapash Report
[demo](https://shapash.readthedocs.io/en/latest/report.html) | A standalone HTML report that constitutes a basis of an audit document. | [](https://github.com/MAIF/shapash/blob/master/tutorial/report/tuto-shapash-report01.ipynb) | +| 1.4.x | Groups of features
[demo]() | You can now regroup features that share common properties together.
This option can be useful if your model has a lot of features. | [](https://github.com/MAIF/shapash/blob/master/tutorial/common/tuto-common01-groups_of_features.ipynb) | +| 1.3.x | Shapash Report
[demo](https://shapash.readthedocs.io/en/latest/report.html) | A standalone HTML report that constitutes a basis of an audit document. | [](https://github.com/MAIF/shapash/blob/master/tutorial/report/tuto-shapash-report01.ipynb) | ## 🔍 Overview From 7f6e308cb5b60154be0d746315fd0ad7528418db Mon Sep 17 00:00:00 2001 From: Thibaud Date: Tue, 15 Jun 2021 16:08:50 +0200 Subject: [PATCH 20/20] add awards section in readme --- README.md | 26 +++++++++++++++----------- docs/_static/awards-argus-or.png | Bin 0 -> 27441 bytes 2 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 docs/_static/awards-argus-or.png diff --git a/README.md b/README.md index c967f47e..3db24aab 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ | Version | New Feature | Description | Tutorial | |:-------------:|:-------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------:|:--------:| -| 1.4.x | Groups of features
[demo]() | You can now regroup features that share common properties together.
This option can be useful if your model has a lot of features. | [](https://github.com/MAIF/shapash/blob/master/tutorial/common/tuto-common01-groups_of_features.ipynb) | -| 1.3.x | Shapash Report
[demo](https://shapash.readthedocs.io/en/latest/report.html) | A standalone HTML report that constitutes a basis of an audit document. | [](https://github.com/MAIF/shapash/blob/master/tutorial/report/tuto-shapash-report01.ipynb) | +| 1.4.x | Groups of features
[demo]() | You can now regroup features that share common properties together.
This option can be useful if your model has a lot of features. | [](https://github.com/MAIF/shapash/blob/master/tutorial/common/tuto-common01-groups_of_features.ipynb) | +| 1.3.x | Shapash Report
[demo](https://shapash.readthedocs.io/en/latest/report.html) | A standalone HTML report that constitutes a basis of an audit document. | [](https://github.com/MAIF/shapash/blob/master/tutorial/report/tuto-shapash-report01.ipynb) | ## 🔍 Overview @@ -49,18 +49,22 @@ Shapash also contributes to data science auditing by displaying usefull informat - Readthedocs: [![documentation badge](https://readthedocs.org/projects/shapash/badge/?version=latest)](https://shapash.readthedocs.io/en/latest/) - [Presentation video for french speakers](https://www.youtube.com/watch?v=r1R_A9B9apk) -- Medium: - -

- -

-
+- Medium: + - [Understand your model with Shapash - Towards AI](https://pub.towardsai.net/shapash-making-ml-models-understandable-by-everyone-8f96ad469eb3) + - [Model auditability - Towards DS](https://towardsdatascience.com/shapash-1-3-2-announcing-new-features-for-more-auditable-ai-64a6db71c919) + +## 🏆 Awards + + + + + + + -- [Understand your model with Shapash - Towards AI](https://pub.towardsai.net/shapash-making-ml-models-understandable-by-everyone-8f96ad469eb3) -- [Model auditability - Towards DS](https://towardsdatascience.com/shapash-1-3-2-announcing-new-features-for-more-auditable-ai-64a6db71c919) -## 🔥 Features +## 🔥 Features - Display clear and understandable results: plots and outputs use **explicit labels** for each feature and its values diff --git a/docs/_static/awards-argus-or.png b/docs/_static/awards-argus-or.png new file mode 100644 index 0000000000000000000000000000000000000000..eea963b7157606b65e55dfcec886ca174e6113e3 GIT binary patch literal 27441 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