From c30ecf3a2a228c4d69ee71b77d56fab9f6bd7f5f Mon Sep 17 00:00:00 2001 From: Martin Jullum Date: Wed, 22 Jan 2025 10:31:29 +0100 Subject: [PATCH] More pkgdown (#438) --- .github/workflows/pkgdown.yaml | 6 +-- README.Rmd | 14 +++--- README.md | 80 ++++++++++++++++++++++++++++----- _pkgdown.yml | 2 +- inst/REFERENCES.bib | 12 +++++ man/figures/nrlogo_new.jpg | Bin 0 -> 35699 bytes python/README.md | 12 ++--- 7 files changed, 97 insertions(+), 29 deletions(-) create mode 100644 man/figures/nrlogo_new.jpg diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 94a581931..dc1e4c822 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -41,11 +41,9 @@ jobs: extra-packages: any::pkgdown, local::. needs: website - - name: Render python README to assets folder + - name: Copy shaprpy readme to folder for automatic deployment run: | - rmarkdown::render(input = "python/README.md", - output_format = "html_document", - output_file = "../pkgdown/assets/README_py.html") + file.copy("python/README.md", ".github/shaprpy.md") shell: Rscript {0} - name: Build site diff --git a/README.Rmd b/README.Rmd index ae2e80860..514b03986 100644 --- a/README.Rmd +++ b/README.Rmd @@ -15,13 +15,13 @@ knitr::opts_chunk$set( ) ``` -# shapr +# shapr [![CRAN_Status_Badge](https://www.r-pkg.org/badges/version-last-release/shapr)](https://cran.r-project.org/package=shapr) [![CRAN_Downloads_Badge](https://cranlogs.r-pkg.org/badges/grand-total/shapr)](https://cran.r-project.org/package=shapr) [![R build status](https://github.com/NorskRegnesentral/shapr/workflows/R-CMD-check/badge.svg)](https://github.com/NorskRegnesentral/shapr/actions?query=workflow%3AR-CMD-check) -[![Lifecycle: experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html) +[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/license/mit) [![DOI](https://joss.theoj.org/papers/10.21105/joss.02027/status.svg)](https://doi.org/10.21105/joss.02027) @@ -48,7 +48,7 @@ and regression-based methods See the [NEWS](https://github.com/NorskRegnesentral/shapr/blob/master/NEWS.md) for a complete list. ### Coming from shapr < 1.0.0? -`shapr` version > 1.0.0 comes with a number of breaking changes. +`shapr` version >= 1.0.0 comes with a number of breaking changes. Most notably, we moved from using two function (`shapr()` and `explain()`) to a single function (`explain()`). In addition, custom models are now explained by passing the prediction function directly to `explain()`, @@ -62,7 +62,7 @@ README with old syntax (v0.2.2). We provide an (experimental) Python wrapper (`shaprpy`) which allows explaining Python models with the methodology implemented in `shapr`, directly from Python. The wrapper calls `R` internally, and therefore requires an installation of `R`. -See [here](https://github.com/NorskRegnesentral/shapr/tree/master/python) for installation instructions and examples. +See [here](https://github.com/NorskRegnesentral/shapr/shaprpy.html) for installation instructions and examples. ## The package @@ -175,8 +175,10 @@ plot(explanation) ``` See the [general usage vignette](https://norskregnesentral.github.io/shapr/articles/general_usage.html) for further -basic usage examples. - +basic usage examples and brief introductions to the methodology. +For more thorough information about the underlying methodology, see +@aas2019explaining, @redelmeier2020explaining, @jullum2021efficient, @olsen2022using, @olsen2024comparative . +See also @sellereite2019shapr for a brief paper about the previous (< 1.0.0) version of the package. ## Contribution diff --git a/README.md b/README.md index 9f96515a6..5180a0bae 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# shapr +# shapr @@ -10,7 +10,7 @@ [![R build status](https://github.com/NorskRegnesentral/shapr/workflows/R-CMD-check/badge.svg)](https://github.com/NorskRegnesentral/shapr/actions?query=workflow%3AR-CMD-check) [![Lifecycle: -experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html) +stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/license/mit) [![DOI](https://joss.theoj.org/papers/10.21105/joss.02027/status.svg)](https://doi.org/10.21105/joss.02027) @@ -18,8 +18,7 @@ MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.or See the pkgdown site at [norskregnesentral.github.io/shapr/](https://norskregnesentral.github.io/shapr/) for a complete introduction with examples and documentation of the -package. - +package. ## NEWS @@ -46,7 +45,7 @@ for a complete list. ### Coming from shapr \< 1.0.0? -`shapr` version \> 1.0.0 comes with a number of breaking changes. Most +`shapr` version \>= 1.0.0 comes with a number of breaking changes. Most notably, we moved from using two function (`shapr()` and `explain()`) to a single function (`explain()`). In addition, custom models are now explained by passing the prediction function directly to `explain()`, @@ -63,8 +62,8 @@ We provide an (experimental) Python wrapper (`shaprpy`) which allows explaining Python models with the methodology implemented in `shapr`, directly from Python. The wrapper calls `R` internally, and therefore requires an installation of `R`. See -[here](https://github.com/NorskRegnesentral/shapr/tree/master/python) -for installation instructions and examples. +[here](https://github.com/NorskRegnesentral/shapr/shaprpy.html) for +installation instructions and examples. ## The package @@ -183,14 +182,14 @@ explanation <- explain( #> max_n_coalitions is NULL or larger than or 2^n_features = 16, #> and is therefore set to 2^n_features = 16. #> -#> ── Starting `shapr::explain()` at 2025-01-21 13:30:06 ────────────────────────── +#> ── Starting `shapr::explain()` at 2025-01-22 10:22:36 ────────────────────────── #> • Model class: #> • Approach: empirical #> • Iterative estimation: FALSE #> • Number of feature-wise Shapley values: 4 #> • Number of observations to explain: 6 #> • Computations (temporary) saved at: -#> '/tmp/Rtmpf5zleu/shapr_obj_3676de5b39f33b.rds' +#> '/tmp/RtmpAnmtGl/shapr_obj_371a1a52bf4cce.rds' #> #> ── Main computation started ── #> @@ -216,7 +215,12 @@ plot(explanation) See the [general usage vignette](https://norskregnesentral.github.io/shapr/articles/general_usage.html) -for further basic usage examples. +for further basic usage examples and brief introductions to the +methodology. For more thorough information about the underlying +methodology, see Aas, Jullum, and Løland (2021), Redelmeier, Jullum, and +Aas (2020), Jullum, Redelmeier, and Aas (2021), Olsen et al. (2022), +Olsen et al. (2024) . See also Sellereite and Jullum (2019) for a brief +paper about the previous (\< 1.0.0) version of the package. ## Contribution @@ -232,3 +236,59 @@ Conduct](https://norskregnesentral.github.io/shapr/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. ## References + +
+ +
+ +Aas, Kjersti, Martin Jullum, and Anders Løland. 2021. “Explaining +Individual Predictions When Features Are Dependent: More Accurate +Approximations to Shapley Values.” *Artificial Intelligence* 298. + +
+ +
+ +Jullum, Martin, Annabelle Redelmeier, and Kjersti Aas. 2021. “Efficient +and Simple Prediction Explanations with groupShapley: A Practical +Perspective.” In *Proceedings of the 2nd Italian Workshop on Explainable +Artificial Intelligence*, 28–43. CEUR Workshop Proceedings. + +
+ +
+ +Olsen, Lars Henry Berge, Ingrid Kristine Glad, Martin Jullum, and +Kjersti Aas. 2022. “Using Shapley Values and Variational Autoencoders to +Explain Predictive Models with Dependent Mixed Features.” *Journal of +Machine Learning Research* 23 (213): 1–51. + +
+ +
+ +———. 2024. “A Comparative Study of Methods for Estimating Model-Agnostic +Shapley Value Explanations.” *Data Mining and Knowledge Discovery*, +1–48. + +
+ +
+ +Redelmeier, Annabelle, Martin Jullum, and Kjersti Aas. 2020. “Explaining +Predictive Models with Mixed Features Using Shapley Values and +Conditional Inference Trees.” In *International Cross-Domain Conference +for Machine Learning and Knowledge Extraction*, 117–37. Springer. + +
+ +
+ +Sellereite, N., and M. Jullum. 2019. “Shapr: An r-Package for Explaining +Machine Learning Models with Dependence-Aware Shapley Values.” *Journal +of Open Source Software* 5 (46): 2027. +. + +
+ +
diff --git a/_pkgdown.yml b/_pkgdown.yml index b768a879b..67e8ba212 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -26,4 +26,4 @@ navbar: href: reference/index.html python: text: Python - href: README_py.html + href: shaprpy.html diff --git a/inst/REFERENCES.bib b/inst/REFERENCES.bib index f0b00ec2d..2841183c3 100644 --- a/inst/REFERENCES.bib +++ b/inst/REFERENCES.bib @@ -217,3 +217,15 @@ @inproceedings{covert2021improving organization={PMLR} } + +@article{sellereite2019shapr, + title = {shapr: An R-package for explaining machine learning models with dependence-aware Shapley values}, + author = {Sellereite, N. and Jullum, M.}, + journal = {Journal of Open Source Software}, + year = {2019}, + volume = {5}, + number = {46}, + pages = {2027}, + doi = {10.21105/joss.02027} +} + diff --git a/man/figures/nrlogo_new.jpg b/man/figures/nrlogo_new.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a1871afd603ea8b43ce721c57b9055bd58919be6 GIT binary patch literal 35699 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 literal 0 HcmV?d00001 diff --git a/python/README.md b/python/README.md index 2be39efe4..38fc7c312 100644 --- a/python/README.md +++ b/python/README.md @@ -1,19 +1,15 @@ ---- -output: - html_document: default - pdf_document: default ---- -## shaprpy + +# shaprpy Python wrapper for the R package [shapr](https://github.com/NorskRegnesentral/shapr). -NOTE: This wrapper is in an EXPERIMENTAL state. Bugs and breaking changes are not unlikely to occur. +NOTE: This wrapper is in an EXPERIMENTAL state. Bugs are not unlikely to occur. ### Install The below instructions assume you already have `pip` and `R` installed and exposed to the python environment where you want to run `shaprpy`. Official instructions for installing `pip` can be found [here](https://pip.pypa.io/en/stable/installation/), and for `R` [here](https://cran.r-project.org/). -R can also be installed with pip as follows: +`R` can also be installed with pip as follows: ``` pip install rbase ```