{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Simple training with the Trainer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Halerium, a model with data for some of its variables usually needs to be \"solved\" before it can be employed to compute statistical properties consistent with the provided data. This solving step may also be referred to as \"fitting the model to the data\" (which is roughly what happens under the hood) or (in particular in the context of machine learning) as \"training\".\n", "\n", "The simplest way to train a model is to use the `Trainer` class.\n", "\n", "The result of the training is the posterior graph representing the trained model. This graph can be used to compute predictions from the trained model, see [Outlook](#predictions), and [Predictor](./../02_objectives/03_predictor.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to import the following packages, classes, and functions." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# for handling data:\n", "import numpy as np\n", "\n", "# for plotting\n", "import matplotlib.pyplot as plt\n", "\n", "# for graphs:\n", "from halerium.core import Graph, Variable, StaticVariable, show\n", "\n", "# for training models\n", "from halerium.core.model import Trainer\n", "\n", "# for predictions\n", "from halerium import Predictor" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The graph and data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For training models, we need a graph representing the prior statistical properties and connections between variables, and data for some of those variables.\n", "\n", "Let us define a simple graph." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "graph = Graph(\"graph\")\n", "with graph:\n", " x = Variable(\"x\", shape=(), mean=0, variance=1**2)\n", " a = StaticVariable(\"a\", shape=(), mean=1, variance=5**2)\n", " b = StaticVariable(\"b\", shape=(), mean=0, variance=5**2)\n", " y = Variable(\"y\", shape=(), mean=a * x + b, variance=1**2) \n", " \n", "show(graph)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we create some data for training." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "true_slope = 2\n", "true_intercept = 1.5\n", "\n", "x_train_data = np.linspace(-10, 10, 40)\n", "y_train_data = true_slope * x_train_data + true_intercept + np.random.normal(size=x_train_data.shape)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot the training data to get a visual impression." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x_train_data, y_train_data, '+b');\n", "plt.xlabel('x');\n", "plt.ylabel('y');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A `Trainer` expects the training data in the form of a dictionary with variables in the graph as keys and the data for these variables as values." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "train_data = {graph.x: x_train_data, graph.y: y_train_data}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training with trainer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A `Trainer` is instantiated with the untrained graph and the training data. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "trainer = Trainer(graph=graph,\n", " data=train_data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The instance can then be called to obtain a trained graph." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "trained_graph = trainer()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Outlook - Computing predictions\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Predictions can be computed using a `Predictor` ([predictor.ipynp](./../objectives/predictor.ipynb)) with the trained graph and prediction input data provided upon initialization.\n", "\n", "Let's create some input data for the predictions." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "x_prediction_data = np.linspace(-10, 10, 21)\n", "prediction_input_data = {graph.x: x_prediction_data}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we create a `Predictor` instance." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "predictor = Predictor(graph=trained_graph,\n", " data=prediction_input_data,\n", " method=\"MAP\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We call the predictor with the variable for which we want to have predictions, i.e. `graph.y` in our case." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "y_prediction_data = predictor(graph.y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot these predictions on top of the training data." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(x_train_data, y_train_data, '+b');\n", "plt.plot(x_prediction_data, y_prediction_data, '.r');\n", "plt.xlabel('x');\n", "plt.ylabel('y');\n", "plt.legend(['training data', 'predictions']);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.9" } }, "nbformat": 4, "nbformat_minor": 4 }