# pyGAM
<a href="https://pygam.readthedocs.io/en/latest/?badge=latest"><img src=imgs/pygam_tensor.png width="250" align="right" /></a>
Generalized Additive Models in Python.
:rocket: **Version 0.10.1 out now!** [See release notes here](https://github.com/dswah/pyGAM/releases).
`pyGAM` is a package for building Generalized Additive Models in Python, with an emphasis on modularity and performance.
The API is designed for users of `scikit-learn` or `scipy`.
| | **[Documentation](https://pygam.readthedocs.io/en/latest/?badge=latest)** · **[Tutorials](https://pygam.readthedocs.io/en/latest/notebooks/tour_of_pygam.html)** · **[Medium article](https://medium.com/just-another-data-scientist/building-interpretable-models-with-generalized-additive-models-in-python-c4404eaf5515)** |
|---|---|
| **Open Source** | [](https://github.com/dswah/pygam/blob/main/LICENSE) [](https://gc-os-ai.github.io/) |
| **Community** | [](https://discord.gg/Rt8By5Jj) [](https://www.linkedin.com/company/german-center-for-open-source-ai) |
| **CI/CD** | [](https://github.com/dswah/pygam/actions/workflows/pypi.yml) [](https://pygam.readthedocs.io/en/latest/?badge=latest) |
| **Code** | [](https://pypi.org/project/pygam/) [](https://anaconda.org/conda-forge/pygam) [](https://www.python.org/) [](https://github.com/psf/black) |
| **Downloads** |   [)](https://pepy.tech/project/pygam) |
| **Citation** | [](https://doi.org/10.5281/zenodo.1208723) |
## Documentation
- [Official pyGAM Documentation: Read the Docs](https://pygam.readthedocs.io/en/latest/?badge=latest)
- [Building interpretable models with Generalized additive models in Python](https://medium.com/just-another-data-scientist/building-interpretable-models-with-generalized-additive-models-in-python-c4404eaf5515)
<!-----
[pyGAM: Getting started with Generalized Additive Models in Python](https://medium.com/@jpoberhauser/pygam-getting-started-with-generalized-additive-models-in-python-457df5b4705f)
----->
## Installation
```pip install pygam```
### scikit-sparse
To speed up optimization on large models with constraints, it helps to have `scikit-sparse` installed because it contains a slightly faster, sparse version of Cholesky factorization. The import from `scikit-sparse` references `nose`, so you'll need that too.
The easiest way is to use Conda:
```conda install -c conda-forge scikit-sparse nose```
[scikit-sparse project](https://github.com/scikit-sparse/scikit-sparse)
## Contributing - HELP REQUESTED
Contributions are most welcome!
You can help pyGAM in many ways including:
- Working on a [known bug](https://github.com/dswah/pyGAM/labels/bug).
- Trying it out and reporting bugs or what was difficult.
- Helping improve the documentation.
- Writing new [distributions](https://github.com/dswah/pyGAM/blob/master/pygam/distributions.py), and [link functions](https://github.com/dswah/pyGAM/blob/master/pygam/links.py).
- If you need some ideas, please take a look at the [issues](https://github.com/dswah/pyGAM/issues).
To start:
- **fork the project** and cut a new branch
- **install** `pygam`, editable with developer **dependencies** (in a new python environment)
```
pip install --upgrade pip
pip install -e ".[dev]"
```
Make some changes and write a test...
- **Test** your contribution (eg from the `.../pyGAM`):
```py.test -s```
- When you are happy with your changes, make a **pull request** into the `master` branch of the main project.
## About
Generalized Additive Models (GAMs) are smooth semi-parametric models of the form:
=\beta_0+f_1(X_1)+f_2(X_2)+\dots+f_p(X_p))
where `X.T = [X_1, X_2, ..., X_p]` are independent variables, `y` is the dependent variable, and `g()` is the link function that relates our predictor variables to the expected value of the dependent variable.
The feature functions `f_i()` are built using **penalized B splines**, which allow us to **automatically model non-linear relationships** without having to manually try out many different transformations on each variable.
<img src=imgs/pygam_basis.png>
GAMs extend generalized linear models by allowing non-linear functions of features while maintaining additivity. Since the model is additive, it is easy to examine the effect of each `X_i` on `Y` individually while holding all other predictors constant.
The result is a very flexible model, where it is easy to incorporate prior knowledge and control overfitting.
## Citing pyGAM
Please consider citing pyGAM if it has helped you in your research or work:
Daniel Servén, & Charlie Brummitt. (2018, March 27). pyGAM: Generalized Additive Models in Python. Zenodo. [DOI: 10.5281/zenodo.1208723](http://doi.org/10.5281/zenodo.1208723)
BibTex:
```
@misc{daniel\_serven\_2018_1208723,
author = {Daniel Servén and
Charlie Brummitt},
title = {pyGAM: Generalized Additive Models in Python},
month = mar,
year = 2018,
doi = {10.5281/zenodo.1208723},
url = {https://doi.org/10.5281/zenodo.1208723}
}
```
## References
1. Simon N. Wood, 2006
Generalized Additive Models: an introduction with R
0. Hastie, Tibshirani, Friedman
The Elements of Statistical Learning
https://www.sas.upenn.edu/~fdiebold/NoHesitations/BookAdvanced.pdf
0. James, Witten, Hastie and Tibshirani
An Introduction to Statistical Learning
http://www-bcf.usc.edu/~gareth/ISL/ISLR%20Sixth%20Printing.pdf
0. Paul Eilers & Brian Marx, 1996
Flexible Smoothing with B-splines and Penalties
https://sites.stat.washington.edu/courses/stat527/s14/readings/EilersMarx_StatSci_1996.pdf
0. Kim Larsen, 2015
GAM: The Predictive Modeling Silver Bullet
http://multithreaded.stitchfix.com/assets/files/gam.pdf
0. Deva Ramanan, 2008
UCI Machine Learning: Notes on IRLS
http://www.ics.uci.edu/~dramanan/teaching/ics273a_winter08/homework/irls_notes.pdf
0. Paul Eilers & Brian Marx, 2015
International Biometric Society: A Crash Course on P-splines
https://multithreaded.stitchfix.com/assets/files/gam.pdf
0. Keiding, Niels, 1991
Age-specific incidence and prevalence: a statistical perspective
https://academic.oup.com/jrsssa/article-abstract/154/3/371/7106499
<!---http://www.cs.princeton.edu/courses/archive/fall11/cos323/notes/cos323_f11_lecture09_svd.pdf--->
<!---http://www.stats.uwo.ca/faculty/braun/ss3859/notes/Chapter4/ch4.pdf--->
<!---http://www.stat.berkeley.edu/~census/mlesan.pdf--->
<!---http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node17.html---> <!--- this helped me get spline gradients--->
<!---https://scikit-sparse.readthedocs.io/en/latest/overview.html#developers--->
<!---https://vincentarelbundock.github.io/Rdatasets/datasets.html---> <!--- R Datasets!--->
Raw data
{
"_id": null,
"home_page": null,
"name": "pygam",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.9",
"maintainer_email": null,
"keywords": null,
"author": "Daniel Serv\u00e9n Mar\u00edn, Charlie Brummitt",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/11/62/ef01ba5f1ad7225b47565e06dc52d46901812ce92fd6400a68ced17dd0b2/pygam-0.10.1.tar.gz",
"platform": null,
"description": "\n\n# pyGAM\n\n<a href=\"https://pygam.readthedocs.io/en/latest/?badge=latest\"><img src=imgs/pygam_tensor.png width=\"250\" align=\"right\" /></a>\n\nGeneralized Additive Models in Python.\n\n:rocket: **Version 0.10.1 out now!** [See release notes here](https://github.com/dswah/pyGAM/releases).\n\n`pyGAM` is a package for building Generalized Additive Models in Python, with an emphasis on modularity and performance.\n\nThe API is designed for users of `scikit-learn` or `scipy`.\n\n\n| | **[Documentation](https://pygam.readthedocs.io/en/latest/?badge=latest)** \u00b7 **[Tutorials](https://pygam.readthedocs.io/en/latest/notebooks/tour_of_pygam.html)** \u00b7 **[Medium article](https://medium.com/just-another-data-scientist/building-interpretable-models-with-generalized-additive-models-in-python-c4404eaf5515)** |\n|---|---|\n| **Open Source** | [](https://github.com/dswah/pygam/blob/main/LICENSE) [](https://gc-os-ai.github.io/) |\n| **Community** | [](https://discord.gg/Rt8By5Jj) [](https://www.linkedin.com/company/german-center-for-open-source-ai) |\n| **CI/CD** | [](https://github.com/dswah/pygam/actions/workflows/pypi.yml) [](https://pygam.readthedocs.io/en/latest/?badge=latest) |\n| **Code** | [](https://pypi.org/project/pygam/) [](https://anaconda.org/conda-forge/pygam) [](https://www.python.org/) [](https://github.com/psf/black) |\n| **Downloads** |   [)](https://pepy.tech/project/pygam) |\n| **Citation** | [](https://doi.org/10.5281/zenodo.1208723) |\n\n## Documentation\n- [Official pyGAM Documentation: Read the Docs](https://pygam.readthedocs.io/en/latest/?badge=latest)\n- [Building interpretable models with Generalized additive models in Python](https://medium.com/just-another-data-scientist/building-interpretable-models-with-generalized-additive-models-in-python-c4404eaf5515)\n<!-----\n[pyGAM: Getting started with Generalized Additive Models in Python](https://medium.com/@jpoberhauser/pygam-getting-started-with-generalized-additive-models-in-python-457df5b4705f)\n----->\n\n## Installation\n```pip install pygam```\n\n### scikit-sparse\nTo speed up optimization on large models with constraints, it helps to have `scikit-sparse` installed because it contains a slightly faster, sparse version of Cholesky factorization. The import from `scikit-sparse` references `nose`, so you'll need that too.\n\nThe easiest way is to use Conda:\n```conda install -c conda-forge scikit-sparse nose```\n\n[scikit-sparse project](https://github.com/scikit-sparse/scikit-sparse)\n\n## Contributing - HELP REQUESTED\nContributions are most welcome!\n\nYou can help pyGAM in many ways including:\n\n- Working on a [known bug](https://github.com/dswah/pyGAM/labels/bug).\n- Trying it out and reporting bugs or what was difficult.\n- Helping improve the documentation.\n- Writing new [distributions](https://github.com/dswah/pyGAM/blob/master/pygam/distributions.py), and [link functions](https://github.com/dswah/pyGAM/blob/master/pygam/links.py).\n- If you need some ideas, please take a look at the [issues](https://github.com/dswah/pyGAM/issues).\n\n\nTo start:\n- **fork the project** and cut a new branch\n- **install** `pygam`, editable with developer **dependencies** (in a new python environment)\n\n```\npip install --upgrade pip\npip install -e \".[dev]\"\n```\n\nMake some changes and write a test...\n- **Test** your contribution (eg from the `.../pyGAM`):\n```py.test -s```\n- When you are happy with your changes, make a **pull request** into the `master` branch of the main project.\n\n\n## About\nGeneralized Additive Models (GAMs) are smooth semi-parametric models of the form:\n\n=\\beta_0+f_1(X_1)+f_2(X_2)+\\dots+f_p(X_p))\n\nwhere `X.T = [X_1, X_2, ..., X_p]` are independent variables, `y` is the dependent variable, and `g()` is the link function that relates our predictor variables to the expected value of the dependent variable.\n\nThe feature functions `f_i()` are built using **penalized B splines**, which allow us to **automatically model non-linear relationships** without having to manually try out many different transformations on each variable.\n\n<img src=imgs/pygam_basis.png>\n\nGAMs extend generalized linear models by allowing non-linear functions of features while maintaining additivity. Since the model is additive, it is easy to examine the effect of each `X_i` on `Y` individually while holding all other predictors constant.\n\nThe result is a very flexible model, where it is easy to incorporate prior knowledge and control overfitting.\n\n## Citing pyGAM\nPlease consider citing pyGAM if it has helped you in your research or work:\n\nDaniel Serv\u00e9n, & Charlie Brummitt. (2018, March 27). pyGAM: Generalized Additive Models in Python. Zenodo. [DOI: 10.5281/zenodo.1208723](http://doi.org/10.5281/zenodo.1208723)\n\nBibTex:\n```\n@misc{daniel\\_serven\\_2018_1208723,\n author = {Daniel Serv\u00e9n and\n Charlie Brummitt},\n title = {pyGAM: Generalized Additive Models in Python},\n month = mar,\n year = 2018,\n doi = {10.5281/zenodo.1208723},\n url = {https://doi.org/10.5281/zenodo.1208723}\n}\n```\n\n## References\n1. Simon N. Wood, 2006\nGeneralized Additive Models: an introduction with R\n\n0. Hastie, Tibshirani, Friedman\nThe Elements of Statistical Learning\nhttps://www.sas.upenn.edu/~fdiebold/NoHesitations/BookAdvanced.pdf\n\n0. James, Witten, Hastie and Tibshirani\nAn Introduction to Statistical Learning\nhttp://www-bcf.usc.edu/~gareth/ISL/ISLR%20Sixth%20Printing.pdf\n\n0. Paul Eilers & Brian Marx, 1996\nFlexible Smoothing with B-splines and Penalties\nhttps://sites.stat.washington.edu/courses/stat527/s14/readings/EilersMarx_StatSci_1996.pdf\n\n0. Kim Larsen, 2015\nGAM: The Predictive Modeling Silver Bullet\nhttp://multithreaded.stitchfix.com/assets/files/gam.pdf\n\n0. Deva Ramanan, 2008\nUCI Machine Learning: Notes on IRLS\nhttp://www.ics.uci.edu/~dramanan/teaching/ics273a_winter08/homework/irls_notes.pdf\n\n0. Paul Eilers & Brian Marx, 2015\nInternational Biometric Society: A Crash Course on P-splines\nhttps://multithreaded.stitchfix.com/assets/files/gam.pdf\n\n0. Keiding, Niels, 1991\nAge-specific incidence and prevalence: a statistical perspective\nhttps://academic.oup.com/jrsssa/article-abstract/154/3/371/7106499\n\n\n<!---http://www.cs.princeton.edu/courses/archive/fall11/cos323/notes/cos323_f11_lecture09_svd.pdf--->\n\n<!---http://www.stats.uwo.ca/faculty/braun/ss3859/notes/Chapter4/ch4.pdf--->\n\n<!---http://www.stat.berkeley.edu/~census/mlesan.pdf--->\n\n<!---http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node17.html---> <!--- this helped me get spline gradients--->\n\n<!---https://scikit-sparse.readthedocs.io/en/latest/overview.html#developers--->\n\n<!---https://vincentarelbundock.github.io/Rdatasets/datasets.html---> <!--- R Datasets!--->\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Generalized Additive Models in Python.",
"version": "0.10.1",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "bea7751c4919d7acb68abae27929a9489d52526f791ae9e3d5e32990377cd619",
"md5": "67bd747e11cb5f4e8c209faf66064a30",
"sha256": "9c87f644e43b9a4fa5eacddeb8a0579d35208ddf3442c23d30433b67c4f22864"
},
"downloads": -1,
"filename": "pygam-0.10.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "67bd747e11cb5f4e8c209faf66064a30",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.9",
"size": 80202,
"upload_time": "2025-07-26T17:31:24",
"upload_time_iso_8601": "2025-07-26T17:31:24.526297Z",
"url": "https://files.pythonhosted.org/packages/be/a7/751c4919d7acb68abae27929a9489d52526f791ae9e3d5e32990377cd619/pygam-0.10.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1162ef01ba5f1ad7225b47565e06dc52d46901812ce92fd6400a68ced17dd0b2",
"md5": "6f901f22e53bb7761403f54635beb111",
"sha256": "0d7c0ba235919dfadfe2347ca89c4fed5879acd428a944633959a8e0cc3e0311"
},
"downloads": -1,
"filename": "pygam-0.10.1.tar.gz",
"has_sig": false,
"md5_digest": "6f901f22e53bb7761403f54635beb111",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.9",
"size": 78244,
"upload_time": "2025-07-26T17:31:26",
"upload_time_iso_8601": "2025-07-26T17:31:26.019238Z",
"url": "https://files.pythonhosted.org/packages/11/62/ef01ba5f1ad7225b47565e06dc52d46901812ce92fd6400a68ced17dd0b2/pygam-0.10.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-26 17:31:26",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "pygam"
}