From 5c928ccd8fcbdafa82573549c147b804d5670d3d Mon Sep 17 00:00:00 2001 From: Jack Gerrits Date: Mon, 10 Jul 2023 23:02:42 -0400 Subject: [PATCH] docs: add getting started for python (#51) --- reductionml-python/docs/environment.yml | 3 + reductionml-python/docs/source/conf.py | 1 + .../docs/source/getting_started.ipynb | 154 ++++++++++++++++++ reductionml-python/docs/source/index.rst | 13 +- reductionml-python/docs/source/reference.rst | 6 + 5 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 reductionml-python/docs/source/getting_started.ipynb create mode 100644 reductionml-python/docs/source/reference.rst diff --git a/reductionml-python/docs/environment.yml b/reductionml-python/docs/environment.yml index 1ce363a..4198050 100644 --- a/reductionml-python/docs/environment.yml +++ b/reductionml-python/docs/environment.yml @@ -5,3 +5,6 @@ dependencies: - python=3.10 - pip: - furo + - myst-nb + - scikit-learn + - matplotlib diff --git a/reductionml-python/docs/source/conf.py b/reductionml-python/docs/source/conf.py index be06922..faa2a99 100644 --- a/reductionml-python/docs/source/conf.py +++ b/reductionml-python/docs/source/conf.py @@ -34,6 +34,7 @@ "sphinx.ext.autodoc", "sphinx.ext.autosummary", "sphinx.ext.napoleon", + "myst_nb" ] # Add any paths that contain templates here, relative to this directory. diff --git a/reductionml-python/docs/source/getting_started.ipynb b/reductionml-python/docs/source/getting_started.ipynb new file mode 100644 index 0000000..022242b --- /dev/null +++ b/reductionml-python/docs/source/getting_started.ipynb @@ -0,0 +1,154 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting started\n", + "\n", + "Before we get started, ensure you have the required packages installed:\n", + "\n", + "```sh\n", + "pip install reductionml scikit-learn\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "from reductionml import Workspace, FormatType" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we need to define the configuration we are going to use. You can think of this as the definition of the structure of the reduction stack, including all things that will affect learning and prediction. Things such as hyper parameters.\n", + "\n", + "We will create an instance of [`Coin`](https://jackgerrits.com/reductionml/book/coin.html) as the only reduction in our stack which provides solves for linear regression problems." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "config = {\n", + " \"entryReduction\": {\n", + " \"config\": {},\n", + " \"typename\": \"Coin\"\n", + " }, \n", + " \"globalConfig\": {\n", + " \"interactions\": [\n", + " [\"Default\", \"Default\"]\n", + " ]\n", + " }\n", + "}\n", + "\n", + "workspace = Workspace.create_from_config(config)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're going to use the diabetes dataset from sklearn and plot the mean squared error after each example. We're using the [JSON](https://jackgerrits.github.io/reductionml/book/input_formats.html#json-format) format to provide the features to ReductionML.\n", + "\n", + "We use `predict_then_learn` to predict the output of the model before learning and keep track of the progressive loss.s" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sklearn.datasets\n", + "import sklearn.model_selection\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "def format_input(features, label):\n", + " return {\n", + " \"label\": {\n", + " \"value\": label,\n", + " \"weight\": 1.0\n", + " },\n", + " \"features\": {\n", + " \":default\": features.tolist()\n", + " }\n", + " }\n", + "\n", + "dataset = sklearn.datasets.load_diabetes()\n", + "\n", + "parser = workspace.create_parser(FormatType.Json)\n", + "\n", + "mse_error = 0\n", + "count = 0\n", + "mse_errors = []\n", + "for (input_features, input_label) in zip(dataset.data, dataset.target):\n", + " features, label = parser.parse(format_input(input_features, input_label))\n", + " prediction = workspace.predict_then_learn(features, label)\n", + " mse_error += (label.value - prediction.prediction) ** 2\n", + " count += 1\n", + " mse_errors.append(mse_error / count)\n", + "\n", + "plt.plot(mse_errors)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/reductionml-python/docs/source/index.rst b/reductionml-python/docs/source/index.rst index 9ce6fe1..fd10c3b 100644 --- a/reductionml-python/docs/source/index.rst +++ b/reductionml-python/docs/source/index.rst @@ -1,7 +1,14 @@ reductionml =========== -.. automodule:: reductionml - :members: - :undoc-members: +Install from PyPi: +.. code-block:: bash + + pip install reductionml + +.. toctree:: + :hidden: + + getting_started + reference diff --git a/reductionml-python/docs/source/reference.rst b/reductionml-python/docs/source/reference.rst new file mode 100644 index 0000000..383325f --- /dev/null +++ b/reductionml-python/docs/source/reference.rst @@ -0,0 +1,6 @@ +Reference +========= + +.. automodule:: reductionml + :members: + :undoc-members: