{ "cells": [ { "cell_type": "markdown", "id": "440be274-51e1-447f-aa70-ef832e5f9449", "metadata": {}, "source": [ "# Bias-Variance Visualizations\n", "\n", "In this example, we will look at four different models with the different possible combinations of bias and variance (high and low). Histograms will be constructed for error over five iterations of training and testing. Then we will calculate the average loss, average bias, average variance, and net variance over 100 iterations of training and testing." ] }, { "cell_type": "code", "execution_count": 1, "id": "84f10ff2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", "I0000 00:00:1701450524.267373 1 tfrt_cpu_pjrt_client.cc:349] TfrtCpuClient created.\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "import torch\n", "import torch.nn as nn\n", "\n", "from sklearn.datasets import fetch_california_housing\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.utils import resample\n", "\n", "from mvtk.bias_variance import bias_variance_compute, bias_variance_mse, bootstrap_train_and_predict\n", "from mvtk.bias_variance.estimators import EstimatorWrapper, PyTorchEstimatorWrapper, SciKitLearnEstimatorWrapper" ] }, { "cell_type": "code", "execution_count": 2, "id": "bbebb612-f174-43f4-ba3e-248162bdf145", "metadata": {}, "outputs": [], "source": [ "random_state=123\n", "trials_graph=5\n", "trials_full=100\n", "bins=20" ] }, { "cell_type": "markdown", "id": "056ddfd2", "metadata": {}, "source": [ "## Load the example dataset and create helper functions" ] }, { "cell_type": "code", "execution_count": 3, "id": "1b6763e6", "metadata": {}, "outputs": [], "source": [ "housing = fetch_california_housing()\n", "X = pd.DataFrame(housing.data, columns=housing.feature_names)\n", "y = housing.target\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=random_state)" ] }, { "cell_type": "code", "execution_count": 4, "id": "ddf47d23-ec6d-4870-b77d-4269347bb86e", "metadata": {}, "outputs": [], "source": [ "import warnings\n", "\n", "def predict_trials(estimator, X_train, y_train, X_test, iterations, random_state, fit_kwargs=None, predict_kwargs=None):\n", " with warnings.catch_warnings():\n", " warnings.simplefilter('ignore')\n", " predictions = np.zeros((iterations, y_test.shape[0]), dtype=np.float64)\n", " \n", " for i in range(iterations):\n", " predictions[i] = bootstrap_train_and_predict(estimator, X_train, y_train, X_test, random_state=random_state, \n", " fit_kwargs=fit_kwargs, predict_kwargs=predict_kwargs)\n", " \n", " return predictions" ] }, { "cell_type": "code", "execution_count": 5, "id": "5f1b9ca5-1ea6-4b89-af8c-f8386f2a8220", "metadata": {}, "outputs": [], "source": [ "def graph_trials(predictions, y_test, bins):\n", " error_graph = np.swapaxes(predictions - y_test, 0, 1)\n", "\n", " plt.hist(error_graph, bins, density=True, label=[f'Trial {x}' for x in range(1, predictions.shape[0] + 1)])\n", " plt.xlabel('mean squared error')\n", " plt.legend()" ] }, { "cell_type": "markdown", "id": "f2e1d891-fde6-4635-997b-346b385d4560", "metadata": {}, "source": [ "## Label Distribution\n", "\n", "First, let's take a look at the distribution of the labels. Notice that the majority of label values are around 1 and 2, and much less around 5." ] }, { "cell_type": "code", "execution_count": 6, "id": "0197d6ae-7ec3-400e-8540-efbd7da1d08f", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(y, density=True)\n", "plt.savefig('bias_variance_label_distribution.png')" ] }, { "cell_type": "markdown", "id": "73a13343", "metadata": {}, "source": [ "## High Bias Low Variance Example\n", "\n", "We will introduce an artificial bias to a Scikit-Learn Linear Regression model by adding 10 to every label of the training label set. Given that values of greater than 5 in the entire label set are considered outliers, we are fitting the model against outliers." ] }, { "cell_type": "code", "execution_count": 7, "id": "5ac18d40-42f4-45a3-854f-31311e39eab0", "metadata": {}, "outputs": [], "source": [ "model_bias = LinearRegression()\n", "model_bias_wrapped = SciKitLearnEstimatorWrapper(model_bias)\n", "\n", "# add artificial bias to training labels\n", "y_train_bias = y_train + 10" ] }, { "cell_type": "code", "execution_count": 8, "id": "8b5a704a-fb61-4adf-9790-28730205a2d0", "metadata": {}, "outputs": [], "source": [ "pred_bias = predict_trials(model_bias_wrapped, X_train, y_train_bias, X_test, trials_graph, random_state)" ] }, { "cell_type": "code", "execution_count": 9, "id": "1a6d9156-a75e-419d-8f18-8dd7606e9ecf", "metadata": {}, "outputs": [ { "data": { "image/png": "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I5WXl+dyLZWVlZo6dapWrlypLl26tOBVNowwAgBAGzB//nwtWrRIBQUF9c5YHDt2TLGxscrOztb777+v8PBwjR8/XseOHXPpPAkJCbrhhhsUExPTUqWfFbdpAABoAxYuXKjRo0c32H/dddc5ba9YsUL+/v7aunWrbrzxxiadY926dcrLy1Nubu451eoqZkYAAGgDoqKiGu0vLS1VfHy8wsPD5efnJ19fX1VWVqqoqKhJ4xcXF2vOnDl66aWX5Onp2RIlNxkzIwAAtAGdO3dutD82NlZff/21li1bpl69eslutys6Olo1NTVNGn/Xrl0qKyvT0KFDHW21tbV677339Mwzz6i6ulru7u7ndA0NIYwAANAObNu2Tc8++6zGjx8v6fuZjiNHjjT5+F/96lfavXu3U1tcXJz69eun+++/v9WCiEQYAQCgXQgPD9fatWsVFRWliooK3XffffLy8mry8T4+PhowYIBTW+fOndWtW7cz2lsaYQQAcEFw5UfI2qJVq1Zp1qxZGjp0qEJDQ/Xoo49q3rx5pstqkmY9wJqenq6wsDB5enpq+PDh2rlzZ6P7Hz16VAkJCQoODpbdbtdll12mN998s1kFAwDQns2YMUNHjx51bI8aNUqWZcnf399pv9TUVOXn5zu2hwwZotzcXH333Xfau3evbr31Vh08eFBz58517GNZliZNmtTkWrZs2dLqv74qNWNmJDMzU0lJScrIyNDw4cO1dOlSjR07VoWFherevfsZ+9fU1Gj06NHq3r27/v73v6tHjx76/PPPz/hQAQDAhcnlMLJkyRLFx8crLi5OkpSRkaE33nhDq1ev1vz588/Yf/Xq1frmm2+0fft2dezYUZIUFhZ2blUDAIB2w6XbNDU1Ndq1a5fTr7K5ubkpJiZGOTk59R7z2muvKTo6WgkJCQoMDNSAAQP06KOPqra2tsHzVFdXq6KiwmkBAADtk0szI0eOHFFtba0CAwOd2gMDA7Vnz556j/nvf/+rd955R1OnTtWbb76p/fv36+6779bJkyeVkpJS7zFpaWn685//7EppANCosPlvONYPev7WqW9g755O26+knXKsvzMq3akvIcP5Vy4BnLtW/wXWuro6de/eXStWrFBkZKQmT56sBx54QBkZGQ0es2DBApWXlzuW4uLi1i4TAAAY4tLMSEBAgNzd3VVaWurUXlpaqqCg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kWG6tFa3atUqjRs37qyvim6rXnnlFb300kt6+eWXlZeXpxdeeEFPPPFEuw6aa9eulWVZ6tGjh+x2u/7yl79oypQpTq98ANqqkydP6vbbb5dlWVq+fLnpclrVtddeq/z8fG3fvl3XX3+9br/9dpWVlZkuy4E/UVpYcHCw+vfv79R2+eWXq6ioyFBF58fnn3+ut99+W3feeafpUlrNfffd55gdGThwoKZNm6Z7773X8VLI9uiSSy7R1q1bVVlZqeLiYu3cuVMnT55Unz59TJfWqoKCgiRJpaWlTu2lpaWOPrRtp4PI559/rs2bN7frWRFJ6ty5sy699FJdeeWVWrVqlTp06KBVq1aZLsuBMNLCrrrqKhUWFjq17d27V7169TJU0fnx/PPPq3v37rrhhhtMl9Jqjh8/fsaMgLu7u+rq6gxVdP507txZwcHB+vbbb7Vp0yZNnDjRdEmtqnfv3goKClJWVpajraKiQjt27FB0dLTBytASTgeRffv26e2331a3bt1Ml3Te1dXVqbq62nQZDi6/tReNu/feezVixAg9+uijuv3227Vz506tWLFCK1asMF1aq6mrq9Pzzz+v2NhYdejQfv+VmjBhgh555BH17NlTV1xxhT788EMtWbJEd9xxh+nSWs2mTZtkWZb69u2r/fv367777lO/fv0UFxdnurRzVllZqf379zu2Dxw4oPz8fHXt2lU9e/bU3Llz9fDDDys8PFy9e/fWgw8+qJCQEE2aNMlc0efgbNf7zTffqKioyPF7G6f/pyooKKjNzQY1dq3BwcG69dZblZeXp9dff121tbWO54C6du0qDw8PU2U3W2PX261bNz3yyCO66aabFBwcrCNHjig9PV1ffvnlz+snGAx/m6dd+te//mUNGDDAstvtVr9+/awVK1aYLqlVbdq0yZJkFRYWmi6lVVVUVFhz5syxevbsaXl6elp9+vSxHnjgAau6utp0aa0mMzPT6tOnj+Xh4WEFBQVZCQkJ1tGjR02X1SLeffddS9IZS2xsrGVZ33+998EHH7QCAwMtu91u/epXv2rT/46f7Xqff/75evtTUlKM1t0cjV3r6a8u17e8++67pktvlsau97vvvrNuvvlmKyQkxPLw8LCCg4Otm266ydq5c6fpsp3YLKsd/3wkAAD42eOZEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABGEUYAAIBRhBEAF5wZM2a02Z91B9ojwggAADCKMAKgTaqpqTFdgpP66qmtrW3WW52bexzQVhFGAANGjRqle+65R3PnzlWXLl0UGBiolStXqqqqSnFxcfLx8dGll16qt956y+m4jz/+WOPGjZO3t7cCAwM1bdo0HTlyxNG/ceNGXX311fL391e3bt1044036rPPPnP0Hzx4UDabTa+++qquvfZaderUSYMHD1ZOTk6DtVqWpdTUVPXs2VN2u10hISGaPXu2o7+srEwTJkyQl5eXevfurZdeeklhYWFaunSp0znz8/Mdxxw9elQ2m01btmyR9P1fvjNnzlTv3r3l5eWlvn37atmyZU51nL618sgjjygkJER9+/aVJBUXF+v222+Xv7+/unbtqokTJ+rgwYOO42pra5WUlOT4TP7whz+oKa/kys7O1jXXXCMvLy+FhoZq9uzZqqqqcvSHhYXpoYce0vTp0+Xr66tZs2ZpzZo18vf312uvvab+/fvLbrerqKhI3377raZPn64uXbqoU6dOGjdunPbt2+cYq6HjgAsFYQQw5IUXXlBAQIB27type+65R3fddZduu+02jRgxQnl5eRozZoymTZum48ePS/r+L/DrrrtOQ4YM0QcffKCNGzeqtLRUt99+u2PMqqoqJSUl6YMPPlBWVpbc3Nx08803n/F/2Q888IDmzZun/Px8XXbZZZoyZYpOnTpVb53/+Mc/9NRTT+m5557Tvn37tGHDBg0cONDRP2PGDBUXF+vdd9/V3//+dz377LMqKytz6bOoq6vTxRdfrL/97W/69NNPlZycrD/+8Y965ZVXnPbLyspSYWGhNm/erNdff10nT57U2LFj5ePjo3//+9/atm2bvL29df311ztmKp588kmtWbNGq1evVnZ2tr755hutX7++0Xo+++wzXX/99fr1r3+t//znP8rMzFR2drYSExOd9nviiSc0ePBgffjhh3rwwQclScePH9fixYv117/+VZ988om6d++uGTNm6IMPPtBrr72mnJwcWZal8ePH6+TJk46x6jsOuGAYfWcwcIEaOXKkdfXVVzu2T506ZXXu3NmaNm2ao+3QoUOWJCsnJ8eyLMt66KGHrDFjxjiNU1xcbElq8NX2hw8ftiRZu3fvtizLcrw+/a9//atjn08++cSSZBUUFNQ7xpNPPmlddtllVk1NzRl9hYWFliSn15EXFBRYkqynnnrK6ZwffvihY59vv/32rK9sT0hIsH796187tmNjY63AwECrurra0bZ27Vqrb9++Vl1dnaOturra8vLysjZt2mRZlmUFBwdbjz32mKP/5MmT1sUXX2xNnDixwXPPnDnTmjVrllPbv//9b8vNzc367rvvLMuyrF69elmTJk1y2uf555+3JFn5+fmOtr1791qSrG3btjnajhw5Ynl5eVmvvPJKg8cBFxJmRgBDBg0a5Fh3d3dXt27dnGYcAgMDJckxy/DRRx/p3Xfflbe3t2Pp16+fJDluxezbt09TpkxRnz595Ovrq7CwMEk6Y8r/x+cODg52Os9P3Xbbbfruu+/Up08fxcfHa/369Y5ZlIKCAnXo0EGRkZGO/fv16yd/f3+XP4/09HRFRkbqoosukre3t1asWHFG3QMHDpSHh4dj+6OPPtL+/fvl4+Pj+Ey6du2qEydO6LPPPlN5ebkOHTqk4cOHO47p0KGDoqKiGq3lo48+0po1a5w+67Fjx6qurk4HDhxw7FffOB4eHk6f7+nP6Mc1dOvWTX379lVBQUGDxwEXkg6mCwAuVB07dnTattlsTm02m02SHLdYKisrNWHCBC1evPiMsU4HigkTJqhXr15auXKlQkJCVFdXpwEDBpzxcGVj5/mp0NBQFRYW6u2339bmzZt199136/HHH9fWrVubdJ1ubt//P4/1o+c0fnx7QpLWrVunefPm6cknn1R0dLR8fHz0+OOPa8eOHU77de7c2Wm7srJSkZGReumll84470UXXdSk+upTWVmp3//+907PxpzWs2fPBuuRJC8vL8dn6ormHge0B4QRoI0YOnSo/vGPfygsLEwdOpz5n+7XX3+twsJCrVy5Utdcc42k7x/CbAleXl6aMGGCJkyYoISEBPXr10+7d+9Wv379dOrUKe3atUu/+MUvJEmFhYU6evSo49jToeDQoUMaMmSIJDk9zCpJ27Zt04gRI3T33Xc72n784G1Dhg4dqszMTHXv3l2+vr717hMcHKwdO3bol7/8pSQ56h06dGij43766ae69NJLz1rD2Vx++eU6deqUduzYoREjRkj64Z9V//79z3l8oD3gNg3QRiQkJOibb77RlClTlJubq88++0ybNm1SXFycamtr1aVLF3Xr1k0rVqzQ/v379c477ygpKemcz7tmzRqtWrVKH3/8sf773//qxRdflJeXl3r16qW+ffvq+uuv1+9//3vt2LFDu3bt0p133ikvLy/H8V5eXrryyiu1aNEiFRQUaOvWrfrTn/7kdI7w8HB98MEH2rRpk/bu3asHH3xQubm5Z61t6tSpCggI0MSJE/Xvf/9bBw4c0JYtWzR79mx98cUXkqQ5c+Zo0aJF2rBhg/bs2aO7777bKSzV5/7779f27duVmJio/Px87du3T//85z/PeIC1KcLDwzVx4kTFx8crOztbH330kX73u9+pR48emjhxosvjAe0RYQRoI0JCQrRt2zbV1tZqzJgxGjhwoObOnSt/f3+5ubnJzc1N69at065duzRgwADde++9evzxx8/5vP7+/lq5cqWuuuoqDRo0SG+//bb+9a9/qVu3bpKk559/XiEhIRo5cqRuueUWzZo164xvgqxevVqnTp1SZGSk5s6dq4cfftip//e//71uueUWTZ48WcOHD9fXX3/tNEvSkE6dOum9995Tz549dcstt+jyyy/XzJkzdeLECcdMyf/8z/9o2rRpio2NddwCuvnmmxsdd9CgQdq6dav27t2ra665RkOGDFFycrJCQkJc+egcnn/+eUVGRurGG29UdHS0LMvSm2++ecatOuBCZbOsJnzhHgBcEBYWprlz52ru3LmmSwHQBjAzAgAAjCKMAAAAo7hNAwAAjGJmBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABGEUYAAIBRhBEAAGDU/weUwiCS+XAR6wAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_trials(pred_bias, y_test, bins)\n", "plt.savefig('high_bias_low_variance.png')" ] }, { "cell_type": "markdown", "id": "f4b6fc0e-30a3-4add-b32c-adb7f5f4eefd", "metadata": {}, "source": [ "Notice in the figure above that the model error is very consistent among the trials and is not centered around 0.\n", "\n", "Next we calculate the values over 100 trials." ] }, { "cell_type": "code", "execution_count": 10, "id": "f304dcb0-6d5d-4331-b01a-cd42c4ef72d3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "average loss: 100.73667218\n", "average bias: 100.64990963\n", "average variance: 0.08676256\n", "net variance: 0.08676256\n" ] } ], "source": [ "avg_loss, avg_bias, avg_var, net_var = bias_variance_compute(model_bias_wrapped, X_train, y_train_bias, X_test, y_test, \n", " iterations=trials_full, random_state=random_state, \n", " decomp_fn=bias_variance_mse)\n", "\n", "print(f'average loss: {avg_loss:10.8f}')\n", "print(f'average bias: {avg_bias:10.8f}')\n", "print(f'average variance: {avg_var:10.8f}')\n", "print(f'net variance: {net_var:10.8f}')" ] }, { "cell_type": "markdown", "id": "436f0166-7c55-4687-a747-cafa9ac0e591", "metadata": {}, "source": [ "## Low Bias High Variance Example\n", "\n", "To simulate a higher variance, we will introduce 8 random \"noise\" features to the data set. We will also reduce the size of the training set and train a PyTorch neural network over a low number of epochs." ] }, { "cell_type": "code", "execution_count": 11, "id": "e0dc50a3-3b03-4c28-85f1-f9d603e5d6f3", "metadata": {}, "outputs": [], "source": [ "class ModelPyTorch(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " self.linear1 = nn.Linear(16, 64)\n", " self.linear2 = nn.Linear(64, 32)\n", " self.linear3 = nn.Linear(32, 16)\n", " self.linear4 = nn.Linear(16, 8)\n", " self.linear5 = nn.Linear(8, 1)\n", " \n", " def forward(self, x):\n", " x = self.linear1(x)\n", " x = self.linear2(x)\n", " x = self.linear3(x)\n", " x = self.linear4(x)\n", " x = self.linear5(x)\n", " return x" ] }, { "cell_type": "code", "execution_count": 12, "id": "3ecc2c3e-cddc-4a40-ae0c-c3870d180abc", "metadata": {}, "outputs": [], "source": [ "model_variance = ModelPyTorch()\n", "optimizer = torch.optim.Adam(model_variance.parameters(), lr=0.001)\n", "loss_fn = nn.MSELoss()" ] }, { "cell_type": "code", "execution_count": 13, "id": "fd0a853d-e74a-43e4-8d50-ba286323f13c", "metadata": {}, "outputs": [], "source": [ "def optimizer_generator(x):\n", " return torch.optim.Adam(x.parameters(), lr=0.001)\n", "\n", "model_variance_wrapped = PyTorchEstimatorWrapper(model_variance, optimizer_generator, loss_fn)" ] }, { "cell_type": "code", "execution_count": 14, "id": "88c4a23c-f44f-4c93-9664-7b828d2a3200", "metadata": {}, "outputs": [], "source": [ "X_train_torch = torch.FloatTensor(np.append(X_train.values[:100], 1000 * np.random.random_sample((100, 8)), axis=1))\n", "X_test_torch = torch.FloatTensor(np.append(X_test.values, 1000 * np.random.random_sample((6192, 8)), axis=1))\n", "y_train_torch = torch.FloatTensor(y_train[:100]).reshape(-1, 1)\n", "y_test_torch = torch.FloatTensor(y_test).reshape(-1, 1)" ] }, { "cell_type": "code", "execution_count": 15, "id": "036c2e2d-245c-4ab6-92fd-da72ba3dc5c2", "metadata": {}, "outputs": [], "source": [ "pred_variance = predict_trials(model_variance_wrapped, X_train_torch, y_train_torch, X_test_torch, trials_graph, random_state,\n", " fit_kwargs={'epochs': 20})" ] }, { "cell_type": "code", "execution_count": 16, "id": "3cb83233-f8aa-4053-84a9-417325cc89ba", "metadata": {}, "outputs": [ { "data": { "image/png": "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pvLycgUGBrq0BwYGqqCgoNJ1CgoK3Op/9uxZPfTQQxozZoz8/Pwq7ZOamiqn02lNISEh7uwGAACoZ2z1LaHz58/rnnvukTFGL7744iX7zZ07VydPnrSmI0eO1GKVAACgtjV1p3NAQICaNGmiwsJCl/bCwkIFBQVVuk5QUNAV9f8urHz++ed69913L3l2RZK8vLzk5eXlTukAAKAec+sMi6enp6Kjo5WRkWG1VVRUKCMjQ3FxcZWuExcX59JfkjZu3OjS/7uwcuDAAb3zzjtq1aqVO2UBAIAGzq0zLJKUlJSkxMRExcTEqFevXlq4cKFOnTqlCRMmSJLGjx+vdu3aKTU1VZI0Y8YM9e3bVwsWLNCQIUO0cuVK7d69W0uXLpX0bVj5r//6L+Xk5Ojtt99WeXm5dX/L9ddfL09Pz5raVwAAUE+5HVhGjx6tr776SsnJySooKFBkZKTWr19v3Vibn58vD4/vT9z07t1bK1as0MMPP6x58+YpPDxc6enp6tatmyTpiy++0FtvvSVJioyMdNnWpk2bdMcdd1Rz1wAAQEPhdmCRpKlTp2rq1KmVLtu8efNFbaNGjdKoUaMq7R8WFiZjTHXKAAAAjYStviUEAABQGQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwvaZ1XQCAxqX7691d5j9K/KiOKgFQn3CGBQAA2B6BBQAA2B6BBQAA2B6BBQAA2B6BBQAA2B7fEgKAyqQ4XWa7d+xgveabTUDt4wwLAACwPQILAACwPQILAACwPQILAACwPW66BQAbW3z/uy7zU5b0q6NKgLrFGRYAAGB7BBYAAGB7BBYAAGB7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16BBg3TgwAFrrEutBzQmBBbApl5//XUFBARo586dmjZtmn75y19q1KhR6t27t3JycjRgwACNGzdOp0+flvTth3y/fv108803a/fu3Vq/fr0KCwt1zz33WGOeOnVKSUlJ2r17tzIyMuTh4aGRI0de9K/13/zmN5o1a5b27t2rm266SWPGjNGFCxcqrfOvf/2rnnvuOb300ks6cOCA0tPT1b17d2v5vffeqyNHjmjTpk36y1/+ohdeeEFFRUVuHYuKigq1b99eq1ev1ieffKLk5GTNmzdPb775pku/jIwM5eXlaePGjXr77bd1/vx5JSQkqGXLlnr//fe1detW+fr6auDAgdYZjwULFmjZsmV69dVXlZmZqa+//lpr1qypsp6DBw9q4MCBuvvuu/Xhhx9q1apVyszM1NSpU136/e53v1PPnj21Z88ePfLII5Kk06dP66mnntIf//hHffzxx2rTpo3uvfde7d69W2+99ZaysrJkjNHgwYN1/vx5a6zK1gMalTr9rWgAlerbt6/p06ePNX/hwgXTokULM27cOKvt6NGjRpLJysoyxhjz+OOPmwEDBriMc+TIESPpop+O/85XX31lJJmPPvrIGGPMoUOHjCTzxz/+0erz8ccfG0kmNze30jEWLFhgbrrpJlNWVnbRsry8PCPJ7Ny502rLzc01ksxzzz3nss09e/ZYfb755hsjyWzatKnSbRpjzJQpU8zdd99tzScmJprAwEBz7tw5q2358uUmIiLCVFRUWG3nzp0zPj4+ZsOGDcYYY9q2bWuefvppa/n58+dN+/btzfDhwy+57YkTJ5rJkye7tL3//vvGw8PDnDlzxhhjTGhoqBkxYoRLn9dee81IMnv37rXaPv30UyPJbN261Wo7duyY8fHxMW+++eYl1wMaG86wADbVo0cP63WTJk3UqlUrlzMXgYGBkmSdrfjggw+0adMm+fr6WlOnTp0kybrsc+DAAY0ZM0Y33HCD/Pz8FBYWJkkXXV744bbbtm3rsp0fGzVqlM6cOaMbbrhBkyZN0po1a6yzMbm5uWratKmio6Ot/p06dZK/v7/bx2Px4sWKjo5W69at5evrq6VLl15Ud/fu3eXp6WnNf/DBB/rss8/UsmVL65hcf/31Onv2rA4ePKiTJ0/q6NGjio2NtdZp2rSpYmJiqqzlgw8+0LJly1yOdUJCgioqKnTo0CGrX2XjeHp6uhzf747RD2to1aqVIiIilJube8n1gMamaV0XAKByzZo1c5l3OBwubQ6HQ5KsyzmlpaUaNmyYnnrqqYvG+i50DBs2TKGhoXr55ZcVHBysiooKdevW7aIbQqvazo+FhIQoLy9P77zzjjZu3KgHHnhAzzzzjLZs2XJF++nh8e2/m8wP7hv54aUQSVq5cqVmzZqlBQsWKC4uTi1bttQzzzyjHTt2uPRr0aKFy3xpaamio6P1xhtvXLTd1q1bX1F9lSktLdV9993ncq/Odzp06HDJeiTJx8fHOqbuqO56QENBYAEaiKioKP31r39VWFiYmja9+K/28ePHlZeXp5dfflm33XabpG9vHK0JPj4+GjZsmIYNG6YpU6aoU6dO+uijj9SpUydduHBB2dnZuuWWWyRJeXl5OnHihLXud8Hh6NGjuvnmmyXJ5QZcSdq6dat69+6tBx54wGr74c3ClxIVFaVVq1apTZs28vPzq7RP27ZttWPHDt1+++2SZNUbFRVV5biffPKJbrzxxsvWcDmdO3fWhQsXtGPHDvXu3VvS9+9Vly5drnp8oKHgkhDQQEyZMkVff/21xowZo127dungwYPasGGDJkyYoPLycl133XVq1aqVli5dqs8++0zvvvuukpKSrnq7y5Yt0yuvvKJ9+/bpX//6l/785z/Lx8dHoaGhioiI0MCBA3Xfffdpx44dys7O1i9+8Qv5+PhY6/v4+OjWW29VWlqacnNztWXLFj388MMu2wgPD9fu3bu1YcMGffrpp3rkkUe0a9euy9Y2duxYBQQEaPjw4Xr//fd16NAhbd68WdOnT9e///1vSdKMGTOUlpam9PR07d+/Xw888IBLoKrMQw89pG3btmnq1Knau3evDhw4oL///e8X3XR7JcLDwzV8+HBNmjRJmZmZ+uCDD/Tf//3fateunYYPH+72eEBDRWABGojg4GBt3bpV5eXlGjBggLp3766ZM2fK399fHh4e8vDw0MqVK5Wdna1u3brpV7/6lZ555pmr3q6/v79efvll/eQnP1GPHj30zjvv6B//+IdatWolSXrttdcUHBysvn376q677tLkyZMv+obLq6++qgsXLig6OlozZ87Ub3/7W5fl9913n+666y6NHj1asbGxOn78uMvZlktp3ry53nvvPXXo0EF33XWXOnfurIkTJ+rs2bPWGZcHH3xQ48aNU2JionW5aeTIkVWO26NHD23ZskWffvqpbrvtNt18881KTk5WcHCwO4fO8tprryk6OlpDhw5VXFycjDFau3btRZcFgcbMYcwVPHAAAGpQWFiYZs6cqZkzZ9Z1KQDqCc6wAAAA2yOwAAAA2+OSEAAAsD3OsAAAANsjsAAAANsjsAAAANsjsAAAANsjsAAAANsjsAAAANsjsAAAANsjsAAAANv7/xbIOZV7vx3oAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_trials(pred_variance, y_test, bins)\n", "plt.savefig('low_bias_high_variance.png')" ] }, { "cell_type": "markdown", "id": "8eff5c60-1cd6-45a3-bac1-cd9fe55d9486", "metadata": {}, "source": [ "Notice in the figure above that the model error has different distributions among the trials and centers mainly around 0.\n", "\n", "Next we calculate the values over 100 trials." ] }, { "cell_type": "code", "execution_count": 17, "id": "a4b27030-2e59-4209-8ec1-bf9635abea73", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "average loss: 95.16939162\n", "average bias: 2.09532483\n", "average variance: 93.07406679\n", "net variance: 93.07406679\n" ] } ], "source": [ "avg_loss, avg_bias, avg_var, net_var = bias_variance_compute(model_variance_wrapped, X_train_torch, y_train_torch, \n", " X_test_torch, y_test, iterations=trials_full, \n", " random_state=random_state, decomp_fn=bias_variance_mse, \n", " fit_kwargs={'epochs': 20})\n", "\n", "print(f'average loss: {avg_loss:10.8f}')\n", "print(f'average bias: {avg_bias:10.8f}')\n", "print(f'average variance: {avg_var:10.8f}')\n", "print(f'net variance: {net_var:10.8f}')" ] }, { "cell_type": "markdown", "id": "35824e2b-59f0-476e-a9df-7f2ecd168771", "metadata": {}, "source": [ "## High Bias High Variance Example\n", "\n", "We will perform a combination of the techniques from the high bias low variance example and the low bias high variance example and train another PyTorch neural network." ] }, { "cell_type": "code", "execution_count": 18, "id": "91897cf7-c5ca-4a1f-8d72-7e50e96d96a6", "metadata": {}, "outputs": [], "source": [ "model_bias_variance = ModelPyTorch()\n", "optimizer = torch.optim.Adam(model_bias_variance.parameters(), lr=0.001)\n", "loss_fn = nn.MSELoss()" ] }, { "cell_type": "code", "execution_count": 19, "id": "633a2bfa-58b5-4f9b-8a67-93ff1cfd8c9b", "metadata": {}, "outputs": [], "source": [ "# Add artificial bias to the training labels\n", "y_train_torch_bias_variance = torch.FloatTensor(y_train[:100] + 10).reshape(-1, 1)" ] }, { "cell_type": "code", "execution_count": 20, "id": "65aab378-ce2f-45e4-b209-3d45fd7c998e", "metadata": {}, "outputs": [], "source": [ "def optimizer_generator(x):\n", " return torch.optim.Adam(x.parameters(), lr=0.001)\n", "\n", "model_bias_variance_wrapped = PyTorchEstimatorWrapper(model_bias_variance, optimizer_generator, loss_fn)" ] }, { "cell_type": "code", "execution_count": 21, "id": "209816f1-8a37-4261-84d5-5c4e4678e696", "metadata": {}, "outputs": [], "source": [ "pred_bias_variance = predict_trials(model_bias_variance_wrapped, X_train_torch, y_train_torch_bias_variance, \n", " X_test_torch, trials_graph, random_state,\n", " fit_kwargs={'epochs': 20})" ] }, { "cell_type": "code", "execution_count": 22, "id": "0606bb52-1847-4a67-9056-94ca07edb175", "metadata": {}, "outputs": [ { "data": { "image/png": "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hp/Sq1cvXb16VXv27NHAgQMlff//Ve/eva95fKA543IS0ExMnTpVX331lcaNG6d9+/bp+PHjevvtt5WYmKjKykq1b99eHTt21OrVq3Xs2DG9++67SkpKuubtrlu3TmvWrNHhw4f1f//3f/rzn/8sDw8Pde/eXcHBwYqLi9MjjzyiPXv2KCcnR//xH/8hDw8P+/oeHh668847tWjRIuXl5WnHjh2aP3++wzaCgoK0f/9+vf322/r000/15JNPat++fT9Z28MPPywfHx+NGjVKH3zwgU6cOKHMzEzNmDFDn3/+uSRp5syZWrRokbZs2aIjR47osccecwhZNXniiSe0a9cuTZs2TQcPHtTRo0f1t7/9rdqNvfURFBSkUaNGafLkycrKytKHH36of/u3f1PXrl01atQop8cDWhJCDNBM+Pv7a+fOnaqsrNSQIUMUGhqqWbNmydvbWy4uLnJxcdHGjRuVk5Ojvn376je/+Y2effbZa96ut7e3XnrpJf385z9Xv3799M477+jvf/+7OnbsKEl6+eWX5e/vr0GDBmn06NGaMmVKtW/WrF27VlevXlVERIRmzZql3/3udw7LH3nkEY0ePVpjx45VVFSUzp4963BWpjZt2rTR+++/r27dumn06NHq1auXJk2apEuXLtnPzDz++OMaP368EhIS7JeqHnjggTrH7devn3bs2KFPP/1Ud999t26//XalpKTI39/fmUNn9/LLLysiIkIjRoxQdHS0DMPQ1q1bq11SBODIYhj1eCACADSiwMBAzZo1S7NmzWrqUgCYGGdiAACAKRFiAACAKXE5CQAAmBJnYgAAgCkRYgAAgCkRYgAAgCkRYgAAgCkRYgAAgCkRYgAAgCkRYgAAgCkRYgAAgCn9fxf736fYf1lcAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_trials(pred_bias_variance, y_test, bins)\n", "plt.savefig('high_bias_high_variance.png')" ] }, { "cell_type": "markdown", "id": "0ca02163-0d18-48ca-892d-8bea81e10669", "metadata": {}, "source": [ "Notice in the figure above that the model error has different distributions among the trials and is not centered around 0.\n", "\n", "Next we calculate the values over 100 trials." ] }, { "cell_type": "code", "execution_count": 23, "id": "8c63ab2a-8f56-4f5d-afb0-f9bfa31dec4d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "average loss: 172.72894068\n", "average bias: 79.38170440\n", "average variance: 93.34723628\n", "net variance: 93.34723628\n" ] } ], "source": [ "avg_loss, avg_bias, avg_var, net_var = bias_variance_compute(model_bias_variance_wrapped, X_train_torch, y_train_torch_bias_variance, \n", " X_test_torch, y_test, iterations=trials_full, \n", " random_state=random_state, decomp_fn=bias_variance_mse, \n", " fit_kwargs={'epochs': 20})\n", "\n", "print(f'average loss: {avg_loss:10.8f}')\n", "print(f'average bias: {avg_bias:10.8f}')\n", "print(f'average variance: {avg_var:10.8f}')\n", "print(f'net variance: {net_var:10.8f}')" ] }, { "cell_type": "markdown", "id": "d044dbcd-8325-4c24-a4a3-83b73c61ef01", "metadata": {}, "source": [ "## Low Bias Low Variance Example\n", "\n", "Now we will train a Scikit Learn Linear Regression with no artificial bias." ] }, { "cell_type": "code", "execution_count": 24, "id": "78403d2e-2655-40c0-9357-837a2ed1e252", "metadata": {}, "outputs": [], "source": [ "# Low bias low variance\n", "model = LinearRegression()\n", "\n", "model_wrapped = SciKitLearnEstimatorWrapper(model)" ] }, { "cell_type": "code", "execution_count": 25, "id": "2cae33f2-6961-415a-aa0c-5406f7be8e92", "metadata": {}, "outputs": [], "source": [ "pred = predict_trials(model_wrapped, X_train, y_train, X_test, trials_graph, random_state)" ] }, { "cell_type": "code", "execution_count": 26, "id": "21673f12-c5e5-4d59-8497-f76c6ab74d84", "metadata": {}, "outputs": [ { "data": { "image/png": "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AgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwqovpAgDga+GLXnNZPuz9c+f88IH9Xda9nHHWZfnt8ZnO+aSsCW1QHYC2wsgIAAAwijACAACMIowAAACjWhRGMjMzFR4eLm9vb8XExGjnzp2NbvvKK68oOjpaQUFB6tatmyIjI7Vu3boWFwwAADoWt8NIdna2UlJSlJaWpsLCQo0cOVKTJk1SeXl5g9v36NFDv/vd75Sfn6///Oc/SkhIUEJCgjZv3nzBxQMAgPbP7TCybNkyJSYmKiEhQUOHDlVWVpZ8fX21Zs2aBrcfP368brnlFl1xxRW69NJLNX/+fI0YMUJ5eXmNHqO2tlZVVVUuEwAA6JjcCiN1dXUqKChQXFzcNx14eCguLk75+fnn3d+yLOXk5Ki4uFg//OEPG90uIyNDgYGBziksLMydMgEAQDviVhipqKiQw+FQSEiIS3tISIhKS0sb3a+yslJ+fn7y8vLSTTfdpCeffFITJ05sdPvFixersrLSOR05csSdMgEAQDtyUV565u/vr6KiIp06dUo5OTlKSUnRoEGDNH78+Aa3t9vtstvtF6M0AABgmFthJDg4WJ6eniorK3NpLysrU2hoaKP7eXh46LLLLpMkRUZGat++fcrIyGg0jAAAgM7Drcs0Xl5eioqKUk5OjrOtvr5eOTk5io2NbXY/9fX1qq2tdefQAACgg3L7Mk1KSori4+MVHR2tMWPGaPny5aqpqVFCQoIkadasWerbt68yMjIkfXUzanR0tC699FLV1tbq9ddf17p16/T000+37pkAAIB2ye0wMn36dB0/flypqakqLS1VZGSkNm3a5LyptaSkRB4e3wy41NTU6J577tEnn3wiHx8fDRkyRC+88IKmT5/eemcBAADarRbdwJqcnKzk5OQG1+Xm5rosP/TQQ3rooYdachgAANAJ8N00AADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjGpRGMnMzFR4eLi8vb0VExOjnTt3NrrtqlWrdO2116p79+7q3r274uLimtweAAB0Lm6HkezsbKWkpCgtLU2FhYUaOXKkJk2apPLy8ga3z83N1R133KF33nlH+fn5CgsL0/XXX69PP/30gosHAADtn9thZNmyZUpMTFRCQoKGDh2qrKws+fr6as2aNQ1u/+KLL+qee+5RZGSkhgwZomeffVb19fXKycm54OIBAED751YYqaurU0FBgeLi4r7pwMNDcXFxys/Pb1Yfp0+f1pkzZ9SjR49Gt6mtrVVVVZXLBAAAOia3wkhFRYUcDodCQkJc2kNCQlRaWtqsPu677z716dPHJdB8V0ZGhgIDA51TWFiYO2UCAIB25KI+TbN06VKtX79eGzZskLe3d6PbLV68WJWVlc7pyJEjF7FKAABwMXVxZ+Pg4GB5enqqrKzMpb2srEyhoaFN7vvYY49p6dKleuuttzRixIgmt7Xb7bLb7e6UBgAA2im3Rka8vLwUFRXlcvPp1zejxsbGNrrfn/70Jz344IPatGmToqOjW14tAADocNwaGZGklJQUxcfHKzo6WmPGjNHy5ctVU1OjhIQESdKsWbPUt29fZWRkSJIeeeQRpaam6qWXXlJ4eLjz3hI/Pz/5+fm14qkAAID2yO0wMn36dB0/flypqakqLS1VZGSkNm3a5LyptaSkRB4e3wy4PP3006qrq9Ntt93m0k9aWprS09MvrHoAANDuuR1GJCk5OVnJyckNrsvNzXVZPnz4cEsOAQAAOgm+mwYAABhFGAEAAEa16DINgM4rfNFrLsuHvX/usjx8YH/n/MsZZ13WvT0+0zmflDWhDaoD0B4xMgIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACM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3oqJidHOnTtNl9Qm3n33XU2ZMkV9+vSRzWZr8vvC2ruMjAxdddVV8vf3V69evTRt2jQVFxebLqvNPP300xoxYoTzZWexsbF64403TJfVJMLIRfbb3/72vK/Fbe+uu+46vfzyyyouLtbf/vY3HTx4ULfddpvpstrE/v37VV9fr2eeeUZ79+7VE088oaysLN1///2mS2szdXV1uv3223X33XebLqXVZWdnKyUlRWlpaSosLNTIkSM1adIklZeXmy6t1dXU1GjkyJHKzMw8/8bt3JYtW5SUlKTt27frzTff1JkzZ3T99derpqbm/Du3Q/369dPSpUtVUFCg9957TxMmTNDUqVO1d+9e06U1rjlfkIfW8frrr1tDhgyx9u7da0my3n//fdMlXRSvvvqqZbPZrLq6OtOlXBR/+tOfrIEDB5ouo80999xzVmBgoOkyWtWYMWOspKQk57LD4bD69OljZWRkGKyq7UmyNmzYYLqMi6a8vNySZG3ZssV0KRdN9+7drWeffdZ0GY1iZOQiKSsrU2JiotatWydfX1/T5Vw0n332mV588UWNHTtWXbt2NV3ORVFZWakePXqYLgNuqqurU0FBgeLi4pxtHh4eiouLU35+vsHK0NoqKyslqVP8O3U4HFq/fr1qamq+11/DQhi5CCzL0uzZs/XrX/9a0dHRpsu5KO677z5169ZNPXv2VElJiV599VXTJV0UBw4c0JNPPqm77rrLdClwU0VFhRwOh/Nt0l8LCQlRaWmpoarQ2urr67VgwQJdffXVHfpN4Lt375afn5/sdrt+/etfa8OGDRo6dKjpshpFGLkAixYtks1ma3Lav3+/nnzySVVXV2vx4sWmS26x5p7r1+699169//77+te//iVPT0/NmjVLVjt62a+75ytJn376qW644QbdfvvtSkxMNFR5y7TkfIH2KCkpSXv27NH69etNl9KmBg8erKKiIu3YsUN333234uPj9eGHH5ouq1G8Dv4CHD9+XCdOnGhym0GDBumnP/2p/vGPf8hmsznbHQ6HPD09NWPGDD3//PNtXeoFa+65enl5ndP+ySefKCwsTNu2bfteDxN+m7vne/ToUY0fP14/+MEPtHbtWpfvZ2oPWvLnu3btWi1YsEAnT55s4+oujrq6Ovn6+uqvf/2rpk2b5myPj4/XyZMnO/Tons1m04YNG1zOuyNKTk7Wq6++qnfffVcDBw40Xc5FFRcXp0svvVTPPPOM6VIa5PYX5eEbl1xyiS655JLzbvd///d/euihh5zLR48e1aRJk5Sdna2YmJi2LLHVNPdcG1JfXy/pq8ea2wt3zvfTTz/Vddddp6ioKD333HPtLohIF/bn21F4eXkpKipKOTk5zl/K9fX1ysnJUXJystnicEEsy9LcuXO1YcMG5ebmdrogIn31d/n7/DOYMHIR9O/f32XZz89PknTppZeqX79+JkpqMzt27NCuXbt0zTXXqHv37jp48KAeeOABXXrppe1mVMQdn376qcaPH68BAwboscce0/Hjx53rQkNDDVbWdkpKSvTZZ5+ppKREDofD+b6cyy67zPl3u71KSUlRfHy8oqOjNWbMGC1fvlw1NTVKSEgwXVqrO3XqlA4cOOBcPnTokIqKitSjR49zfma1d0lJSXrppZf06quvyt/f33kPUGBgoHx8fAxX1/oWL16sG2+8Uf3791d1dbVeeukl5ebmavPmzaZLa5zRZ3k6qUOHDnXYR3v/85//WNddd53Vo0cPy263W+Hh4davf/1r65NPPjFdWpt47rnnLEkNTh1VfHx8g+f7zjvvmC6tVTz55JNW//79LS8vL2vMmDHW9u3bTZfUJt55550G/xzj4+NNl9bqGvs3+txzz5kurU388pe/tAYMGGB5eXlZl1xyifWjH/3I+te//mW6rCZxzwgAADCq/V3cBgAAHQphBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABGEUYAAIBRhBEAnc7s2bM7/JfCAe0JYQQAABhFGAHQLtXV1ZkuwUVD9TgcDue3VrujpfsB7RVhBDBg/Pjxmjt3rhYsWKDu3bsrJCREq1atcn5DrL+/vy677DK98cYbLvvt2bNHN954o/z8/BQSEqKZM2eqoqLCuX7Tpk265pprFBQUpJ49e+rmm2/WwYMHnesPHz4sm82mV155Rdddd518fX01cuRI5efnN1qrZVlKT09X//79Zbfb1adPH82bN8+5vry8XFOmTJGPj48GDhyoF198UeHh4Vq+fLnLMb/+dl9JOnnypGw2m3JzcyV99ct3zpw5GjhwoHx8fDR48GCtWLHCpY6vL6388Y9/VJ8+fTR48GBJ0pEjR/TTn/5UQUFB6tGjh6ZOnarDhw8793M4HEpJSXF+Jr/97W/VnK/kysvL07XXXisfHx+FhYVp3rx5qqmpca4PDw/Xgw8+qFmzZikgIEB33nmn1q5dq6CgIP3973/X0KFDZbfbVVJSos8//1yzZs1S9+7d5evrqxtvvFEff/yxs6/G9gM6C8IIYMjzzz+v4OBg7dy5U3PnztXdd9+t22+/XWPHjlVhYaGuv/56zZw5U6dPn5b01S/wCRMmaNSoUXrvvfe0adMmlZWV6ac//amzz5qaGqWkpOi9995TTk6OPDw8dMstt5zzv+zf/e53WrhwoYqKinT55Zfrjjvu0NmzZxus829/+5ueeOIJPfPMM/r444+1ceNGDR8+3Ll+9uzZOnLkiN555x399a9/1VNPPaXy8nK3Pov6+nr169dPf/nLX/Thhx8qNTVV999/v15++WWX7XJyclRcXKw333xT//znP3XmzBlNmjRJ/v7++ve//62tW7fKz89PN9xwg3Ok4vHHH9fatWu1Zs0a5eXl6bPPPtOGDRuarOfgwYO64YYb9JOf/ET/+c9/lJ2drby8PCUnJ7ts99hjj2nkyJF6//339cADD0iSTp8+rUceeUTPPvus9u7dq169emn27Nl677339Pe//135+fmyLEuTJ0/WmTNnnH01tB/QaRj9zmCgkxo3bpx1zTXXOJfPnj1rdevWzZo5c6az7dixY5YkKz8/37Isy3rwwQet66+/3qWfI0eOWJKs4uLiBo9z/PhxS5K1e/duy7Is69ChQ5Yk69lnn3Vus3fvXkuStW/fvgb7ePzxx63LL7/cqqurO2ddcXGxJcnauXOns23fvn2WJOuJJ55wOeb777/v3Obzzz+3JFnvvPNOg8e0LMtKSkqyfvKTnziX4+PjrZCQEKu2ttbZtm7dOmvw4MFWfX29s622ttby8fGxNm/ebFmWZfXu3dv605/+5Fx/5swZq1+/ftbUqVMbPfacOXOsO++806Xt3//+t+Xh4WF98cUXlmVZ1oABA6xp06a5bPPcc89ZkqyioiJn20cffWRJsrZu3epsq6iosHx8fKyXX3650f2AzoSREcCQESNGOOc9PT3Vs2dPlxGHkJAQSXKOMnzwwQd655135Ofn55yGDBkiSc5LMR9//LHuuOMODRo0SAEBAQoPD5ekc4b8v33s3r17uxznu26//XZ98cUXGjRokBITE7VhwwbnKMq+ffvUpUsXRUVFObcfMmSIgoKC3P48MjMzFRUVpUsuuUR+fn5auXLlOXUPHz5cXl5ezuUPPvhABw4ckL+/v/Mz6dGjh7788ksdPHhQlZWVOnbsmGJiYpz7dOnSRdHR0U3W8sEHH2jt2rUun/WkSZNUX1+vQ4cOObdrqB8vLy+Xz/frz+jbNfTs2VODBw/Wvn37Gt0P6Ey6mC4A6Ky6du3qsmyz2VzabDabJDkvsZw6dUpTpkzRI488ck5fXweKKVOmaMCAAVq1apX69Omj+vp6DRs27JybK5s6zneFhYWpuLhYb731lt58803dc889evTRR7Vly5ZmnaeHx1f/57G+dZ/Gty9PSNL69eu1cOFCPf7444qNjZW/v78effRR7dixw2W7bt26uSyfOnVKUVFRevHFF8857iWXXNKs+hpy6tQp3XXXXS73xnytf//+jdYjST4+Ps7P1B0t3Q/oCAgjQDsxevRo/e1vf1N4eLi6dDn3n+6JEydUXFysVatW6dprr5X01U2YrcHHx0dTpkzRlClTlJSUpCFDhmj37t0aMmSIzp49q4KCAl111VWSpOLiYp08edK579eh4NixYxo1apQkudzMKklbt27V2LFjdc899zjbvn3jbWNGjx6t7Oxs9erVSwEBAQ1u07t3b+3YsUM//OEPJclZ7+jRo5vs98MPP9Rll1123hrO54orrtDZs2e1Y8cOjR07VtI3f1ZDhw694P6BjoDLNEA7kZSUpM8++0x33HGHdu3apYMHD2rz5s1KSEiQw+FQ9+7d1bNnT61cuVIHDhzQ22+/rZSUlAs+7tq1a7V69Wrt2bNH//3vf/XCCy/Ix8dHAwYM0ODBg3XDDTforrvu0o4dO1RQUKBf/epX8vHxce7v4+OjH/zgB1q6dKn27dunLVu26Pe//73LMSIiIvTee+9p8+bN+uijj/TAAw9o165d561txowZCg4O1tSpU/Xvf/9bhw4dUm5urubNm6dPPvlEkjR//nwtXbpUGzdu1P79+3XPPfe4hKWG3Hfffdq2bZuSk5NVVFSkjz/+WK+++uo5N7A2R0REhKZOnarExETl5eXpgw8+0C9+8Qv17dtXU6dOdbs/oCMijADtRJ8+fbR161Y5HA5df/31Gj58uBYsWKCgoCB5eHjIw8ND69evV0FBgYYNG6bf/OY3evTRRy/4uEFBQVq1apWuvvpqjRgxQm+99Zb+8Y9/qGfPnpKk5557Tn369NG4ceN066236s477zznSZA1a9bo7NmzioqK0oIFC/TQQw+5rL/rrrt06623avr06YqJidGJEydcRkka4+vrq3fffVf9+/fXrbfeqiuuuEJz5szRl19+6Rwp+X//7/9p5syZio+Pd14CuuWWW5rsd8SIEdqyZYs++ugjXXvttRo1apRSU1PVp08fdz46p+eee05RUVG6+eabFRsbK8uy9Prrr59zqQ7orGyW1YwH7gHADeHh4VqwYIEWLFhguhQA7QAjIwAAwCjCCAAAMIrLNAAAwChGRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABG/X9vAfgWlUEbEgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph_trials(pred, y_test, bins)\n", "plt.savefig('low_bias_low_variance.png')" ] }, { "cell_type": "markdown", "id": "e71ab6f6-fb30-4f77-b9b7-ecb3dcf294b8", "metadata": {}, "source": [ "Notice in the figure above that the model error is very consistent among the trials and centers mainly around 0.\n", "\n", "Next we calculate the values over 100 trials." ] }, { "cell_type": "code", "execution_count": 27, "id": "590ad983-c81a-426f-b709-5d6c7642d0f6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "average loss: 0.60725048\n", "average bias: 0.52048793\n", "average variance: 0.08676256\n", "net variance: 0.08676256\n" ] } ], "source": [ "avg_loss, avg_bias, avg_var, net_var = bias_variance_compute(model_wrapped, X_train, y_train, X_test, y_test, iterations=trials_full, \n", " random_state=random_state, decomp_fn=bias_variance_mse)\n", "\n", "print(f'average loss: {avg_loss:10.8f}')\n", "print(f'average bias: {avg_bias:10.8f}')\n", "print(f'average variance: {avg_var:10.8f}')\n", "print(f'net variance: {net_var:10.8f}')" ] }, { "cell_type": "code", "execution_count": null, "id": "b5091f45-727c-4ae2-bcc7-a2af108dadc1", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.13" } }, "nbformat": 4, "nbformat_minor": 5 }