{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## skpro introduction notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Set-up instructions:** On binder, this should run out-of-the-box.\n", "\n", "To run locally instead, ensure that `skpro` with basic dependency requirements is installed in your python environment." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`skpro` provides `scikit-learn`-like, `scikit-base` compatible interfaces to:\n", "\n", "* tabular **supervised regressors with probabilistic prediction modes** - interval, quantile and distribution predictions\n", "* **performance metrics to evaluate probabilistic predictions**, e.g., pinball loss, empirical coverage, CRPS\n", "* **reductions** to turn non-probabilistic, `scikit-learn` regressors into probabilistic `skpro` regressors, such as bootstrap or conformal\n", "* tools for building **pipelines and composite machine learning models**, including tuning via probabilistic performance metrics\n", "* symbolic an lazy **probability distributions** with a value domain of `pandas.DataFrame`-s and a `pandas`-like interface\n", "\n", "**Section 1** provides an overview of common **probabilistic supervised regression workflows** supported by `skpro`.\n", "\n", "**Section 2** gives an more detailed introduction to **prediction modes, performance metrics, and benchmarking tools**.\n", "\n", "**Section 3** discusses **advanced composition patterns**, including various ways to add probabilistic capability to any `sklearn` regressor, pipeline building, tuning, ensembling.\n", "\n", "**Section 4** gives an introduction to how to write **custom estimators** compliant with the `skpro` interface." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# hide warnings\n", "import warnings\n", "\n", "warnings.filterwarnings(\"ignore\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Basic probabilistic supervised regression workflows " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`skpro` revolves around supervised probabilistic regressors:\n", "\n", "* `fit(X, y)` with tabular features `X`, labels `y`, same rows, both `pd.DataFrame`\n", "* `predict_interval(X_test, coverage=0.90)` for interval predictions of labels\n", "* `predict_quantiles(X_test, alpha=[0.05, 0.95])` for quantile predictions of labels\n", "* `predict_var(X_test)` for variance predictions of labels\n", "* `predict(X_test)` for mean predictions\n", "* `predict_proba(X_test)` for distributional prediction" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1 basic deployment workflow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`skpro` regressors are used via `fit` then `predict_proba` etc.\n", "\n", "Same as `sklearn` regressors - `X` and `y` should be `pd.DataFrame` (`numpy` is also ok but not recommended)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import train_test_split\n", "\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "# step 1: data specification\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_new, y_train, _ = train_test_split(X, y)\n", "\n", "# step 2: specifying the regressor\n", "# example - random forest for mean prediction\n", "# linear regression for variance prediction\n", "reg_mean = RandomForestRegressor()\n", "reg_resid = LinearRegression()\n", "reg_proba = ResidualDouble(reg_mean, reg_resid)\n", "\n", "# step 3: fitting the model to training data\n", "reg_proba.fit(X_train, y_train)\n", "\n", "# step 4: predicting labels on new data\n", "\n", "# probabilistic prediction modes - pick any or multiple\n", "# we show the return types in detail below\n", "\n", "# full distribution prediction\n", "y_pred_proba = reg_proba.predict_proba(X_new)\n", "\n", "# interval prediction\n", "y_pred_interval = reg_proba.predict_interval(X_new, coverage=0.9)\n", "\n", "# quantile prediction\n", "y_pred_quantiles = reg_proba.predict_quantiles(X_new, alpha=[0.05, 0.5, 0.95])\n", "\n", "# variance prediction\n", "y_pred_var = reg_proba.predict_var(X_new)\n", "\n", "# mean prediction is same as \"classical\" sklearn predict, also available\n", "y_pred_mean = reg_proba.predict(X_new)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1.1 distribution predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`y_pred_proba` is an `skpro` distribution - it has index and columns like `pd.DataFrame`\n", "\n", "\"we predict that true labels are distributed according to `y_pred_proba`\"\n", "\n", "(here: distribution marginal by row/columns)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Normal(columns=Index(['target'], dtype='object'),\n",
       "       index=Index([287, 134, 213,  82, 251,  45, 350, 285,  22, 236,\n",
       "       ...\n",
       "       218, 235, 166, 361, 272, 333, 219, 310, 178, 233],\n",
       "      dtype='int64', length=111),\n",
       "       mu=array([[158.75],\n",
       "       [171.91],\n",
       "       [ 86.32],\n",
       "       [ 94.1 ],\n",
       "       [251.72],\n",
       "       [100.72],\n",
       "       [262.36],\n",
       "       [209.04],\n",
       "       [ 85.69],\n",
       "       [171.23],\n",
       "       [182.31],\n",
       "       [237.8 ],\n",
       "       [179.06],\n",
       "       [109.77],\n",
       "       [ 90.58],\n",
       "       [184.38],\n",
       "       [135.62],\n",
       "       [179.12],\n",
       "       [ 70.68],\n",
       "       [178.36]...\n",
       "       [16.83771976],\n",
       "       [19.10672381],\n",
       "       [19.63878908],\n",
       "       [16.46098141],\n",
       "       [15.70910931],\n",
       "       [12.90608099],\n",
       "       [19.66465255],\n",
       "       [20.89400588],\n",
       "       [19.28096697],\n",
       "       [22.39693358],\n",
       "       [15.26815129],\n",
       "       [18.49072135],\n",
       "       [16.44625929],\n",
       "       [14.43024188],\n",
       "       [16.19206731],\n",
       "       [21.27391581],\n",
       "       [19.50839963],\n",
       "       [12.64715474],\n",
       "       [13.93531633],\n",
       "       [17.53348762],\n",
       "       [20.01785524],\n",
       "       [19.57531732],\n",
       "       [21.54329846],\n",
       "       [13.07775327],\n",
       "       [13.55384321]]))
Please rerun this cell to show the HTML repr or trust the notebook.
" ], "text/plain": [ "Normal(columns=Index(['target'], dtype='object'),\n", " index=Index([287, 134, 213, 82, 251, 45, 350, 285, 22, 236,\n", " ...\n", " 218, 235, 166, 361, 272, 333, 219, 310, 178, 233],\n", " dtype='int64', length=111),\n", " mu=array([[158.75],\n", " [171.91],\n", " [ 86.32],\n", " [ 94.1 ],\n", " [251.72],\n", " [100.72],\n", " [262.36],\n", " [209.04],\n", " [ 85.69],\n", " [171.23],\n", " [182.31],\n", " [237.8 ],\n", " [179.06],\n", " [109.77],\n", " [ 90.58],\n", " [184.38],\n", " [135.62],\n", " [179.12],\n", " [ 70.68],\n", " [178.36]...\n", " [16.83771976],\n", " [19.10672381],\n", " [19.63878908],\n", " [16.46098141],\n", " [15.70910931],\n", " [12.90608099],\n", " [19.66465255],\n", " [20.89400588],\n", " [19.28096697],\n", " [22.39693358],\n", " [15.26815129],\n", " [18.49072135],\n", " [16.44625929],\n", " [14.43024188],\n", " [16.19206731],\n", " [21.27391581],\n", " [19.50839963],\n", " [12.64715474],\n", " [13.93531633],\n", " [17.53348762],\n", " [20.01785524],\n", " [19.57531732],\n", " [21.54329846],\n", " [13.07775327],\n", " [13.55384321]]))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba = reg_proba.predict_proba(X_new)\n", "y_pred_proba" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`skpro` distribution objects are pandas-like" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(111, 1)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.shape" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index([287, 134, 213, 82, 251, 45, 350, 285, 22, 236,\n", " ...\n", " 218, 235, 166, 361, 272, 333, 219, 310, 178, 233],\n", " dtype='int64', length=111)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.index # same index as X_new" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['target'], dtype='object')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.columns # same columns as X_new" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "distribution objects have `sample` and methods such as `mean`, `var`:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287176.508550
134161.825887
21394.371796
82107.464801
251247.966573
\n", "
" ], "text/plain": [ " target\n", "287 176.508550\n", "134 161.825887\n", "213 94.371796\n", "82 107.464801\n", "251 247.966573" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.sample().head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287158.75
134171.91
21386.32
8294.10
251251.72
\n", "
" ], "text/plain": [ " target\n", "287 158.75\n", "134 171.91\n", "213 86.32\n", "82 94.10\n", "251 251.72" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.mean().head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287362.869338
134271.792914
213289.466582
82125.589059
251479.705452
\n", "
" ], "text/plain": [ " target\n", "287 362.869338\n", "134 271.792914\n", "213 289.466582\n", "82 125.589059\n", "251 479.705452" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.var().head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "more details on `skpro` distributions in the \"distributions\" tutorial!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1.2 interval predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "interval prediction `y_pred_interval` is a `pd.DataFrame`:\n", "\n", "* rows are the same as `X_new`\n", "* columns indicate variables, nominal coverage, and bottom/upper bound\n", "\n", "\"we predict that value in row falls between bottom/upper with 90% chance\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0.9
lowerupper
287127.416970190.083030
134144.792708199.027292
21358.334925114.305075
8275.666697112.533303
251215.694121287.745879
\n", "
" ], "text/plain": [ " target \n", " 0.9 \n", " lower upper\n", "287 127.416970 190.083030\n", "134 144.792708 199.027292\n", "213 58.334925 114.305075\n", "82 75.666697 112.533303\n", "251 215.694121 287.745879" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_interval = reg_proba.predict_interval(X_new, coverage=0.9)\n", "y_pred_interval.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "multiple coverages can be passed:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0.500.900.95
lowerupperlowerupperlowerupper
287145.901557171.598443127.416970190.083030121.414392196.085608
134160.790265183.029735144.792708199.027292139.597753204.222247
21374.84442297.79557858.334925114.30507552.973726119.666274
8286.541228101.65877275.666697112.53330372.135365116.064635
251236.947205266.492795215.694121287.745879208.792518294.647482
.....................
333176.038162203.041838156.613558222.466442150.305725228.774275
219150.266649176.673351131.271468195.668532125.103083201.836917
310190.349266219.410734169.444427240.315573162.655911247.104089
17877.29918994.94081164.609010107.63099060.488075111.751925
233155.038072173.321928141.885912186.474088137.614955190.745045
\n", "

111 rows × 6 columns

\n", "
" ], "text/plain": [ " target \n", " 0.50 0.90 0.95 \n", " lower upper lower upper lower upper\n", "287 145.901557 171.598443 127.416970 190.083030 121.414392 196.085608\n", "134 160.790265 183.029735 144.792708 199.027292 139.597753 204.222247\n", "213 74.844422 97.795578 58.334925 114.305075 52.973726 119.666274\n", "82 86.541228 101.658772 75.666697 112.533303 72.135365 116.064635\n", "251 236.947205 266.492795 215.694121 287.745879 208.792518 294.647482\n", ".. ... ... ... ... ... ...\n", "333 176.038162 203.041838 156.613558 222.466442 150.305725 228.774275\n", "219 150.266649 176.673351 131.271468 195.668532 125.103083 201.836917\n", "310 190.349266 219.410734 169.444427 240.315573 162.655911 247.104089\n", "178 77.299189 94.940811 64.609010 107.630990 60.488075 111.751925\n", "233 155.038072 173.321928 141.885912 186.474088 137.614955 190.745045\n", "\n", "[111 rows x 6 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coverage = [0.5, 0.9, 0.95]\n", "y_pred_ints = reg_proba.predict_interval(X_new, coverage=coverage)\n", "y_pred_ints" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`predict_interval` output spec:\n", "\n", "`pandas.DataFrame`\\\n", "Row index is as for `X_new`\\\n", "Column has multi-index:\\\n", "1st level = variable names from `y` in fit\\\n", "2nd level = coverage fractions in `coverage`\\\n", "3rd level = string `\"lower\"` or `\"upper\"`\n", "\n", "Entries = interval prediction of lower/upper interval at nominal coverage in 2nd lvl, for var in 1st lvl, for data index in row" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1.3 quantile predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "quantile prediction `y_pred_quantiles` is a `pd.DataFrame`:\n", "\n", "* rows are the same as `X_new`\n", "* columns indicate variables, quantile points\n", "\n", "\"we predict the 5%, 50%, 95% quantile points for the row to be here\"" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0.050.500.95
287127.416970158.75190.083030
134144.792708171.91199.027292
21358.33492586.32114.305075
8275.66669794.10112.533303
251215.694121251.72287.745879
\n", "
" ], "text/plain": [ " target \n", " 0.05 0.50 0.95\n", "287 127.416970 158.75 190.083030\n", "134 144.792708 171.91 199.027292\n", "213 58.334925 86.32 114.305075\n", "82 75.666697 94.10 112.533303\n", "251 215.694121 251.72 287.745879" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_quantiles = reg_proba.predict_quantiles(X_new, alpha=[0.05, 0.5, 0.95])\n", "y_pred_quantiles.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "multiple quantiles:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0.100.250.500.750.90
287134.337558145.901557158.75171.598443183.162442
134150.782158160.790265171.91183.029735193.037842
21364.51604474.84442286.3297.795578108.123956
8279.73809786.54122894.10101.658772108.461903
251223.651228236.947205251.72266.492795279.788772
..................
333163.886086176.038162189.54203.041838215.193914
219138.383221150.266649163.47176.673351188.556779
310177.271152190.349266204.88219.410734232.488848
17869.36018577.29918986.1294.940811102.879815
233146.810051155.038072164.18173.321928181.549949
\n", "

111 rows × 5 columns

\n", "
" ], "text/plain": [ " target \n", " 0.10 0.25 0.50 0.75 0.90\n", "287 134.337558 145.901557 158.75 171.598443 183.162442\n", "134 150.782158 160.790265 171.91 183.029735 193.037842\n", "213 64.516044 74.844422 86.32 97.795578 108.123956\n", "82 79.738097 86.541228 94.10 101.658772 108.461903\n", "251 223.651228 236.947205 251.72 266.492795 279.788772\n", ".. ... ... ... ... ...\n", "333 163.886086 176.038162 189.54 203.041838 215.193914\n", "219 138.383221 150.266649 163.47 176.673351 188.556779\n", "310 177.271152 190.349266 204.88 219.410734 232.488848\n", "178 69.360185 77.299189 86.12 94.940811 102.879815\n", "233 146.810051 155.038072 164.18 173.321928 181.549949\n", "\n", "[111 rows x 5 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alpha = [0.1, 0.25, 0.5, 0.75, 0.9]\n", "y_pred_quantiles = reg_proba.predict_quantiles(X_new, alpha=alpha)\n", "y_pred_quantiles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`predict_quantiles` output spec:\n", "\n", "`pandas.DataFrame`\\\n", "Row index is same as `X_new`\\\n", "Column has multi-index:\\\n", "1st level = variable names from `y` in `fit`\\\n", "2nd level = quantile points in `alpha`\n", "\n", "Entries = quantiles prediction at quantile point in 2nd lvl, for var in 1st lvl, for data index in row" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1.4 mean and variance predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "mean and variance predictions `y_pred_mean`, `y_pred_var` are `pd.DataFrame`-s:\n", "\n", "* rows are the same as `X_new`\n", "* columns are the same as `X_new`\n", "\n", "entries are predictive mean and variance in row/column" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "y_pred_mean = reg_proba.predict(X_new)\n", "y_pred_var = reg_proba.predict_var(X_new)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287158.75
134171.91
21386.32
8294.10
251251.72
\n", "
" ], "text/plain": [ " target\n", "287 158.75\n", "134 171.91\n", "213 86.32\n", "82 94.10\n", "251 251.72" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_mean.head()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287362.869338
134271.792914
213289.466582
82125.589059
251479.705452
\n", "
" ], "text/plain": [ " target\n", "287 362.869338\n", "134 271.792914\n", "213 289.466582\n", "82 125.589059\n", "251 479.705452" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_var.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "this is the same as taking the distribution prediction and taking mean/variance\n", "\n", "(for distribution objects that estimate these precisely)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287158.75
134171.91
21386.32
8294.10
251251.72
\n", "
" ], "text/plain": [ " target\n", "287 158.75\n", "134 171.91\n", "213 86.32\n", "82 94.10\n", "251 251.72" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.mean().head()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
287362.869338
134271.792914
213289.466582
82125.589059
251479.705452
\n", "
" ], "text/plain": [ " target\n", "287 362.869338\n", "134 271.792914\n", "213 289.466582\n", "82 125.589059\n", "251 479.705452" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba.var().head()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 simple evaluation workflow for probabilistic predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for simple evaluation:\n", "\n", "1. split the data into train/test set\n", "2. make predictions of either type for test features\n", "3. compute metric on test set, comparing test predictions to hend out test labels\n", "\n", "Note:\n", "\n", "* metrics will compare tabular ground truth to probabilistic prediction\n", "* the metric will needs to be of a compatible type, e.g., for proba predictions" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "29.341032127400844" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import train_test_split\n", "\n", "from skpro.metrics import CRPS\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "# step 1: data specification\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", "\n", "# step 2: specifying the regressor\n", "# example - linear regression for mean prediction\n", "# random forest for variance prediction\n", "reg_mean = LinearRegression()\n", "reg_resid = RandomForestRegressor()\n", "reg_proba = ResidualDouble(reg_mean, reg_resid)\n", "\n", "# step 3: fitting the model to training data\n", "reg_proba.fit(X_train, y_train)\n", "\n", "# step 4: predicting labels on new data\n", "y_pred_proba = reg_proba.predict_proba(X_test)\n", "\n", "# step 5: specifying evaluation metric\n", "metric = CRPS()\n", "\n", "# step 6: evaluat metric, compare predictions to actuals\n", "metric(y_test, y_pred_proba)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "how do we know that metric is of right type? Via `scitype:y_pred` tag" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'estimator_type': 'estimator',\n", " 'object_type': 'metric',\n", " 'reserved_params': ['multioutput', 'score_average'],\n", " 'scitype:y_pred': 'pred_proba',\n", " 'lower_is_better': True}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metric.get_tags()\n", "# scitype:y_pred is pred_proba - for proba predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "how do we find metrics for a prediction type?" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameobjectscitype:y_pred
0CRPS<class 'skpro.metrics._classes.CRPS'>pred_proba
1ConstraintViolation<class 'skpro.metrics._classes.ConstraintViola...pred_interval
2EmpiricalCoverage<class 'skpro.metrics._classes.EmpiricalCovera...pred_interval
3LinearizedLogLoss<class 'skpro.metrics._classes.LinearizedLogLo...pred_proba
4LogLoss<class 'skpro.metrics._classes.LogLoss'>pred_proba
5PinballLoss<class 'skpro.metrics._classes.PinballLoss'>pred_quantiles
6SquaredDistrLoss<class 'skpro.metrics._classes.SquaredDistrLoss'>pred_proba
\n", "
" ], "text/plain": [ " name object \\\n", "0 CRPS \n", "1 ConstraintViolation \n", "5 PinballLoss \n", "6 SquaredDistrLoss \n", "\n", " scitype:y_pred \n", "0 pred_proba \n", "1 pred_interval \n", "2 pred_interval \n", "3 pred_proba \n", "4 pred_proba \n", "5 pred_quantiles \n", "6 pred_proba " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from skpro.registry import all_objects\n", "\n", "all_objects(\"metric\", as_dataframe=True, return_tags=\"scitype:y_pred\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "extra note: quantile metrics can be applied to interval predictions as well\n", "\n", "more details on metrics below" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.3 diagnostic visualisations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "some useful diagnostic visualisations: variants of crossplots for probabilistic predictions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A. crossplot ground truth vs prediction intervals.\n", "\n", "Works with both proba and interval predictions.\n", "\n", "What to look for: intervals shouhld cut through the x = y line (green points)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_interval\n", "\n", "plot_crossplot_interval(y_test, y_pred_proba, coverage=0.9)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_interval\n", "\n", "y_pred_interval = reg_proba.predict_interval(X_test, coverage=0.9)\n", "plot_crossplot_interval(y_test, y_pred_interval)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "B. crossplot residuals vs predictive standard deviation\n", "\n", "Works with both proba and variance predictions.\n", "\n", "What to look for: should be close to a line, high linear correlation" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAG1CAYAAAAFuNXgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABNxklEQVR4nO3de1xUZf4H8M9wlTteQUQRlQ3vJq6KlzJlJberl7b1p6mEl1wqhai0Xd1SEy+pqbtqumjWarZm1ubWliJiFiKCmnhBzQsQFynlosRF5vz+mGV0uDlz5sycM2c+79drXsCZ4cx3DsOc73me7/M8GkEQBBARERGphIPcARARERFJickNERERqQqTGyIiIlIVJjdERESkKkxuiIiISFWY3BAREZGqMLkhIiIiVWFyQ0RERKriJHcA1qbVapGfnw8vLy9oNBq5wyEiIiIjCIKA8vJyBAQEwMGh+bYZu0tu8vPz0bFjR7nDICIiIhFyc3MRGBjY7GPsLrnx8vICoDs43t7eMkdDRERExigrK0PHjh315/Hm2F1yU9cV5e3tzeSGiIjIxhhTUsKCYiIiIlIVJjdERESkKkxuiIiISFWY3BAREZGqMLkhIiIiVWFyQ0RERKrC5IaIiIhUhckNERERqQqTGyIiIlIVJjdERESkKopKbmpra7FgwQIEBwfDzc0NXbt2xeLFiyEIgv4xgiBg4cKFaN++Pdzc3BAREYGLFy/KGDUREREpiaKSm+XLl2Pjxo3429/+hnPnzmH58uVYsWIF1q9fr3/MihUrsG7dOmzatAlpaWnw8PBAZGQkKisrZYzc8vLygORk3VciIiJqmqKSm++//x5PPfUUHnvsMXTu3BkTJkzA6NGjcezYMQC6Vpt3330Xf/nLX/DUU0+hT58++OCDD5Cfn4/PPvtM3uAtKDERCAoCRo7UfU1MlDsiIiIi5VJUcjNkyBAkJSXhwoULAIBTp07hyJEjGDNmDADgypUrKCwsREREhP53fHx8MGjQIKSmpja6z6qqKpSVlRncbEleHjBzJqDV6n7WaoFZs9iCQ0RE1BQnuQO417x581BWVobQ0FA4OjqitrYWb7/9NiZNmgQAKCwsBAD4+fkZ/J6fn5/+vvoSEhLw1ltvWTZwC7p48W5iU6e2Frh0CQgMlCcmIiIiJVNUy82//vUv7NixAzt37kRmZia2b9+Od955B9u3bxe9z/nz56O0tFR/y83NlTBiywsJARzq/ZUcHYFu3eSJh4iISOkU1XLz6quvYt68efjjH/8IAOjduzeuXbuGhIQETJ06Ff7+/gCAoqIitG/fXv97RUVF6NevX6P7dHV1haurq8Vjt5TAQGDzZl1XVG2tLrF57z222hARETVFUS03FRUVcKjXTOHo6Ajt//plgoOD4e/vj6SkJP39ZWVlSEtLQ3h4uFVjtaboaODqVd1oqatXdT8TERFR4xTVcvPEE0/g7bffRqdOndCzZ0+cOHECq1evxvPPPw8A0Gg0mDt3LpYsWYKQkBAEBwdjwYIFCAgIwNNPPy1v8BYWGMjWGiIiImMoKrlZv349FixYgD/96U+4fv06AgICMGvWLCxcuFD/mNdeew23b9/GzJkzUVJSgmHDhuG///0vWrRoIWPkREREpBQa4d7pf+1AWVkZfHx8UFpaCm9vb7nDISIiIiOYcv5WVM0NERERkbmY3BAREZGqMLkhIiIiVWFyQ0RERKrC5IaIiIhUhckNERERqQqTGyIiIlIVJjdERESkKkxuiIiISFWY3BAREZGqMLkhIiIiVWFyQ0RERKrC5IaIiIhUhckNERERqQqTGyIiIlIVJjdERESkKkxuiIiISFWY3BAREZGqMLkhIiIiVWFyQ0REpHB5eUBysu4r3R+TGyIiIgVLTASCgoCRI3VfExPljkj5mNwQEREpVF4eMHMmoNXqftZqgVmz2IJzP0xuiIiIFOrixbuJTZ3aWuDSJXnisRVMboiIiBQqJARwqHemdnQEunWTJx5bweSGiIhIoQIDgc2bdQkNoPv63nu67dQ0J7kDICIioqZFRwORkbquqG7dmNgYg8kNERGRwgUGMqkxBbuliMhiODcHEcmByQ0RWQTn5iAiuTC5ISLJcW4OIpITkxsikpwS5uZglxiR/WJyQ0SSk3tuDnaJEdk3JjdEJDk55+ZglxgRcSg4EVmEXHNzNNclxqG01pWXp/t7hITw2JN1seWGiCwmMBAYMcK6Jza5u8RIh12DJCcmN0SkKpyuXn7sGiS5sVuKiFSH09XLi12DJDcmN1bAfmci6+N09fKp6xq8N8Fh1yBZE7ulLIz9zkRkb9g1SHLTCIIgyB2ENZWVlcHHxwelpaXw9va26HPl5ekSmvpXL1ev8p+ciNQvL49dgyQdU87f7JayIPY7E5E9Y9cgyUVR3VKdO3eGRqNpcIuJiQEAVFZWIiYmBq1bt4anpyfGjx+PoqIimaNuGoekEhERWZ+ikpv09HQUFBTob/v37wcAPPPMMwCA2NhYfPHFF9i9ezdSUlKQn5+PcePGyRlys9jvTEREZH1m1dysWbMGsbGxOHPmDEJDQ+FYdxaXyNy5c7Fv3z5cvHgRZWVlaNu2LXbu3IkJEyYAAM6fP4/u3bsjNTUVgwcPNmqf1qy5qcN+ZyLbxhGPRPKzWs1Nv379AABvvPEGzp8/Dzc3N/Ts2RO9e/dGr1698Pjjj4ved3V1Nf75z38iLi4OGo0GGRkZqKmpQUREhP4xoaGh6NSpU7PJTVVVFaqqqvQ/l5WViY5JLPY7E9muxMS7E9I5OOhaY6Oj5Y6KbBmTZcszuluqvLxc/31ubi4A4JFHHgEAfP7558jOzsaRI0fw8ssvo02bNjhw4IBZgX322WcoKSnBtGnTAACFhYVwcXGBr6+vweP8/PxQWFjY5H4SEhLg4+Ojv3Xs2NGsuIjIfnCmXZIapwexDqOTm3uTldDQUCxcuBAVFRUGj/H09MSgQYMwffp0vPvuu2YFlpiYiDFjxiAgIMCs/cyfPx+lpaX6W11iRkR0P82NeCQyFZNl6zE6ubl3VNL+/fvx9ddfIyQkBO+//77kQV27dg0HDhzA9OnT9dv8/f1RXV2NkpKSBnH5+/s3uS9XV1d4e3sb3IiIjMERjyQlJsvWY1Ryk5WVhQ4dOuh/HjJkCNLS0pCQkIAFCxYgLCwM3377rWRBbdu2De3atcNjjz2m3xYWFgZnZ2ckJSXpt2VnZyMnJwfh4eGSPTcR2Za8PCA52TJXvxzxSFJismw9RiU3X331FR5++OEG26dMmYLs7Gw89thjGDNmDCZMmIArV66YFZBWq8W2bdswdepUODndrXf28fFBdHQ04uLikJycjIyMDERFRSE8PNzokVJEpC7WqF+IjtbNKp6crPvKYmISi8my9Rg1FDwjIwM///wzIiMjG9xXUVGBzMxMfPLJJ1i/fj1cXFzw0ksvYeHChfD09DQ5oG+++QaRkZHIzs7Gb37zG4P7Kisr8corr+Cjjz5CVVUVIiMjsWHDhma7peqTYyg4EUmPy5uQreL0IOKYcv42ep6bTZs24YUXXtB/n56ejvT0dJw7dw4ODg7o1asXBg8ejL59+2LXrl24dOkSPv30UwwYMMD8VyQhJjdE6pCcrGuxaWz7iBFWD4eILMwi89y0adNG//3bb7+NQYMGYcqUKRg8eDDCwsLg5uamv3/mzJlYunQppk2bhqysLBEvgYioeXX1C/Vbbli/QERGt9zcuHEDrVq1MnrHRUVFCAgIQG1trejgLIEtN+bh5FOkJImJuqG0tbV36xdYE0OkTqacv40eCm5KYgMA7dq1w8GDB036HVI2Tj5FSsNiXyJqjFlrS9kittyIw+JNIiKSk0Vabsi+cfIpIiKyFUxuyCicfIqIiGyF0cnNDz/8AG39S3eyG5x8ioiIbIXRyc2DDz6In3/+GQDQpUsX/PLLLxYLipSJxZuWYcnlA4iI7JHRyY2vr69+aYWrV6+yFUehLH2iDAzUTZBmrRYbtZ/4OQKNiEh6Rk/iN378eDz88MNo3749NBoNBgwYAMe6Pop6Ll++LFmAZLzERGDmTF3hr4ODrhvJlltX1PZ66svLu/v6AN3XWbOAyEh5uvs4hxERqYVJQ8H/+9//4tKlS3j55ZexaNEieHl5Nfq4OXPmSBag1NQ6FFxtQ7XV9noao6TlA9SeSBKR7bPI8gsA8OijjwLQLaQ5Z86cJpMbsr7mhmrbYjKgttfTGKUsH6C0FiQiInOZlNzU2bZtG0pKSrBq1SqcO3cOANCzZ088//zz8PHxkTRAMo5STpRSUdvraUzdCLT6ywdYO6Gwh0SSiOyLqHlujh8/jq5du2LNmjW4ceMGbty4gdWrV6Nr167IzMyUOkYygtqGaqvt9TRFCSPQOIcREamNqOUXhg8fjm7dumHLli1wctI1/ty5cwfTp0/H5cuXcfjwYckDlYpaa27q5OXprri7dVNHIqC216NUXICSiJTOlPO3qOTGzc0NJ06cQGhoqMH2s2fPYsCAAaioqDB1l1aj9uSGSCwmkkSkZBYrKK7j7e2NnJycBslNbm4ui4yJbFRgIJMaIlIHUTU3zz77LKKjo/Hxxx8jNzcXubm52LVrF6ZPn46JEydKHSORZNQ+KSAREYlsuXnnnXeg0WgwZcoU3LlzBwDg7OyM2bNnY9myZZIGSCQVzuVCRGQfRNXc1KmoqMCPP/4IAOjatSvc3d0lC8xSWHNjn+xhUkAiIjWzeM1NHXd3d/Tu3ducXRBZBedyISKyH6JqbohsDedyISKyH0xuyC7Yy6SARERkZrcUkS2Jjtatl8S5XIhMx1XjyZaw5YbsSmCgbsVtfjgTGS8xUVeQP3Kk7mtiotwRETVP9GippKQkJCUl4fr169DWq9TcunWrJMFZAkdLkbXwSpfUgCMNSSlMOX+Larl56623MHr0aCQlJeHnn3/GzZs3DW5E9o5XuqQWzY00JMvhhKPmEdVy0759e6xYsQLPPfecJWKyKLbckKXxSpfUhO9n6+OEo42zeMtNdXU1hgwZIio4IrXjlS6pCUcaWlde3t3EBtB9nTWLLTimEpXcTJ8+HTt37pQ6FiJV4Jw6pDbR0bqWmuRk3Ve2IlgOL46kIWooeGVlJTZv3owDBw6gT58+cHZ2Nrh/9erVkgRHZIvqrnRnzdJ9KPFKl9SAq8ZbR93FUf1uQF4cmUZUcvPDDz+gX79+AICsrCyD+zQajdlBEdk6zqlDRGLw4kgaZi2caYtsqaCYQ4mJiOxTXh4vjuqzeEExWR6HEhMR2S9OOGoe0S03JSUlSExMxLlz5wAAPXr0QHR0NHx8fCQNUGq20HLDoZdERESGLN5yc/z4cXTt2hVr1qzBjRs3cOPGDaxZswZdu3ZFZmamqKDpLlbLExERiSeq5Wb48OHo1q0btmzZAicnXU3ynTt3MH36dFy+fBmHDx+WPFCpsOWGiIjI9lil5eb111/XJzYA4OTkhNdeew3Hjx8Xs0u6ByfNIiIiEk9UcuPt7Y2cnJwG23Nzc+Hl5WV2UMRJs4jIdnAdJFIaUcnNs88+i+joaHz88cfIzc1Fbm4udu3ahenTp2PixIlSx2i3WC1PRErHkZ2kRKKSm3feeQfjxo3DlClT0LlzZ3Tu3BnTpk3DhAkTsHz5crMC+umnnzB58mS0bt0abm5u6N27t0FXlyAIWLhwIdq3bw83NzdERETg4sWLZj0nERGZjusgkVKJSm5cXFywdu1a3Lx5EydPnsTJkyf1I6ZcXV1FB3Pz5k0MHToUzs7O+Oqrr3D27FmsWrUKLVu21D9mxYoVWLduHTZt2oS0tDR4eHggMjISlZWVop+XiIhMx5GdpFSKmqF43rx5+O677/Dtt982er8gCAgICMArr7yC+Ph4AEBpaSn8/Pzw/vvv449//ON9n8MWRksREdkCjuwkazLl/G302lJxcXFYvHgxPDw8EBcX1+xjxS6c+e9//xuRkZF45plnkJKSgg4dOuBPf/oTZsyYAQC4cuUKCgsLERERof8dHx8fDBo0CKmpqUYlN0REJA2ug0RKZXRyc+LECdTU1Oi/b4o5C2devnwZGzduRFxcHN544w2kp6fj5ZdfhouLC6ZOnYrCwkIAgJ+fn8Hv+fn56e+rr6qqClVVVfqfy8rKRMdHRESGuEgsKZHRyU1ycrL+++3btyMwMBAODoYlO4IgIDc3V3QwWq0WAwYMwNKlSwEADz74ILKysrBp0yZMnTpV1D4TEhLw1ltviY6JiIiaFxjIpIaURVRBcXBwMH7++ecG22/cuIHg4GDRwbRv3x49evQw2Na9e3f9nDr+/v4AgKKiIoPHFBUV6e+rb/78+SgtLdXfzEm+iIiISPlEJTdN1SDfunULLVq0EB3M0KFDkZ2dbbDtwoULCAoKAqBLqvz9/ZGUlKS/v6ysDGlpaQgPD290n66urvD29ja4ERERkXoZ3S0FQF9IrNFosHDhQri7u+vvq62tRVpaGvr16yc6mNjYWAwZMgRLly7FH/7wBxw7dgybN2/G5s2b9c87d+5cLFmyBCEhIQgODsaCBQsQEBCAp59+WvTz2qO8PN0wzpAQNicTEZG6mJTc1BUSC4KA06dPw8XFRX+fi4sL+vbtqx+iLcZvf/tb7N27F/Pnz8eiRYsQHByMd999F5MmTdI/5rXXXsPt27cxc+ZMlJSUYNiwYfjvf/9rVouRvUlMvDvxloODbrQDl3cgIiK1EDXPTVRUFNauXWuTXTz2Ps8N56UgIiJbZPFVwbdt22aXiYEacEZRIiJSO5O6peo7e/YscnJyUF1dbbD9ySefNCsospyQEF1XVP2Wm27d5IuJiIhISqKSm8uXL2Ps2LE4ffo0NBqNfvRU3QR+tbW10kVIkuKMotJgQTYRkXKJ6paaM2cOgoODcf36dbi7u+PMmTM4fPgwBgwYgEOHDkkcIkktOlpXY5OcrPvKYmLTJCbq6pZGjtR9TUyUdv95ebq/DVdWJiISR1RBcZs2bXDw4EH06dMHPj4+OHbsGB544AEcPHgQr7zySrPLM8jN3guKyTyWLsjmSDYiosZZvKC4trYWXl5eAHSJTn5+PgAgKCiowSR8RGpiyYLsvLy7iQ2g+zprFltwiIhMJarmplevXjh16hSCg4MxaNAgrFixAi4uLti8eTO6dOkidYxEimHJguzmEifW9RARGU9Uy81f/vIXaP/3Kbxo0SJcuXIFw4cPx5dffom1a9dKGiDJg3UfjasryHZ01P0sZUF2XeJ0L45kIyIynaiam8bcuHEDLVu21I+YUirW3Nwf6z7uLy9P16LSrZu0rSqJiQ1HsvHYExGZdv42OrmJi4vD4sWL4eHhoV9jqimrV682PlorY3LTPM5gLD9LJU5ERLbMlPO30TU3J06cQE1Njf77pii95Yaax7oP+QUG8lgTEZnD6OQmOTm50e9JXTiDMRER2TpRBcWkXpYsmCUiIrIGUcnN9OnTOROxinEGYyIismWikpvi4mI8+uij6NixI1599VWcOnVK6rhIZoGBwIgRbLEhEoNTKRDJS1Ry8/nnn6OgoAALFixAeno6+vfvj549e2Lp0qW4evWqxCESEdkOS689RkT3J8k8N3l5efjoo4+wdetWXLx4EXfu3JEiNovgUHAi43Dlc9NxKgUiy7H42lL3qqmpwfHjx5GWloarV6/Cz8/P3F0SkczY+iCOJdceIyLjiU5ukpOTMWPGDPj5+WHatGnw9vbGvn37kMdOZiLJyFG7wQU8xeMSGkTKICq56dChA37/+9/j559/xubNm1FUVIStW7di1KhRnMSPSCJytZ6w9UE8TqVApAyiam62bNmCZ555Br6+vhYIybJYc0O2wNq1G/fW1wCsGzEXl9Agkp7Fa25mzJiB06dPY/LkyRgyZAh++uknAMCHH36II0eOiNklEd3Dmq0n9VuIvv6arQ/m4lQKRPISldzs2bMHkZGRcHNzQ2ZmJqqqqgAApaWlWLp0qaQBEtkja9VuNFVfExnJiRyJyHaJSm6WLFmCTZs2YcuWLXB2dtZvHzp0KDIzMyULjsialDTxmrVqN+63UCpbH4jIFolKbrKzs/HQQw812O7j44OSkhJzYyKyuuaKd+VKeqyxDAZH9xCRGolKbvz9/XGpkc7/I0eOoEuXLmYHRaZTUquDrWlu6LPc871YuvWEo3uISI1EFxTPmTMHaWlp0Gg0yM/Px44dOxAfH4/Zs2dLHSPdh9wnYFvXVNdMaqp9zPfChVKJSG2cxPzSvHnzoNVqMWrUKFRUVOChhx6Cq6sr4uPj8dJLL0kdIzWjuYJQXn0bp65rpv7QZ0Fovh5FTQID1feaiMh+iWq50Wg0+POf/4wbN24gKysLR48eRXFxMRYvXix1fHQfnHDNfE11zQwZwnoUIiJbJKrlpo6Liwt69OghVSwkQlOtDjwBmyY6WtfaVX/itc2bdS1htbWsRyEishVGJzdxcXFG73T16tWigiHT1bU68ARsvsa6ZppKeoiISLmMTm5OnDhh8HNmZibu3LmDBx54AABw4cIFODo6IiwsTNoI6b54ArYs1qMQqde9S4/w/1w9jE5ukpOT9d+vXr0aXl5e2L59O1q2bAkAuHnzJqKiojB8+HDpo6T74gmYiMg0iYl3B2Q4OOhawTlaUB1ELZzZoUMHfPPNN+jZs6fB9qysLIwePRr5+fmSBSg1LpxJRHJja4H8rL04LZnP4gtnlpWVobi4uMH24uJilJeXi9klEZFd4LxUysCRpuomKrkZO3YsoqKi8OmnnyIvLw95eXnYs2cPoqOjMW7cOKljJDvFWZdJbZqbDZusi0uPqJuo5GbTpk0YM2YM/u///g9BQUEICgrC//3f/+HRRx/Fhg0bpI6R7BCvbi2LiaM82FqgHFx6RN1E1dzUuX37Nn788UcAQNeuXeHh4SFZYJbCmhvlY1+4ZbGIUj58bytPXh5HmtoKi9fc1PHw8ECfPn3Qp08fm0hsyDbY69WtNVpT2C0iL7YWKI+lF6cleZiV3BBZgpR94dbsfjHnuazVDWeviaOScKFSIstjckOKI9XVrTXrdsx5Lmu2prCIUhnYWmCINWAkNUUlN2+++SY0Go3BLTQ0VH9/ZWUlYmJi0Lp1a3h6emL8+PEoKiqSMWKyFHOvbq2ZMJj7XNZsTWG3CCkNBw+QJSgquQGAnj17oqCgQH87cuSI/r7Y2Fh88cUX2L17N1JSUpCfn8+h5ypmztWtNRMGc5/L2q0p7BYhpWANGFmK4hbOdHJygr+/f4PtpaWlSExMxM6dOzFy5EgAwLZt29C9e3ccPXoUgwcPFv2cpD7WXC3d3Oeqa02p/yH/9deWSzy4XAcpQXMXBnx/kjkUt3DmxYsXERAQgBYtWiA8PBwJCQno1KkTMjIyUFNTg4iICP1jQ0ND0alTJ6SmpjK5Ib26qe2XLQPmz7f8aulSrMweGQncOymDIOj2FxnJD3lSL2tehJB9UdTCmYMGDcL777+PBx54AAUFBXjrrbcwfPhwZGVlobCwEC4uLvD19TX4HT8/PxQWFja5z6qqKlRVVel/LisrEx0fKV/9OVyWLwcGDLD8HBbmrsx+8aJhcgPwCpbUT4oLA6LGKHrhzJKSEgQFBWH16tVwc3NDVFSUQaICAAMHDsQjjzyC5cuXN7qPN998E2+99VaD7ZzEr3m2uLCfLU+QZkuxi3lv2OL7iayHE+mRMVSzcKavry9+85vf4NKlS/D390d1dTVKSkoMHlNUVNRojU6d+fPno7S0VH/Lzc2VLD61stXRC0qbw8WU4a22MopJzHvDVt9PZD0cGk+SE0R47rnnhM6dOwt79uwRcnNzhdzcXOGTTz4RgoODhSlTpojZZaPKy8uFli1bCmvXrhVKSkoEZ2dn4ZNPPtHff/78eQGAkJqaavQ+S0tLBQBCaWmpZHGqSW6uIDg4CIKuk0R3c3TUbVc6JcX+j3/cjcXBQfezMXJzBSE5WZnHW8zxVdLfhIhsmynnb0UtnBkfH4+UlBRcvXoV33//PcaOHQtHR0dMnDgRPj4+iI6ORlxcHJKTk5GRkYGoqCiEh4ezmFhCSmv9MIVSWj/MGd6q5CtYMe8NW34/EZHtMrqg+F7u7u7YsGEDVq5cKenCmXl5eZg4cSJ++eUXtG3bFsOGDcPRo0fRtm1bAMCaNWvg4OCA8ePHo6qqCpGRkVyFXGK2PnrB3MJeKdjy8NbmamPEvDds/f1ERDbK1Gah6upqYeTIkcKFCxdENSvJjd1S9/ePf+i6Duq6EIztUiEdW+2KMaYrTcx7g+8nIpKCKedvUaOl2rZti++//x4hISHSZ1sWZkq1tT3j6AXzJCY2HN6q5JmATRmtJea9wfcTEZnLlPO3qOQmNjYWrq6uWLZsmegg5cLkhqzFlk7oycm60UyNbR8xwurhEBE1YMr5W1TNzZ07d7B161YcOHAAYWFhDWptzFl+gUgtbGmJA9bGEJGaiEpusrKy0L9/fwC6ZRfupdFozI+KVI0TuikPZ4olIjUR1S1ly9gtJa/6yyNs3mzdWhQmVs2zpa40IrIvFq+5qXP27Fnk5OSgurr67g41GjzxxBNid2lx9pjcKOWELvcSA3InVvZMKe9BIrJdFq+5uXz5MsaOHYvTp09Do9GgLj+q65Kqra0Vs1uyACWd0OWc/6WpifW46rblKek9SET2QdQMxXPmzEFwcDCuX78Od3d3nDlzBocPH8aAAQNw6NAhiUMkscyZKdcS6opW72WtolXOlCsPpb0Hicg+iEpuUlNTsWjRIrRp0wYODg5wcHDAsGHDkJCQgJdfflnqGEkkpZ3Q5VweQc7Eyp4p7T1IRPZBVHJTW1sLLy8vAECbNm2Qn58PAAgKCkJ2drZ00ZFZlHhCj47W1dgkJ+u+Wrp7om5lbkAZ604pnSkrmRtDie9BIlI/UclNr169cOrUKQDAoEGDsGLFCnz33XdYtGgRunTpImmAJJ5SFpJsLC5rLA6ZmKgrYB45UvcVsG5iZWvqH6/ERPP3qdT3IBGpm6jRUl9//TVu376NcePG4dKlS3j88cdx4cIFtG7dGh9//DFGNjbVqULY62gpexveK/fILFtj6eNlj+9BIpKWxUdLRUZG6r/v1q0bzp8/jxs3bqBly5acxE+BbGmmXKnY8srccrD08bLH9yARyUdUt1RjWrVqxcTGjkhdmyE11nqYxhrHq7H3jNLfR0Rkm4xuuYmLizN6p1xbSt1sYd4SLidgGksfr8beM4Dy30dEZJuMrrl55JFHDH7OzMzEnTt38MADDwDQrTHl6OiIsLAwHDx4UPpIJWKPNTdSsrVaFtZ6mMYSx6up94xWC9z76aPk9xERyc8iNTfJdeNpoWuZ8fLywvbt29GyZUsAwM2bNxEVFYXhw4eLDJtsga3VsrDWwzSWOF5NvWfqU/L7iIhsi6jRUh06dMA333yDnj17GmzPysrC6NGj9fPeKBFbbsxjay03JD+23BCRFEw5f4sqKC4rK0NxcXGD7cXFxSgvLxezSzKCEoov5Zi3RAmvm8Rr6j2zZQvnvyEiyxDVcjNlyhR8++23WLVqFQYOHAgASEtLw6uvvorhw4dj+/btkgcqFVttuVFaEa+1almU9rpJvMbeM6yJIiJjmXL+FpXcVFRUID4+Hlu3bkVNTQ0AwMnJCdHR0Vi5ciU8PDzERW4Ftpjc2GtXkL2+biIiasjik/i5u7tjw4YNWLlyJX788UcAQNeuXRWd1NgyWyvilYq9vm66Ky9P9z4ICeHfnMga1PI/Z9Ykfh4eHujTpw/69OnDxMaC7HVCOnt93aRjibWuiKhpavqfE9UtBQBJSUlISkrC9evXoa13eb1161ZJgrMEW+yWAnRvsvoTrNlD7Ym9vm57xy5JIuuyhf85i3dLvfXWW1i0aBEGDBiA9u3bc9kFK4iOBiIj7a/40l5ft71rqksyNRVo08b2m8yJlEZtZQCiWm7at2+PFStW4LnnnrNETBZlqy03RPaksatIjUZ348g5IumpreVGVM1NdXU1hgwZIio4UhfOQUOWUH9unLraq7oPXq1W113J9x2RNOSYw8ySRCU306dPx86dO6WOhWyMmorPSHmio3VXjcnJwEcfGc5mDNxtMid14oWT9d37P3f1qm23jIqquamsrMTmzZtx4MAB9OnTB87Ozgb3c1Vw9cvLuzu5HnD3Sjoy0nYzfVuklmGbTalb6yovT9d6U7/JnCPn1ImTd8pHLevxiWq5+eGHH9CvXz84ODggKysLJ06c0N9OnjwpcYikRM0Vn6mRmKtIS1952lPLmdqazKlpTV04sQWHTCF6KLitYkGxNIwtPlNDy4KYq0hLX3naQvGfJXC5BvVLTtYl7I1tHzHC6uGQglh8+YU6Z8+eRU5ODqqrq+/uUKPBE088IXaXFsfkRjr3m4NGDU3LYpIIayQePAGQWtlr4k73Z/F5bi5fvoyxY8fi9OnT0Gg0qMuP6ua7qa2tFbNbUqimWl+am4NGLTU5YuZ+sMZ8EXWzN7MGhdSmrguy/oWTLX1ukPxE1dzMmTMHwcHBuH79Otzd3XHmzBkcPnwYAwYMwKFDhyQOkeR0v7qOwEBdS0H9Dx611OSIWQLCGstGsAaF1ExNo3ZIHqKSm9TUVCxatAht2rSBg4MDHBwcMGzYMCQkJODll1+WOkaSiTmFfWpZF0pMEmGtxEPqEwCH3pKSNHXhRGQMUclNbW0tvLy8AABt2rRBfn4+ACAoKAjZ2dnSRUeyMqf1RU0tC2KSCGtdeUp1ArCnkVdEpH6iam569eqFU6dOITg4GIMGDcKKFSvg4uKCzZs3o0uXLlLHSDIxt65DTetCiZn7wVbmi1BLfRQRUR1RLTd/+ctf9CuBL1q0CFeuXMHw4cPx5ZdfYt26dZIGSPKRovWFTcvKp5b6KGOw643IPkg2z82NGzfQsmVLxa8QzqHgpuPcIuqm9qG3daP9jh8H5s2z7akJiOyZxRfOzMnJQf2cqFWrVtBoNMjJyRGzS1Iwtr6om5rqo+q7t5botdc46y2RvRDVcuPo6IiCggK0a9fOYPsvv/yCdu3aKXqeG7bcEDVObS10jbVI1cdJD4lsh8VbbgRBaLT76datW2jRooWYXTZq2bJl0Gg0mDt3rn5bZWUlYmJi0Lp1a3h6emL8+PEoKiqS7DmJbI1UdSRqa6FrrJboXrY4NQGRMVhbZuJoqbi4OAC6mYgXLFgAd3d3/X21tbVIS0tDv379JAksPT0d7733Hvr06WOwPTY2Fv/5z3+we/du+Pj44MUXX8S4cePw3XffSfK8JB81rENlbWpY4sJSGhvtV0dNXW9E9+Jngo5J3VKPPPIIACAlJQXh4eFwcXHR3+fi4oLOnTsjPj4eISEhZgV169Yt9O/fHxs2bMCSJUvQr18/vPvuuygtLUXbtm2xc+dOTJgwAQBw/vx5dO/eHampqRg8ePB9981uKWXiP6Tp1F4ILIX6658tWwYMGKCerjeie6n9M8Fia0slJycDAKKiorB27VqLJQcxMTF47LHHEBERgSVLlui3Z2RkoKamBhEREfptoaGh6NSpk9HJDSkP51kRxxprWNk6Nc21RHQ//Ey4S9Qkfhs2bDAYLXXt2jXs3bsXPXr0wOjRo80KaNeuXcjMzER6enqD+woLC+Hi4gJfX1+D7X5+figsLGx0f1VVVaiqqtL/XFZWZlZ8JD3+Q4rDxTONYyuTKZJp2I3dED8T7hJVUPzUU0/hgw8+AACUlJRg4MCBWLVqFZ566ils3LhRdDC5ubmYM2cOduzYIVlhckJCAnx8fPS3jh07SrJfko5a1qGyNjUP4SZqDpcLaRw/E+4SldxkZmZi+PDhAIBPPvkE/v7+uHbtGj744AOzZijOyMjA9evX0b9/fzg5OcHJyQkpKSlYt24dnJyc4Ofnh+rqapSUlBj8XlFREfz9/Rvd5/z581FaWqq/5ebmio7vflihLg7/IcXj6slkb8xZ0Nce8DNBR1S3VEVFhX7hzG+++Qbjxo2Dg4MDBg8ejGvXrokOZtSoUTh9+rTBtqioKISGhuL1119Hx44d4ezsjKSkJIwfPx4AkJ2djZycHISHhze6T1dXV7i6uoqOyVgsiDUPayPEY7cL2RN2Y9+f3J8JSugyFJXcdOvWDZ999hnGjh2Lr7/+GrGxsQCA69evm1Vk7OXlhV69ehls8/DwQOvWrfXbo6OjERcXh1atWsHb2xsvvfQSwsPDZS0mZkGsNOT+hyQi5WNdibIp5UJfVLfUwoULER8fj86dO2PQoEH6VpNvvvkGDz74oKQB1rdmzRo8/vjjGD9+PB566CH4+/vj008/tehz3o89LTxIRJbF7u3msRtbuZTUZSh64czCwkIUFBSgb9++cPhfNeixY8fg7e2N0NBQSYOUkiXmuVH73AJEZB1Kueq1BWpbLkQNkpN1Rd6NbZdimRNTzt+SrQpuKyw1iV/9ycLee48fSrZKCf3FZH94kUS2ztLvYYuvLUUNKbVCnU3cpuEQU5ILu7cb4ueXbVFSlyFbblSMTdym4ZWzdNj6ZTqp33+2/jfg55ftslSXIVtuSFGFXbaCV87SYOuXOFJe9dr634CfX7YtMFBXYyNnUs3kRqV4ojYdZ0o2H09K5pGie1sNfwN+fpG5RCc33377LSZPnozw8HD89NNPAIAPP/wQR44ckSw4Eo8nauPV9esDyukvtlU8KZnP3KteNfwN+PlF5hKV3OzZsweRkZFwc3PDiRMn9AtTlpaWYunSpZIGSOI01sT9v7kW6R71m+8BZRaG2wqelOSnhr+BkgpTyTaJSm6WLFmCTZs2YcuWLXB2dtZvHzp0KDIzMyULjsxT18QdH6+7knvnHdvsf7eUpprvAfn7i20VT0ryU8vfQKkjUMk2iBot5e7ujrNnz6Jz587w8vLCqVOn0KVLF1y+fBk9evRAZWWlJWKVhD2NlgI4Aqg5lp5wypZIPbKGE6zJj38DUhuLj5by9/fHpUY6cI8cOYIuXbqI2SVZiBr63y1FDc33UrDEyBoljJawd/wbkD0TldzMmDEDc+bMQVpaGjQaDfLz87Fjxw7Ex8dj9uzZUsdIZuAJvGlqab43hxpG1hAR1SdqVfB58+ZBq9Vi1KhRqKiowEMPPQRXV1fEx8fjpZdekjpGMkPdCbz+0hBKPoFbc/Kx6Gjd6u322nzfXMuevR0LIlIPs2Yorq6uxqVLl3Dr1i306NEDnp6eUsZmEfZWc1PHVvrfOSupdbEmi4hshcVrbqZPn45Dhw7BxcUFPXr0wMCBA20isbFnttD/zi4S62PXHBGpkajkpri4GI8++ig6duyIV199FadOnZI6LrJDLH6WB4fcEpHaiEpuPv/8cxQUFGDBggVIT09H//790bNnTyxduhRXr16VOESyFyx+bpqlV0e2hZY9IiJjiV5+oWXLlpg5cyYOHTqEa9euYdq0afjwww/RjWciEoldJI2z9UUQiYiszeyFM2tqanD8+HGkpaXh6tWr8PPzkyIuu2Lpq3Jbwi4SQ6xDIiIynejkJjk5GTNmzICfnx+mTZsGb29v7Nu3D3n81DUJr8obYhfJXaxDkgYvIIjsi6ih4B06dMCNGzfw6KOPYtKkSXjiiSfg6upqifgkp6Sh4ByGS/fD94j5OL0AkTpYfCj4m2++iYKCAuzduxcTJkywmcRGaWz9qlzpV8NKj88YrEMyD7v1iOyT6OUXfH19JQ7F/tjy6CCld6cpPT5TsA5JPFu/gCAicYzuloqLi8PixYvh4eGBuLi4Zh+7evVqSYKzBCV1SwG6k279pRGUfvJSeleJ0uMj6+F7gUg9TDl/G7221IkTJ1BTU6P/vikajcbYXRJsc20jpa9HpPT4yHpscW01IjKfWWtL2SKltdzYIqVfDSs9PrI+W1lbjYiaZvGC4pycHDSVE+Xk5IjZJdWj5GJYpRe5Kj0+sj5OL0BkX0S13Dg6OqKgoADt2rUz2P7LL7+gXbt2qK2tlSxAqdlCy42tDF1V+tWw0uMjIiLjWaTm5l6CIDRaW3Pr1i20aNFCzC7pf5oauhoZKf8JOi9PV88SEqKLpe5mreczlaXjIyIiZTIpuakbJaXRaLBgwQK4u7vr76utrUVaWhr69esnaYD2RqnFsNZuTbKV1isiIlIek7qlHnnkEQBASkoKwsPD4eLior/PxcUFnTt3Rnx8PEJCQqSPVCJK75ZSYjGstWNS4jEgIiJ5WaxbKjk5GQAQFRWFdevWwcvLS3yU1CglDl21dmuSUluviIjINogaLRUSEoLdu3c32L5161YsX77c7KDsndJmpLXETMrNjQaz5ZmbiYhIfqKSm82bNyM0NLTB9p49e2LTpk1mB0XKGroq5dDqvDzg1VebXxqBQ7mJiMgcooaCt2jRAufOnUNwcLDB9suXL6NHjx6orKyULECpKb3mRsnMHVqdmAjMmAHUf8c1VU/DodxERFTH4kPBO3bsiO+++65BcvPdd98hICBAzC6pEeYOhZb6ucwZWl03xL2xVLqpehoO5SYiIjFErwo+d+5cbNu2DdeuXcO1a9ewdetWxMbGYsaMGVLHaJesuaq1NZ6rsSLhOqynISIiKYnqlhIEAfPmzcO6detQXV0NQNdV9frrr2PhwoWSByklW+iWsuZQaEs9V/2WoMaep+65bGEldCIikpfF15bSaDRYvnw5iouLcfToUZw6dQo3btxQfGJjK5obCm0Lz9VYS1D9ImEHByA+XhmjwYiISF24KrgC2XLLzf32xyJheVmzjouISEoWKSiOi4vD4sWL4eHhoV+GoSmrV682drfUCGtO5Cf1c91vAj4WCcuHS1rYPlOTUyazZK+MTm5OnDiBmpoa/fdNaWxBTTJddLRusUxrtHJI+Vx1E/DVb7lhwbC8lLwgKxnH1OSUySzZM0V1S23cuBEbN27E1atXAegmBVy4cCHGjBkDAKisrMQrr7yCXbt2oaqqCpGRkdiwYQP8/PyMfg5b6JaydYmJDVuC+KEqr+RkXQ1UY9tHjLB6OGQiU7uPuT4bqZHFC4otJTAwEMuWLUNGRgaOHz+OkSNH4qmnnsKZM2cAALGxsfjiiy+we/dupKSkID8/H+PGjZM5aqpPactHEJe0sHWmFv5bc1ACkRIZ3XJzvzqbe0lZc9OqVSusXLkSEyZMQNu2bbFz505MmDABAHD+/Hl0794dqampGDx4sFH7Y8sN2Su2qNkuttwQWaiguH6dTWZmJu7cuYMHHngAAHDhwgU4OjoiLCxMRMgN1dbWYvfu3bh9+zbCw8ORkZGBmpoaRERE6B8TGhqKTp06NZvcVFVVoaqqSv9zWVmZJPER2Rpr1nGRtEwt/LfmoAQiJTI6uUlOTtZ/v3r1anh5eWH79u1o2bIlAODmzZuIiorC8OHDzQro9OnTCA8PR2VlJTw9PbF371706NEDJ0+ehIuLC3x9fQ0e7+fnh8LCwib3l5CQgLfeesusmIjUgqPVbJepySmTWbJnogqKO3TogG+++QY9e/Y02J6VlYXRo0cjPz9fdEDV1dXIyclBaWkpPvnkE/zjH/9ASkoKTp48iaioKINWGAAYOHAgHnnkESxfvrzR/TXWctOxY0d2SxEREdkQiy+cWVZWhuLi4gbbi4uLUV5eLmaXei4uLuj2vyrHsLAwpKenY+3atXj22WdRXV2NkpISg9aboqIi+Pv7N7k/V1dXuLq6mhUTkaVwHhIiIumJGi01duxYREVF4dNPP0VeXh7y8vKwZ88eREdHSz56SavVoqqqCmFhYXB2dkZSUpL+vuzsbOTk5CA8PFzS5ySyBmsujkpEZE9EdUtVVFQgPj4eW7du1U/s5+TkhOjoaKxcuRIeHh6igpk/fz7GjBmDTp06oby8HDt37sTy5cvx9ddf43e/+x1mz56NL7/8Eu+//z68vb3x0ksvAQC+//57o5+Do6VICTiahYjINBbvlnJ3d8eGDRuwcuVK/PjjjwCArl27ik5q6ly/fh1TpkxBQUEBfHx80KdPH31iAwBr1qyBg4MDxo8fbzCJH5Gtud8yFUREJJ7oGYq//fZbvPfee7h8+TJ2796NDh064MMPP0RwcDCGDRsmdZySYcsNKQFbboiITGPxGYr37NmDyMhIuLm5ITMzUz8aqbS0FEuXLhWzSyK7UjcPiaOj7mfOQ0JEJB1Ryc2SJUuwadMmbNmyBc7OzvrtQ4cORWZmpmTBEakZl6kgIrIMUTU32dnZeOihhxps9/HxQUlJibkxEdkNTqpHRCQ9US03/v7+uNTICmxHjhxBly5dzA6KiIiISCxRyc2MGTMwZ84cpKWlQaPRID8/Hzt27EB8fDxmz54tdYxERERERhPVLTVv3jxotVqMGjUKFRUVeOihh+Dq6or4+Hj93DNEREREchA9FBzQrQN16dIl3Lp1Cz169ICnp6eUsVkEh4ITkRy41AaReSw6FLympgajRo3CxYsX4eLigh49emDgwIE2kdgQEcmBS20QWZfJyY2zszN++OEHS8RCRKQ6eXnAzJl3J2zUaoFZs3TbicgyRBUUT548GYm89CAiuq/mltogIssQVVB8584dbN26FQcOHEBYWFiDNaVWr14tSXBERLYuJARwcGi41Ea3bvLFRKR2opKbrKws9O/fHwBw4cIFg/s0Go35URERqUTdUhuzZulabLjUBpHlmTVayhZxtBQRySEvT9cV1a0bExsiMSw2Wkqr1WL58uUYOnQofvvb32LevHn49ddfzQqWiMgeBAYCI0YwsSGyBpOSm7fffhtvvPEGPD090aFDB6xduxYxMTGWio1IFfLydItjcnQMEZF1mJTcfPDBB9iwYQO+/vprfPbZZ/jiiy+wY8cOaOsPBSCbwROvZXF+EyIi6zMpucnJycHvf/97/c8RERH6taXI9vDEa1mc34SISB4mJTd37txBixYtDLY5OzujpqZG0qDI8njitTzOb0JEJA+ThoILgoBp06bB1dVVv62yshIvvPCCwVw3n376qXQRkkU0d+JlwaM0OL8JEZE8TEpupk6d2mDb5MmTJQuGLOvehft44rU8zm9CRCQPznNjJxIT73ZDOTjoTrpAwxNvdLS8cSqVOSs6c34TIiLzmXL+ZnJjB/LydAXD9Vtprl7Vfc8Tb/MaSwyZBBIRWZfFJvEj23S/+hpOLNY0Fl4TEdkeJjdWJse8MnX1NfdifY1xOOKJiMj2MLmxIrnmlakrbHV01P3MwlbjMTEkIrI9rLmxkubqXqyVZLCwVZzERBZeExHJzZTzt0lDwUk8JcwrExjIpEaM6GggMpKJIRGRrWByYyWcV8aQOUOr5cDEkIjIdrDmxkpY93IX17QiIiJLYs2Nldl73YsSao+IiMj2sOZGwey9e0MJtUdERKRu7JYiq+LQaiIisjQmN2RVrD0iIiJLY7cUWR2HVhMRkSUxuSFZ2HvtERERWQ67pYiIiEhVmNwQERGRqjC5ISIiIlVhckNERESqwuSGiIiIVIXJDREREamKopKbhIQE/Pa3v4WXlxfatWuHp59+GtnZ2QaPqaysRExMDFq3bg1PT0+MHz8eRUVFMkVMRERESqOo5CYlJQUxMTE4evQo9u/fj5qaGowePRq3b9/WPyY2NhZffPEFdu/ejZSUFOTn52PcuHEyRk1ERERKouhVwYuLi9GuXTukpKTgoYceQmlpKdq2bYudO3diwoQJAIDz58+je/fuSE1NxeDBg++7T7lXBSciIiLTmXL+VlTLTX2lpaUAgFatWgEAMjIyUFNTg4iICP1jQkND0alTJ6Smpja6j6qqKpSVlRnciIiISL0Um9xotVrMnTsXQ4cORa9evQAAhYWFcHFxga+vr8Fj/fz8UFhY2Oh+EhIS4OPjo7917NjR0qETERGRjBSb3MTExCArKwu7du0yaz/z589HaWmp/pabmytRhERERKREilw488UXX8S+fftw+PBhBN6zuqK/vz+qq6tRUlJi0HpTVFQEf3//Rvfl6uoKV1dXS4dMRERECqGolhtBEPDiiy9i7969OHjwIIKDgw3uDwsLg7OzM5KSkvTbsrOzkZOTg/DwcGuHS0RERAqkqJabmJgY7Ny5E59//jm8vLz0dTQ+Pj5wc3ODj48PoqOjERcXh1atWsHb2xsvvfQSwsPDjRopRUREROqnqKHgGo2m0e3btm3DtGnTAOgm8XvllVfw0UcfoaqqCpGRkdiwYUOT3VL1cSg4ERGR7THl/K2o5MYamNwQERHZHtXMc0NERERkKiY3REREpCpMboiIiEhVmNwQERGRqjC5ISIiIlVhckNERESqwuSGiIiIVIXJDREREakKkxsiIiJSFSY3REREpCpMboiIiEhVmNwQERGRqjC5ISIiIlVhckNERESqwuSGiIiIVIXJDTUpLw9ITtZ9JSIishVMbqhRiYlAUBAwcqTua2Ki3BEREREZh8kNNZCXB8ycCWi1up+1WmDWLLbgEBGRbWByQw1cvHg3salTWwtcuiRPPERERKZgckMNhIQADvXeGY6OQLdu8sRDRERkCiY31EBgILB5sy6hAXRf33tPt52IiEjpnOQOgJQpOhqIjNR1RXXrxsSGiIhsB5MbalJgIJMaIiKyPeyWIiIiIlVhckNERESqwuSGiIiIVIXJDREREakKkxsiIiJSFSY3REREpCpMboiIiEhVmNwQERGRqjC5ISIiIlVhckNERESqYnfLLwiCAAAoKyuTORIiIiIyVt15u+483hy7S27Ky8sBAB07dpQ5EiIiIjJVeXk5fHx8mn2MRjAmBVIRrVaL/Px8eHl5QaPRSLbfsrIydOzYEbm5ufD29pZsv2rD42QcHifj8DgZj8fKODxOxpHjOAmCgPLycgQEBMDBofmqGrtruXFwcECgBZe69vb25j+EEXicjMPjZBweJ+PxWBmHx8k41j5O92uxqcOCYiIiIlIVJjdERESkKkxuJOLq6oq//vWvcHV1lTsUReNxMg6Pk3F4nIzHY2UcHifjKP042V1BMREREakbW26IiIhIVZjcEBERkaowuSEiIiJVYXJDREREqsLkRiJ///vf0blzZ7Ro0QKDBg3CsWPH5A5JVgkJCfjtb38LLy8vtGvXDk8//TSys7MNHlNZWYmYmBi0bt0anp6eGD9+PIqKimSKWH7Lli2DRqPB3Llz9dt4jO766aefMHnyZLRu3Rpubm7o3bs3jh8/rr9fEAQsXLgQ7du3h5ubGyIiInDx4kUZI7a+2tpaLFiwAMHBwXBzc0PXrl2xePFig7V47PE4HT58GE888QQCAgKg0Wjw2WefGdxvzDG5ceMGJk2aBG9vb/j6+iI6Ohq3bt2y4quwvOaOU01NDV5//XX07t0bHh4eCAgIwJQpU5Cfn2+wD6UcJyY3Evj4448RFxeHv/71r8jMzETfvn0RGRmJ69evyx2abFJSUhATE4OjR49i//79qKmpwejRo3H79m39Y2JjY/HFF19g9+7dSElJQX5+PsaNGydj1PJJT0/He++9hz59+hhs5zHSuXnzJoYOHQpnZ2d89dVXOHv2LFatWoWWLVvqH7NixQqsW7cOmzZtQlpaGjw8PBAZGYnKykoZI7eu5cuXY+PGjfjb3/6Gc+fOYfny5VixYgXWr1+vf4w9Hqfbt2+jb9+++Pvf/97o/cYck0mTJuHMmTPYv38/9u3bh8OHD2PmzJnWeglW0dxxqqioQGZmJhYsWIDMzEx8+umnyM7OxpNPPmnwOMUcJ4HMNnDgQCEmJkb/c21trRAQECAkJCTIGJWyXL9+XQAgpKSkCIIgCCUlJYKzs7Owe/du/WPOnTsnABBSU1PlClMW5eXlQkhIiLB//37h4YcfFubMmSMIAo/RvV5//XVh2LBhTd6v1WoFf39/YeXKlfptJSUlgqurq/DRRx9ZI0RFeOyxx4Tnn3/eYNu4ceOESZMmCYLA4yQIggBA2Lt3r/5nY47J2bNnBQBCenq6/jFfffWVoNFohJ9++slqsVtT/ePUmGPHjgkAhGvXrgmCoKzjxJYbM1VXVyMjIwMRERH6bQ4ODoiIiEBqaqqMkSlLaWkpAKBVq1YAgIyMDNTU1Bgct9DQUHTq1MnujltMTAwee+wxg2MB8Bjd69///jcGDBiAZ555Bu3atcODDz6ILVu26O+/cuUKCgsLDY6Vj48PBg0aZFfHasiQIUhKSsKFCxcAAKdOncKRI0cwZswYADxOjTHmmKSmpsLX1xcDBgzQPyYiIgIODg5IS0uzesxKUVpaCo1GA19fXwDKOk52t3Cm1H7++WfU1tbCz8/PYLufnx/Onz8vU1TKotVqMXfuXAwdOhS9evUCABQWFsLFxUX/T1HHz88PhYWFMkQpj127diEzMxPp6ekN7uMxuuvy5cvYuHEj4uLi8MYbbyA9PR0vv/wyXFxcMHXqVP3xaOz/0J6O1bx581BWVobQ0FA4OjqitrYWb7/9NiZNmgQAPE6NMOaYFBYWol27dgb3Ozk5oVWrVnZ73CorK/H6669j4sSJ+oUzlXScmNyQxcXExCArKwtHjhyROxRFyc3NxZw5c7B//360aNFC7nAUTavVYsCAAVi6dCkA4MEHH0RWVhY2bdqEqVOnyhydcvzrX//Cjh07sHPnTvTs2RMnT57E3LlzERAQwONEkqmpqcEf/vAHCIKAjRs3yh1Oo9gtZaY2bdrA0dGxwQiWoqIi+Pv7yxSVcrz44ovYt28fkpOTERgYqN/u7++P6upqlJSUGDzeno5bRkYGrl+/jv79+8PJyQlOTk5ISUnBunXr4OTkBD8/P7s/RnXat2+PHj16GGzr3r07cnJyAEB/POz9//DVV1/FvHnz8Mc//hG9e/fGc889h9jYWCQkJADgcWqMMcfE39+/wQCRO3fu4MaNG3Z33OoSm2vXrmH//v36VhtAWceJyY2ZXFxcEBYWhqSkJP02rVaLpKQkhIeHyxiZvARBwIsvvoi9e/fi4MGDCA4ONrg/LCwMzs7OBsctOzsbOTk5dnPcRo0ahdOnT+PkyZP624ABAzBp0iT99/Z+jOoMHTq0wVQCFy5cQFBQEAAgODgY/v7+BseqrKwMaWlpdnWsKioq4OBg+LHu6OgIrVYLgMepMcYck/DwcJSUlCAjI0P/mIMHD0Kr1WLQoEFWj1kudYnNxYsXceDAAbRu3drgfkUdJ6uWL6vUrl27BFdXV+H9998Xzp49K8ycOVPw9fUVCgsL5Q5NNrNnzxZ8fHyEQ4cOCQUFBfpbRUWF/jEvvPCC0KlTJ+HgwYPC8ePHhfDwcCE8PFzGqOV372gpQeAxqnPs2DHByclJePvtt4WLFy8KO3bsENzd3YV//vOf+scsW7ZM8PX1FT7//HPhhx9+EJ566ikhODhY+PXXX2WM3LqmTp0qdOjQQdi3b59w5coV4dNPPxXatGkjvPbaa/rH2ONxKi8vF06cOCGcOHFCACCsXr1aOHHihH6UjzHH5NFHHxUefPBBIS0tTThy5IgQEhIiTJw4Ua6XZBHNHafq6mrhySefFAIDA4WTJ08afK5XVVXp96GU48TkRiLr168XOnXqJLi4uAgDBw4Ujh49KndIsgLQ6G3btm36x/z666/Cn/70J6Fly5aCu7u7MHbsWKGgoEC+oBWgfnLDY3TXF198IfTq1UtwdXUVQkNDhc2bNxvcr9VqhQULFgh+fn6Cq6urMGrUKCE7O1umaOVRVlYmzJkzR+jUqZPQokULoUuXLsKf//xng5OPPR6n5OTkRj+Ppk6dKgiCccfkl19+ESZOnCh4enoK3t7eQlRUlFBeXi7Dq7Gc5o7TlStXmvxcT05O1u9DKcdJIwj3TF1JREREZONYc0NERESqwuSGiIiIVIXJDREREakKkxsiIiJSFSY3REREpCpMboiIiEhVmNwQERGRqjC5ISIiIlVhckNEpGLHjx/HihUr8MMPP8gdCpHVMLkhsmEjRozA3Llzbf451OTQoUPo3LmzrDH88ssv2L17NzZs2IDi4mLMnDkTV69excaNG7Fnzx6UlpYaPF4JMRNJyUnuAIioeampqRg2bBgeffRR/Oc//5E7nPsaMWIE+vXrh3fffVfuUOxW69at8cwzzxhse/LJJ2WKhsj62HJDpHCJiYl46aWXcPjwYeTn58sdjqJVV1ebtF3s/ohI2ZjcECnYrVu38PHHH2P27Nl47LHH8P777zd4zJ07d/Diiy/Cx8cHbdq0wYIFC3DveriffPIJevfuDTc3N7Ru3RoRERG4ffs2AKCqqgovv/wy2rVrhxYtWmDYsGFIT09vMp7OnTs3aJHp168f3nzzTQDAtGnTkJKSgrVr10Kj0UCj0eDq1asAAK1Wi4SEBAQHB8PNzQ19+/bFJ5980uzrv9/vjBgxAi+++CLmzp2LNm3aIDIyssntxrzWpvbX3DE0RmBgIDZs2GCw7fvvv4e7uzuuXbtm9H6U+nxESsPkhkjB/vWvfyE0NBQPPPAAJk+ejK1btxokLgCwfft2ODk54dixY1i7di1Wr16Nf/zjHwCAgoICTJw4Ec8//zzOnTuHQ4cOYdy4cfp9vPbaa9izZw+2b9+OzMxMdOvWDZGRkbhx44aoeNeuXYvw8HDMmDEDBQUFKCgoQMeOHQEACQkJ+OCDD7Bp0yacOXMGsbGxmDx5MlJSUprcnzG/s337dri4uOC7777Dpk2bmtxu7Gut/3v3O4bGGDRokEEiJQgC5s6di9jYWAQFBRm9H6U+H5HiCESkWEOGDBHeffddQRAEoaamRmjTpo2QnJysv//hhx8WunfvLmi1Wv22119/XejevbsgCIKQkZEhABCuXr3aYN+3bt0SnJ2dhR07dui3VVdXCwEBAcKKFSsMnmPOnDmCIAhCUFCQsGbNGoP99O3bV/jrX//a6OPrVFZWCu7u7sL3339vsD06OlqYOHFio6/dmN95+OGHhQcffLDB79bfbsprrb+/5o5hY5KTk4WgoCCDbStWrBB69uyp/3n79u2Cv7+/UF5eLgiCICQlJQnvvPOOUfs3xv2er/5zNhYzkS1jyw2RQmVnZ+PYsWOYOHEiAMDJyQnPPvssEhMTDR43ePBgaDQa/c/h4eG4ePEiamtr0bdvX4waNQq9e/fGM888gy1btuDmzZsAgB9//BE1NTUYOnSo/nednZ0xcOBAnDt3TtLXcunSJVRUVOB3v/sdPD099bcPPvgAP/74o1m/ExYW1ujv37vdlNdaf3/NHUNjDR48GOfOncOtW7dw+/ZtvPHGG1iyZAk8PT0BACNHjsQrr7zS4PfmzZun795r6nb+/HmTn6+55yRSA46WIlKoxMRE3LlzBwEBAfptgiDA1dUVf/vb3+Dj43PffTg6OmL//v34/vvv8c0332D9+vX485//jLS0NFExOTg4NOiOqampue/v3bp1CwDwn//8Bx06dDC4z9XV1azf8fDwaPT3m9p+P/V/r7ljGBwcbNQ+w8LC4ODggMzMTBw4cABt27ZFVFSU/v4nn3wSb7/9Nnr37m3we6+88gqmTZvW7L67dOli8vM195xEasDkhkiB7ty5gw8++ACrVq3C6NGjDe57+umn8dFHH+GFF14AgAaJytGjRxESEgJHR0cAgEajwdChQzF06FAsXLgQQUFB2Lt3L2bNmqWvLamrw6ipqUF6enqT89q0bdsWBQUF+p/Lyspw5coVg8e4uLigtrbWYFuPHj3g6uqKnJwcPPzww0YdAzG/05SuXbua/Frv1dQxjIuLM+r53d3d0bt3b+zZswdbtmzBl19+CQeHuw3n58+fR2hoaIPfa9u2Ldq2bWvcizTh+Zp7TiI1YHJDpED79u3DzZs3ER0d3aCFZvz48UhMTNQnNzk5OYiLi8OsWbOQmZmJ9evXY9WqVQB0iU9SUhJGjx6Ndu3aIS0tDcXFxejevTs8PDwwe/ZsvPrqq2jVqhU6deqEFStWoKKiAtHR0Y3GNXLkSLz//vt44okn4Ovri4ULF+qTqDqdO3dGWloarl69Ck9PT7Rq1QpeXl6Ij49HbGwstFothg0bhtLSUnz33Xfw9vbG1KlTGzyXmN9pipjXWqe5Y2iKwYMHY/369XjqqacwYsQI/fby8nK0aNECzs7OJu1P7PNZ8jmJlILJDZECJSYmIiIiotGup/HjxxtMpz9lyhT8+uuvGDhwIBwdHTFnzhzMnDkTAODt7Y3Dhw/j3XffRVlZGYKCgrBq1SqMGTMGALBs2TJotVo899xzKC8vx4ABA/D111+jZcuWjcY1f/58XLlyBY8//jh8fHywePHiBi038fHxmDp1Knr06IFff/0VV65cQefOnbF48WK0bdsWCQkJuHz5Mnx9fdG/f3+88cYbTR4HMb/TFFNfa537HUNj9e3bF87Ozli5cqXB9jNnzqBnz54mvx6xz2fJ5yRSCo1QvwOdiIhEO3ToEKZNm6af36fOI488gv79++tb1eps2bIFxcXFohK25jT1fI09Z1MxE9kqttwQEVmIVqtFcXExEhMTcfHiRXz++ecNHnP69GlERERY7fmkfk4iJWJyQ0RkIYcPH8bIkSMRGhqKPXv2wNvbu8Fj1q1bZ9Xnk/o5iZSIyQ0RkYQ6d+6sH4E1YsQIaLVaqz232Oe7N2YiNWDNDREREakKZygmIiIiVWFyQ0RERKrC5IaIiIhUhckNERERqQqTGyIiIlIVJjdERESkKkxuiIiISFWY3BAREZGqMLkhIiIiVWFyQ0RERKrC5IaIiIhU5f8BGmwbMsYohvcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_std\n", "\n", "plot_crossplot_std(y_test, y_pred_proba)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_std\n", "\n", "y_pred_var = reg_proba.predict_var(X_test)\n", "plot_crossplot_std(y_test, y_pred_var)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "C. crossplot ground truth vs loss values\n", "\n", "Loss and prediction type should agree.\n", "\n", "What to look for: association between accuracy and ground truth value\n", "\n", "Diagnostic of which values we can predict more accurately,\n", "\n", "e.g., to inform modelling or identify unusual outliers" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj8AAAHLCAYAAAAnR/mlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABMZ0lEQVR4nO3dd3hUVeL/8c+kzKROICQhCSV0CF2KgKgoIFiw17WAyioqFlAX0RXRXRUrWFZB2RVlV5ZFV9y1svZCk6L0EiAEMJSApEIySeb+/uCX+TJkQmbCJDOT+349T56HW+bOmcPMvZ8559wzFsMwDAEAAJhEWKALAAAA0JAIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwCAkLZixQqdccYZio2NlcVi0S+//BLoIiHIEX6AkygtLdWMGTM0YMAAJSQkKCoqSp06ddLdd9+trVu3uvZ7/PHHZbFYXH+RkZFq06aN7r33XuXn51c7bps2bdz2T0lJ0VlnnaWFCxe67ed0OjV37lwNGDBAiYmJio+PV6dOnTR69GgtW7asTq9p8+bNmjRpknr37q34+HilpaXpoosu0sqVKz3uP3/+fPXp00dRUVFKTk7W2LFjdfDgQa+e6+mnn9bAgQOVnJysqKgodezYURMmTFBeXt5JH/fuu+/KYrEoLi7O59dXF+vWrZPFYtFPP/3k82P/97//aezYserevbvCw8PVpk0bnx5fXFysCRMmqGXLlrLZbMrMzNTMmTOr7XfOOee4vWdOfL+dqiNHjujxxx/Xt99+e8rHakjl5eW6+uqr9dtvv2nGjBn6+9//royMjEAXC0EuItAFAILVwYMHdf7552vVqlUaNWqUrr/+esXFxWnLli2aP3++3nzzTTkcDrfHzJw5U3FxcSopKdFXX32lV199VatXr9aPP/5Y7fi9e/fWAw88IEnKzc3VG2+8oSuuuEIzZ87UHXfcIUm699579dprr+nSSy/VDTfcoIiICG3ZskWfffaZ2rVrp4EDB/r8uv7617/qb3/7m6688krdddddKigo0BtvvKGBAwfq888/1/Dhw91ez1133aVhw4Zp+vTp2rNnj15++WWtXLlSy5cvV1RU1Emfa9WqVerdu7euu+46xcfHa9OmTZo9e7Y++eQT/fLLL4qNja32mOLiYk2aNMnjtvryySefKCUlRf379/f5sfPmzdO//vUv9enTR+np6T49trKyUiNHjtTKlSs1fvx4dezYUYsWLdJdd92lw4cP65FHHnHt+8c//lG///3v3R5fUlKiO+64QyNGjPC53Cc6cuSInnjiCUnHglao2L59u3JycjR79uxq9QPUyADg0UUXXWSEhYUZ77//frVtpaWlxgMPPOBanjp1qiHJyMvLc9vv2muvNSQZy5cvd1ufkZFhXHTRRW7r9u7da8TGxhqdOnUyDMMw9u3bZ1gsFuO2226r9vxOp9PYv39/nV7XypUrjaKiIrd1Bw8eNJKTk43Bgwe71pWVlRlNmjQxzj77bMPpdLrWf/TRR4Yk45VXXqnT87///vuGJOOf//ynx+0PPfSQ0blzZ+OGG24wYmNj6/QchnGsjqdOnerVvmeddZYxZsyYOj3Pr7/+ajgcDsMwjr1nMjIyvH7sggULDEnG3/72N7f1V155pREVFVXr//Hf//53Q5Lx7rvv+lzuE+Xl5RmSvK4zbxUXF9e4raSk5JSP/9133xmSjPfee++UjwXzoNsLflHV7bN161bdeOONSkhIUHJysqZMmSLDMLR7925deumlstvtSk1N1YsvvljtGGVlZZo6dao6dOggm82mVq1aadKkSSorK3Pbb86cORo6dKhSUlJks9nUtWtXj90Ebdq00ahRo/Tjjz/q9NNPV1RUlNq1a6e5c+fW+nqWL1+uTz75RGPHjtWVV15ZbbvNZtMLL7xQ63HOOussSce+ndYmNTVVmZmZys7OliRlZ2fLMAwNHjy42r5VXWXH2759u1fP07dv32rdSc2aNdNZZ52lTZs2udatX79e+fn5uvbaa2WxWFzrR40apbi4OM2fP7/W5/KkqlvIU3dgVlaWZsyYoenTpysiomEapvPz87VkyRJddNFFdXp8enp6nbudfvjhB0nSdddd57b+uuuuU2lpqf7zn/+c9PHz5s1TbGysLr300lqfa+XKlRo5cqSSkpIUHR2ttm3b6tZbb5Uk7dy5U8nJyZKkJ554wtWd9vjjj7sev3nzZl111VVKTExUVFSU+vXrp//+979uz/H222/LYrHou+++01133aWUlBS1bNlS0rHWpO7du2vVqlU6++yzFRMT49ay5cnXX3+ts846S7GxsWrSpIkuvfRSt/fozTffrCFDhkiSrr76alkslpO2WlWV78cff9S9996r5ORkNWnSROPGjZPD4VB+fr5Gjx6tpk2bqmnTppo0aZIMw3A7htPp1EsvvaRu3bopKipKzZs317hx43T48GG3/f7zn//ooosuUnp6umw2m9q3b68///nPqqysdNuvql42btyoc889VzExMWrRooWee+65k9YNTg3dXvCra6+9VpmZmXrmmWf0ySef6Mknn1RiYqLeeOMNDR06VM8++6zeffddPfjgg+rfv7/OPvtsScdOKJdccol+/PFH3X777crMzNS6des0Y8YMbd26VR9++KHrOWbOnKlu3brpkksuUUREhD766CPdddddcjqdGj9+vFt5tm3bpquuukpjx47VmDFj9NZbb+nmm29W37591a1btxpfR9VJ/aabbjql+ti5c6ckqWnTprXuW15ert27d6tZs2aS5Bq38N577+nqq69WTEzMSR8/bNgwt+f01b59+5SUlORargqd0dHR1faNjo7Wzz//LKfTqbCwk3+HMgxDhw4dUkVFhbKysjR58mSFh4d7vEhNmDBB5557ri688EItWLCgTq/DV4sWLZLFYvFL15GvysrKFB4eLqvV6ra+6v961apVuu222zw+Ni8vT1988YWuvfbaWrsIDxw4oBEjRig5OVmTJ09WkyZNtHPnTn3wwQeSpOTkZM2cOVN33nmnLr/8cl1xxRWSpJ49e0qSNmzYoMGDB6tFixaaPHmyYmNjtWDBAl122WX697//rcsvv9zt+e666y4lJyfrscceU0lJiWv9oUOHdMEFF+i6667TjTfeqObNm9dY5i+//FIXXHCB2rVrp8cff1xHjx7Vq6++qsGDB2v16tVq06aNxo0bpxYtWujpp5/Wvffeq/79+5/0mFXuuecepaam6oknntCyZcv05ptvqkmTJlqyZIlat26tp59+Wp9++qmef/55de/eXaNHj3Y9dty4cXr77bd1yy236N5771V2drb+8pe/6Oeff9bixYtdQfjtt99WXFyc7r//fsXFxenrr7/WY489psLCQj3//PNu5Tl8+LDOP/98XXHFFbrmmmv0/vvv66GHHlKPHj10wQUX1Pp6UAeBbXhCY1HV7XP77be71lVUVBgtW7Y0LBaL8cwzz7jWHz582IiOjnbrZvj73/9uhIWFGT/88IPbcWfNmmVIMhYvXuxad+TIkWrPP3LkSKNd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5kmSbrjhBq+ew2Kx6P3339eyZcv00UcfadGiRbr11lv14osvatmyZScNd1WfqQcffFAjR470uE+HDh3clmsK/DWtb2g1nRc8rT/xPJWSkqJ3333X4+Orvrzl5+dryJAhstvt+tOf/qT27dsrKipKq1ev1kMPPeS38xTqjvCDoNC+fXutWbNGw4YNq/YN6HgfffSRysrK9N///tft29vxzc3+cPHFF2vatGn6xz/+4VP4OV5cXJymTp2qW265RQsWLKh2R8+p6Nevn7777jvt3bu3TuHH6XRq9OjR+uqrr7RgwQLXHTM1ad26tau+8/PztWrVKo93wXmrtLTU9e338OHDKi4u1nPPPefxDpe2bdvq0ksvdRv0fqK0tDSlpaW5rau6u+9kAfOTTz7RhRde6Lbu3XffdetuateunTcv6ZSEh4erd+/eruUvv/xSkmos+7x589S+fXuf53kaOHCgBg4cqKeeekrz5s3TDTfcoPnz5+v3v/99jZ+7qtcfGRnpU1g/FVXv6S1btlTbtnnzZiUlJTXoPFBV2rdvry+//FKDBw8+aZD79ttvdejQIX3wwQeumzokue7kROAx5gdB4ZprrtGvv/6q2bNnV9t29OhR1x0jVd+Qjv9GVFBQoDlz5vi1PIMGDdL555+vv/71rx4vug6Hw9UNdDI33HCDWrZs6TaOx1v79u3Txo0bPT73V199pbCwMLdv3N7e6i4du9vlX//6l15//XXXnT3eevjhh1VRUaGJEye6rd+8ebN27drlWi4pKanWLSkd6xo8fPiw+vXrJ0lKSUnRwoULq/2de+65ioqK0sKFC/Xwww/7VEZv7N+/X6tXr6423mfw4MEaPny4689f4ae8vFybN2/W3r17T7pfXl6enn32WfXs2dNj2Pj555+1adMmXX/99V4/9+HDh6u1IlSFraq7+qrGpZ04BUFKSorOOeccvfHGGx7LXtts3XWRlpam3r1765133nErz/r16/W///2vWmBtKNdcc40qKyv15z//udq2iooKV1k9naccDodrLBcCj5YfBIWbbrpJCxYs0B133KFvvvlGgwcPVmVlpTZv3qwFCxZo0aJF6tevn0aMGCGr1aqLL75Y48aNU3FxsWbPnq2UlJRaLyq+mjt3rkaMGKErrrhCF198sYYNG6bY2FhlZWVp/vz52rt3b61z/URGRuq+++7TH/7wB33++ec6//zzvX7+PXv26PTTT9fQoUM1bNgwpaam6sCBA/rnP/+pNWvWaMKECW5jqby91f2ll17S66+/rkGDBikmJkb/+Mc/3LZffvnlrm/VzzzzjNavX68BAwYoIiJCH374of73v//pySefrDYbcmZmpoYMGeL6eYSsrCwNHz5c1157rbp06aKwsDCtXLlS//jHP9SmTRvdd999ko5ddC+77LJq5fzwww/1008/edzmD59++qmioqJ07rnnntJx1q5d65oaYdu2ba5uPEnq1auXLr74YknSr7/+qszMTI0ZM0Zvv/226/FDhgzRoEGD1KFDB+3bt09vvvmmiouL9fHHH3ucRqCqy8XbLi9Jeuedd/T666/r8ssvV/v27VVUVKTZs2fLbre7gkR0dLS6du2qf/3rX+rUqZMSExPVvXt3de/eXa+99prOPPNM9ejRQ7fddpvatWun/fv3a+nSpdqzZ4/WrFlTp7o7meeff14XXHCBBg0apLFjx7pudU9ISKjXbsiTGTJkiMaNG6dp06bpl19+0YgRIxQZGamsrCy99957evnll3XVVVfpjDPOUNOmTTVmzBjde++9slgs+vvf/043VjAJyD1maHRqmuG4ptuVhwwZYnTr1s1tncPhMJ599lmjW7duhs1mM5o2bWr07dvXeOKJJ4yCggLXfv/973+Nnj17GlFRUUabNm2MZ5991njrrbcMSUZ2drZrP0+zKFc9t7e3Nh85csR44YUXjP79+xtxcXGG1Wo1OnbsaNxzzz3Gtm3ban39hmEYBQUFRkJCgttz1lS24xUWFhovv/yyMXLkSKNly5ZGZGSkER8fbwwaNMiYPXu22626Vcf05jbrMWPGuN16fuLf8XX48ccfG6effroRHx9vxMTEGAMHDjQWLFjg8biS3F5jXl6ecfvttxtdunQxYmNjXXU3YcIEj/XkqZz1eav7VVddZVx44YV1Pn6VqtunPf0dP51DdnZ2tXWGYRgTJ0402rVrZ9hsNiM5Odm4/vrrje3bt3t8rsrKSqNFixZGnz59fCrj6tWrjd/97ndG69atDZvNZqSkpBijRo0yVq5c6bbfkiVLjL59+xpWq7Xabe/bt283Ro8ebaSmphqRkZFGixYtjFGjRrnNgF5VF55uqff0ma/Nl19+aQwePNiIjo427Ha7cfHFFxsbN25026cut7qfWD5fz19vvvmm0bdvXyM6OtqIj483evToYUyaNMnIzc117bN48WJj4MCBRnR0tJGenm5MmjTJWLRokSHJ+Oabb1z71VQvY8aMqfPUFaidxTCIogDMpaKiQs2aNdO0adN01113Bbo4ABoYY34AmM5vv/2miRMnVpuZGIA50PIDAABMhZYfAABgKoQfAABgKoQfAABgKoQfAABgKkxy6IHT6VRubq7i4+NP+lMLAAAgeBiGoaKiIqWnp3ucJLQK4ceD3Nzcar/uCwAAQsPu3bvVsmXLGrcTfjyIj4+XdKzy7HZ7gEsDAAC8UVhYqFatWrmu4zUh/HhQ1dVlt9sJPwAAhJjahqww4BkAAJgK4QcAAJgK4QcAAJgK4QcAAJgK4QcAAJgK4QcAAJgK4QcAAJgK4QcAAJgK4QcAAJhKUIWf/PzvtW7dxVqyJF3ffmtRXt6HbtsNw1B29mNasiRN338frV9+Ga4jR7Lc9ikv/00bN96gH36w64cfmmjz5rGqqChuwFcBAACCWVCFn8rKEsXG9lLHjq953L5793Pas+cVdeo0S336LFd4eKzWrh2pyspS1z6bNt2gkpIN6tXrC/Xo8bEKCr7X1q23N9RLAAAAQS6owk+zZheoXbsnlZx8ebVthmFoz56XlJHxqJKSLlVcXE9lZs5VWVmuDh78UJJUUrJJv/32uTp3/qvs9gFq0uRMdejwqg4cmK+ystwGfjUAACAYBVX4OZnS0mw5HPvUtOlw17qIiATZ7QNUWLhUklRYuFQREU1kt/dz7XNs/zAVFi5v6CIDAIAgFDK/6u5w7JMkWa3N3dZbrc1d2xyOfYqMTHHbHhYWocjIRNc+njidZXI6y1zLFRWF/io2gEasrGyvHI69NW63WtNks6U1YIkAeCNkwk99ysmZppycJ1zLJSUBLAyAkJGb+4bbueNEGRlT1bbt4w1XIABeCZnwY7WmSpIcjv1u36Qcjv2Ki+vt2qe8/IDb45zOCpWX/+Z6vCcZGQ+rVav7XcuFhYWSWvmv8AAapfT0cUpKuqTG7VYrrT5AMAqZ8BMV1VZWa6ry879SfHxvSce6pwoLlys9/U5Jkt0+SBUV+SoqWqX4+L6SpPz8ryU5ZbcPqPHYYWE2hYXZXMsRIVMrAALJZqNbCwhFQXWZr6go1tGj21zLpaXZKir6RZGRiYqKaq2WLScoJ+dJRUd3VFRUW2VnT5HNlq6kpMskSbGxmUpMPF9bttymTp1myTDKlZV1t1JSrpPNlh6gVwUAAIJJUIWfoqKVWrPmXNfy9u3HuqKaNx+jzMy31arVJFVWlmjLlttVUZGvhIQz1bPn5woPj3I9JjPzXWVl3a01a4ZJClNy8pXq0OGVhn4pAAAgSFkMwzACXYhgU1hYqISEBBUUFMhutwe6OAAAwAveXr9DZp4fAAAAfyD8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAU4kIdAEQXMrK9srh2Fvjdqs1TTZbWgOWCAAA/yL8wE1u7hvKyXmixu0ZGVPVtu3jDVcgAAD8jPADN+np45SUdEmN261WWn0AAKGN8AM3NhvdWgCAxo0BzwAAwFQIPwAAwFQIPwAAwFQY8wMAAOpVsE2jQvgBAAD1KtimUSH8AACAehVs06gQfgAAQL0KtmlUGPAMAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMhfADAABMJSLQBfCVYVRq587HtX//P+Rw7JPVmq7U1JuVkfGoLBbL/9/H0M6dU7V372xVVOTLbh+sTp1mKiamY4BLDwAAAi3kWn527XpWv/46Ux07/kX9+29Su3bPavfu5/Trr6+69tm9+znt2fOKOnWapT59lis8PFZr145UZWVpAEsOAACCQciFn4KCJUpKulTNml2k6Og2Skm5Sk2bjlBh4U+SjrX67NnzkjIyHlVS0qWKi+upzMy5KivL1cGDHwa28AAAIOBCLvwkJJyhw4e/0pEjWyVJxcVrVFDwo5o1u0CSVFqaLYdjn5o2He56TEREguz2ASosXOrxmE5nmSoqCt3+AABA4xRyY35at56siopC/fRTF1ks4TKMSrVt+5SaN79BkuRw7JMkWa3N3R5ntTZ3bTtRTs405eQ84VouKamnwgMAgIALufBz4MACHTjwrjIz5yk2tpuKi3/Rtm0TZLOlKzV1TJ2OmZHxsFq1ut+1XFhYKKmVn0oMAACCSciFnx07/qDWrSerefPrJElxcT1UWpqjnJxpSk0dI6s1VZLkcOyXzZbmepzDsV9xcb09HjMszKawMJtrOSLkagUAAHgr5Mb8VFYe0YnFtljCJTklSVFRbWW1pio//yvX9oqKQhUWLpfdPqgBSwoAAIJRyLVxNGt2sXJynlJUVGvFxHRTcfHP2rNnulJTb5UkWSwWtWw5QTk5Tyo6uqOiotoqO3uKbLZ0JSVdFtjCAwCAgAu58NOx46vKzp6irVvvUnn5AVmt6UpLG6c2bR5z7dOq1SRVVpZoy5bbVVGRr4SEM9Wz5+cKD48KYMkBAEAwsBiGYQS6EMGmsLBQCQkJKigokN1uD3RxAACAF7y9fofcmB8AAIBTQfgBAACmQvgBAACmQvgBAACmQvgBAACmQvgBAACmQvgBAACmEnKTHMI7ZWV75XDsrXG71Zrm9ttnAACYBeGnkcrNfUM5OU/UuD0jY6ratn284QoEAECQIPw0Uunp45SUdEmN261WWn0AAOZE+GmkbDa6tQAA8IQBzwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFS41R1+xczSAIBgR/iBXzGzNAAg2BF+4FfMLA0ACHaEH/gVM0sDwY/uaZgd4QcATIbuaZgd4QcATIbu6drROta4EX4AwGTonq4drWONG+EHQY1vXwACgdaxxo3wg6DGty8AgWDG1jEzfdkk/CCo8e0LABqGmb5sEn4Q1Mz47QsAAsFMXzYJPwAAwFRfNvlhUwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCrc7dVAzDR5FAAAwYzw00DMNHkUAADBjPDTQMw0eRQAAMGM8NNAzDR5FAAAwYwBzwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFT4YVMAQEgqK9srh2NvjdutVn5QGp4RfgAAISk39w3l5DxR4/aMjKlq2/bxhisQQkadw095ebn27dunI0eOKDk5WYmJif4sFwAAJ5WePk5JSZfUuN1qpdUHnvkUfoqKivSPf/xD8+fP108//SSHwyHDMGSxWNSyZUuNGDFCt99+u/r3719f5QUAQJJks9GthbrxesDz9OnT1aZNG82ZM0fDhw/Xhx9+qF9++UVbt27V0qVLNXXqVFVUVGjEiBE6//zzlZWVVZ/lBgAAqBOLYRiGNzv+7ne/06OPPqpu3bqddL+ysjLNmTNHVqtVt956q18K2dAKCwuVkJCggoIC2e32QBcHAAB4wdvrt9fhx0wIPwCAhsbda6fO2+v3Kd3tNWPGDE2cOFEbNmxQly5dFB4efiqHAwDAtLh7reGcUvjp3bu3JOmRRx7R5s2bFR0drW7duqlHjx7q3r27Ro0a5Y8yAgDQ6HH3WsPxuturqKhI8fHxkqTdu3erVatW1fYpLi7Whg0btG7dOq1fv14vvfSSXwvbUOj2AgAg9Ph9zM/ChQt1+eWXS5JiY2P1wAMPaPLkyYqJifFPiX1QVvartm9/SL/99pmcziOKju6gzp3nyG7vJ0kyDEM7d07V3r2zVVGRL7t9sDp1mqmYmI5eHZ/wAwBA6PH2+u31re779+93/fuLL77QokWL1LFjR7399tunVFBflZcf1urVgxUWFqmePT9T//4b1b79i4qMbOraZ/fu57Rnzyvq1GmW+vRZrvDwWK1dO1KVlaUNWlYAABB8vAo/69evV4sWLVzLZ5xxhpYvX65p06ZpypQp6tu3r3744Yd6K+Txdu16VlFRrdSlyxzZ7acrOrqtEhNHKDq6vaRjrT579rykjIxHlZR0qeLieiozc67KynJ18OCHDVJGAAAQvLwKP5999pmGDBlSbf3o0aO1ZcsWXXTRRbrgggt01VVXKTs72++FPN6hQ/9VfHw/bdhwtRYvTtHKlacpN3e2a3tpabYcjn1q2nS4a11ERILs9gEqLFzq8ZhOZ5kqKgrd/gAAQOPkVfgZOnSoli71HBwkacSIEfr973+vhQsXqmvXrpo0aZKKi4v9VsjjHT26Q7/+OlPR0R3Vs+cipaffqW3b7tW+fe9IkhyOfZIkq7W52+Os1uaubSfKyZmmH39McP0tXVp9MDcAAGgcvLrVvW/fvpo1a5ZredasWVqxYoVWrFihTZs2KSwsTN27d9cdd9yhXr16af78+eratas++OAD9evXz89Fdio+vp/atXtakhQff5pKStYrN3eWUlPH1OmIGRkPq1Wr+13LhYWFkghAAAA0Rl7P85OUlOT691NPPaUBAwZo9OjRGjhwoPr27avo6GjX9ttvv11PP/20br75Zq1fv96vBbZa0xQT09VtXUxMpvLy/v3/t6dKkhyO/W4zYToc+xUX19vjMcPCbAoLs7mWI05p9iMAABDMvL7MDx061PXv3bt317r/2LFjNWXKlLqV6iQSEgbr6NEtbuuOHt2qqKgMSVJUVFtZranKz/9K8fG9JUkVFYUqLFyu9PQ7/V4eM2IKdgBAKPM6/CQmJvp04JSUFH399dc+F6g2LVtO1M8/n6GcnKeVnHyNiop+Um7um+rc+U1JksViUcuWE5ST86SiozsqKqqtsrOnyGZLV1LSZX4vjxkxBTsAIJSF5A+bHjz4sbKzH9aRI1mKjm6rli3vV3r6ba7tVZMc5ua+qYqKfCUknKlOnV5XTEwnr47PJIcnR8sPYB583hFK+FX3U0D4AYBjsrMfp6UXIaNBftUdANC48WObaIwIPwCAGtlsdGuh8fH6t70AAAAaA7+Hn7CwMA0dOlSrVq3y96EBAABOmd/Dz1tvvaWzzz5b48eP9/ehAQAAThl3e3nQkHd7cRspgBNxXgDqpkHu9poxY4YmTpyoDRs2qEuXLgoPDz+Vw5kSEwYCOBHnBaB+nVL46d27tyTpkUce0ebNmxUdHa1u3bqpR48e6t69u0aNGuWPMjZq3EYK4EScF4D65ddur+LiYm3YsEHr1q3T+vXr9dJLL/nr0A2KSQ4BAAg99TrD8+7du9WqVatTKmAwI/wAABB66nXMT5cuXfTAAw9o8uTJiomJqXMhAQAIJQxGbxzqdKv7F198oUWLFqljx456++23/VwkAACCU27uG1q1qm+Nf7m5bwS6iPDCKY35mTt3rv74xz8qJSVFL730ks466yx/li1g6PYCAHhCy09wa7BfdT9y5IieeeYZTZ8+Xeeff76ef/55tW3b9lQOGXCEn+DBiQYA4K0G/VX3ESNGqLCwUK+++qo++eQT3XPPPXrssccUFxfnj8PDxJjvBADgb3UKP7NmzdKKFSu0YsUKbdq0SWFhYerevbvuuOMO9erVS/Pnz1fXrl31wQcfqF+/fv4uM0yE+U4AAP5Wp26vVq1aacCAARo4cKAGDhyovn37Kjo62m2fp59+WvPmzdP69ev9VtiGQrcXAKAxMNvQgQYb81OTAwcOKC0tTZWVlfVx+HpF+AEANAbZ2Y+bauiA38f87Nq1S61bt/a6AGVlZfr666+93h8AAPgXQwc883qen/79+2vcuHFasWJFjfsUFBRo9uzZ6t69uxYuXKghQ4b4pZAAAMB3Nlua4uP71PjXmLq8fOF1y8/GjRv11FNP6bzzzlNUVJT69u2r9PR0RUVF6fDhw9q4caM2bNigPn366LnnntOFF15Yn+UGAACoE5/H/Bw9elSffPKJfvzxR+Xk5Ojo0aNKSkrSaaedppEjR6p79+71VdYGw5gfAABCT8AHPIcywg8AAKHH2+t3nX7bCwAAIFT5FH6WLl2qjz/+2G3d3Llz1bZtW6WkpOj2229XWVmZXwsIAADgTz6Fnz/96U/asGGDa3ndunUaO3ashg8frsmTJ+ujjz7StGnT/F5IAAAAf/Ep/Pzyyy8aNmyYa3n+/PkaMGCAZs+erfvvv1+vvPKKFixY4PdCAgAA+ItP4efw4cNq3ry5a/m7777TBRdc4Fru37+/du/e7b/SAQAA+JlP4ad58+bKzs6WJDkcDq1evVoDBw50bS8qKlJkZKR/SwgAAOBHPoWfCy+8UJMnT9YPP/yghx9+WDExMTrrrLNc29euXav27dv7vZAAAAD+4vUMz5L05z//WVdccYWGDBmiuLg4vf3227Jara7tb731lkaMGOH3QgIAAPhLnSY5LCgoUFxcnMLDw93W//bbb4qLi3MLRKGISQ4BAAg99TLJodPp1LPPPqsLL7xQAwcO1OTJk3X06FHX9sTExJAPPgAAoHHzKfw89dRTeuSRRxQXF6cWLVro5Zdf1vjx4+urbAAAAH7nU/iZO3euXn/9dS1atEgffvihPvroI7377rtyOp31VT4AAAC/8in87Nq1SxdeeKFrefjw4bJYLMrNzfV7wQAAAOqDT+GnoqJCUVFRbusiIyNVXl7u10IBAADUF59udTcMQzfffLNsNptrXWlpqe644w7Fxsa61n3wwQf+KyEAAIAf+RR+xowZU23djTfe6LfCAAAA1Defws+cOXPqqxxAgygr2yuHY2+N263WNNlsaQ1YIgBAQ/Mp/Hjj6NGjio6O9vdhAb/IzX1DOTlP1Lg9I2Oq2rZ9vOEKBABocH4LP2VlZfrLX/6i559/Xvv27fPXYQG/Sk8fp6SkS2rcbrXS6gMAjZ1P4aesrEyPP/64vvjiC1mtVk2aNEmXXXaZ5syZoz/+8Y8KDw/XxIkT66uswCmz2ejWAgCz8yn8PPbYY3rjjTc0fPhwLVmyRFdffbVuueUWLVu2TNOnT9fVV19d7fe+AAAAgolP4ee9997T3Llzdckll2j9+vXq2bOnKioqtGbNGlkslvoqIwAAgN/4NMnhnj171LdvX0lS9+7dZbPZNHHiRIIPAAAIGT6Fn8rKSrdfbY+IiFBcXJzfCwUAAFBfTmmGZ0+zO0vM8AwAAIKXT+Fn9OjRbl1czO4Mf2DiQQBAQ/Ip/Lz99tv1VAyYGRMPAgAakk/h5+uvv9bdd9+tZcuWyW63u20rKCjQGWecoVmzZumss87yayHRuDHxIIBgQCu0efgUfl566SXddttt1YKPJCUkJGjcuHGaPn064Qc+YeJBAMGAVmjzsBiGYXi7c0ZGhj7//HNlZmZ63L5582aNGDFCu3bt8lsBA6GwsFAJCQkqKCjwGPQAAI0PLT+hz9vrt08tP/v371dkZGTNB4uIUF5eni+HBAAgKNAKbR4+zfPTokULrV+/vsbta9euVVoabxwAABC8fGr5ufDCCzVlyhSdf/75ioqKctt29OhRTZ06VaNGjfJrAYGa0EQNAKgLn8b87N+/X3369FF4eLjuvvtude7cWdKxsT6vvfaaKisrtXr1ajVv3rzeCtwQGPMTGrKzH2dwIgDAxdvrt0/hR5JycnJ05513atGiRap6qMVi0ciRI/Xaa6+pbdu2p1byIED4CQ20/AAAjldv4afK4cOHtW3bNhmGoY4dO6pp06Z1LmywIfwAABoDs31JrJe7vY7XtGlT9e/fv64PBwAA9Yy5izyrc/gJBjk5zyg7+2G1aHGfOnZ8SZJUWVmq7dsf0IED8+V0likxcaQ6dXpdVmtoj0MCAMBXzKDvWciGn8LCFdq79w3FxvZ0W799+0QdOvSJunV7TxERCcrKulvr11+hPn0WB6ikAAAEBnMXeebTPD/BoqKiWJs23aBOnWYrIqLpcesLtHfv39S+/XQ1bTpU8fF91bnzHBUWLlFBwbIAlhgAAASLkGz5ycoar2bNLlJi4nDl5DzpWl9UtEqGUa6mTYe71sXGdpHN1lqFhUuVkDDQ4/GczjI5nWWu5YqKwvorPACgXphtcC/qLuTCz/7981VcvFp9+qyots3h2CeLxarIyCZu663W5nI49tV4zJycaW4DwkpK/FZcAEADYXAvvBVS4ae0dLe2bbtPvXp9ofDwqNof4KWMjIfVqtX9ruXCwkJJrfx2fABA/WNwL7wVUuGnqGiVyssPaOXKPsetrVRBwff69de/qFevRTIMh8rL891afxyO/bJaU2s8bliYTWFhNtdyREjVCgBAYnAvvBdSl/mmTYepX791buu2bLlFMTFd1KrVQ4qKaiWLJVL5+V8pOflKSdKRI1tUVrZLdvugQBQZAAAEmZAKPxER8YqL6+62LiwsVhERzVzr09LGatu2+xURkaiICLuysu6R3T6oxsHOAADAXEIq/HijffsZksK0YcOVrkkOO3Z8PdDFAgAAQaLOv+3VmPHbXgAAhJ56/20voC6YhwMAEGiEHzQo5uEAAAQa4QcNink4AACBRvhBg2IeDgBAoBF+TCjUx92EevkBAIFF+DGhUB93E+rlBwAEFuHHhEJ93E2olx8AEFiEHxMK9XE3oV5+AEBgEX6AGjC2CAAaJ8IPUAPGFgFA40T4AWrA2CIAaJwIPyZBF47vGFsEAI0T4cck6MIBAOAYwo9J0IUDBAatrkDwIfyYBF04QGDQ6goEH8IPANQjWl0Di5Y3eEL4AYB6RKtrYAMILW/whPADAKhXgQwgtLzBE8IPANQRXSreCWQAoeUNnhB+AKCO6FLxDgEEwYbwAwB1RJcKEJoIP2gU6H5AINCiAYQmwg8aBbofAADeIvygUaD7AQDgLcIPGgW6HwAA3goLdAEAAAAaEuEHAACYCt1egAfcPRbcAvX/w/sCaBwIP4AH3D0W3AL1/8P7AmgcLIZhGIEuRLApLCxUQkKCCgoKZLfbA10cBADf8IMbLT8APPH2+k3LD3AcLm6hIVB393FXIdA4EH4QtAIRROjWQEMgZAOBRfgJUWY4eQYiiDBZIhoCIRsILMb8eBAKY36ysx9v9CdPMwQ8NB6+vF95bwP1gzE/jZwZWigYX4FQ4ktrDu9tILAIPyGKkycQXMzwhQTBg9bDU0P4AeAXZj8Z84UEDYlxY6eG8APALzgZAw2HlsZTQ/gB4BecjIGGQ0vjqSH8APALTsYAQgW/6g4AAEyF8AMAAEyFbi8AOAmz38UGNEaEHwA4Ce5iAxofwg8AnAR3sZ06Ws8QbAg/AHAS3MV26mg9a1iEzdoRfgAA9YrWs4ZF2Kwd4QcAUK9oPWtYhM3aEX6AADqV5mmatgF4QtisHeEHDYoLtrtTaZ6maRsA6obwgwbFBdvdqTRP07TtHwRywHwIP2hQdb1gN9YL1Kk0T9dn03ZjrW9PCOSA+RB+0KDqesEO9gtUYwsLwV7f/kQLGmA+FsMwjEAXItgUFhYqISFBBQUFstvtgS4OFPzhIjv78UYVFoK9vgHAE2+v37T8ICQE+90Lja31INjrO5QQJIHgQ/gB/ICwgJqYqQsRCBWEHwCoR42tVRBoDAg/AFCPaBUEgg/hBwhxjCkBAN8QfoAQx5gSmA2BH6cq5MJPTs40HTz4gY4c2aywsGjZ7WeofftnFRPT2bVPZWWptm9/QAcOzJfTWabExJHq1Ol1Wa3NA1hy4OTqekJnTAnMpq6Bn9CEKiE3z8+aNecrJeU62e39ZRgV2rHjEZWUrNfpp29UeHisJGnr1jt16NAn6tLlbUVEJCgr625JYerTZ7FXzxEK8/zwIW58GttcQUB9qev5j89Y4+ft9Tvkws+JHI48LVmSot69v1OTJmeroqJAixcnKzNznlJSrpIklZRs1ooVmTrttKVKSBhY6zFDIfzwIW58CLRA/eIz1viZZpLDiooCSVJERKIkqaholQyjXE2bDnftExvbRTZbaxUWehd+QgFdHY0PdwUB9YvPGKqEdPgxDKe2bZsgu32w4uK6S5Icjn2yWKyKjGzitq/V2lwOxz6Px3E6y+R0lrmWKyoK663M/sKHuH7wzRChgvcqUHchHX6yssarpGS9Tjvtx1M6Tk7ONLcupJKSUy0ZQhV3TiFU8F4F6i5kw8/WrXfr0KGP1bv394qKaulab7WmyjAcKi/Pd2v9cTj2y2pN9XisjIyH1arV/a7lwsJCSa3qq+h1xje9+kd3IkIF71X/4LxqTiEXfgzDUFbWPTp4cKF69/5W0dFt3bbHx/eVxRKp/PyvlJx8pSTpyJEtKivbJbt9kMdjhoXZFBZmcy1HBGmt8E2v/tGdiFDBe9U/OK+aU5Be5muWlTVe+/fPU48e/1F4eLzKyo6N44mISFB4eLQiIhKUljZW27bdr4iIREVE2JWVdY/s9kEhP9iZb3oIdqH6LTpUy41Tx3nVnEIu/OTmzpQk/fLLOW7rO3eeo7S0myVJ7dvPkBSmDRuudE1y2LHj6w1b0HrANz3UJtAX8VD9Fh2q5cap47xqTiE/z099CIV5fgBPAj3/U6DDV12FarkBuDPNPD8A/k+gm/BD9Vt0qJYbQN0QfuoZ3yh9Q32dGi7ivIcA1I7wU88YS+Ab6qvxq+9wwnsIQG0Y8+OBP8f88C3UN9RX41HT/+Wvv76hffverPFxpxpOeA/BV7xnGg/G/AQJuiF8Q301HrW1wKSl3a709HHV1p/quCTeQ/AVrYXmQ8uPB9ztBVTn67djvk0jVPBebTxo+QHgV75+O66tBaasbK+KilbXuJ0LDhoKrYXmQ/gB4JX09HGy2wepouKgx+2RkUkqK9vr9UWErgZ3tD4ADYfwA8ArNluaXwNLoOckCjaEQaDhMObHA8b8AJ7ROlF/qFvg1DHmB6bABaNhMTai/lC3QMMh/CCk0VUAAPAV4QchjXEjNatrq1ggW9PM0JJnhtcIBDvCD0IaXQU1q2urWCBb08zQkmeG1wgEOwY8e8CAZzQGtPwE53PS8gPUHwY8hwBOgv5Ffbqra6tYIFvTAvHcDd0SQ2slEHiEnwCi+du/qE/UBePGAPOh28uDhur2oqXCv6hP1DfeY7WjjhBIdHuFAJq//as+6zPUT+ihXv5gQeti7agjhALCD+CF2k7oLVrcr9TUG2rcHuhwwQXJP+giq+7EYJ2QMEiZmf9wLUdEJMlqTXYtm7GOEHzo9vKAu71wotpaTvbvf1d79kyvcXugw4XZ7uBCw8nOfpxgjaBBtxcaLV8vpv64+NbWpWa1pql585O3/ARSILtYaXVq3GgNQygi/CDk+HoxbYiLL+O3ahZKF0daqXzHex+hiG4vD+j2ani+XHQC0fIDc6ALBwhtdHshpPjSOuPrN81g+2ZKGAteodRKBaDuCD8ICma66DAGJnh5E5QJr0DoI/wgKARb64xUfxc5MwW9xojwCoQ+wg9Qg/q6yAVj0IP3CK9A6CP8ADXgIgdPCK9A6CP8wG8a21iIxnSRa2z/NwBwKgg/8BvGQgQv/m8QjAjlCBTCD/yGbiL/8fdFgf8bBCNCOQKF8AO/aUzdRIHm74sC/zcIRoRyBArhB16jibrhcFGAGRDKESiEH3gtGJqozRLAarooVL3+qr8TNZbXDwD1ifADrwWiNeLEsJOb+4b27n2zxv0b+xiBYAigABDqCD8m50tLSiCaqGu72Kem3q4WLca5lht7dxDdYQBw6gg/JudLS0Igupy8udibqZuHMRIAcOoIPybnS0tCILpcuNgDAPyN8GNyvoQLulwAAI0B4QdeoxUGANAYhAW6AAAAAA2J8AMAAEyF8AMAAEyFMT9ByCyzGAMAEAiEnyDELL4AANQfwk8Q4pZyAADqD+EnCHFLOQAA9YcBzwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFQIPwAAwFT4VXcPDMOQJBUWFga4JAAAwFtV1+2q63hNCD8eFBUVSZJatWoV4JIAAABfFRUVKSEhocbtFqO2eGRCTqdTubm5io+Pl8ViCXRx3FRUFGrp0lYaNGi3IiLsgS5OSKDOfEed+Y468x115jvq7OQMw1BRUZHS09MVFlbzyB5afjwICwtTy5YtA10MjyoqpNhYyW6388b3EnXmO+rMd9SZ76gz31FntTtZi08VBjwDAABTIfwAAABTIfyEmLAwmzIypioszBboooQM6sx31JnvqDPfUWe+o878gwHPAADAVGj5AQAApkL4AQAApkL4AQAApkL4AQAApsIkh0EqO/tx5eQ84bYuOrqzBgzYLEmqrCzV9u0P6MCB+XI6y5SYOFKdOr0uq7V5IIobEPn532v37udVVLRKDsdedeu2UMnJl7m2G4ahnTunau/e2aqoyJfdPlidOs1UTExH1z7l5b8pK+seHTr0kaQwJSdfqQ4dXlZERFzDv6AGUFudbdp0s/bvf8ftMU2bjlSvXp+7ls1UZzk503Tw4Ac6cmSzwsKiZbefofbtn1VMTGfXPt58FktLd2nr1juVn/+NwsPjlJo6Rm3bTlNYWOM7BXtTZz//fI4KCr5ze1xa2jh17jzLtWymOvv115nKzZ2p0tKdkqTY2G7KyHhMzZpdIIn3WH2gVoJYTEw39er1pWvZYvm//67t2yfq0KFP1K3be4qISFBW1t1av/4K9emzOBBFDYjKyhLFxvZSauqt2rDhimrbd+9+Tnv2vKLMzHcUFdVW2dlTtHbtSPXvv1Hh4VGSpE2bblBZ2V716vWFnM5ybdlyi7ZuvV1du85r6JfTIGqrM0lKTDxfnTvPcS2feEutmeosP/87paePl93eX4ZRoR07HtGaNSN0+ukbFR4eK6n2z6JhVGrduotktabqtNOWyOHYq82bR8tiiVS7dk8H8uXVC2/qTJLS0m5TmzZ/ci2Hh8e4/m22OrPZWqpdu2cUHd1RkqF9+97R+vWXql+/nxUb2433WH0wEJR27Jhq/PRTL4/bysvzjW+/jTT273/Pta64eJPxzTcy8vOXNlAJg8s338g4cGCha9npdBqLF6caOTnPu9YdqzebsW/fPw3DMIzi4o3GN9/IKChY4drn4MHPjG++sRilpb82WNkD5cQ6MwzD2LhxjLF27aU1PsbsdVZWdsD45hsZhw9/ZxiGd5/Fgwc/Nb75JswoK9vn2mfPnpnG99/bjcrKsoZ9AQFwYp0ZhmGsXj3E2Lr1vhofY/Y6MwzD+OGHpkZu7l95j9UTxvwEsaNHs7RkSbqWLWunjRtvUGnpLklSUdEqGUa5mjYd7to3NraLbLbWKixcGqjiBpXS0mw5HPvc6igiIkF2+wBXHRUWLlVERBPZ7f1c+xzbP0yFhcsbushBIz//Wy1enKLlyztr69Y7VV5+yLXN7HVWUVEgSYqISJTk3WexsHCpYmN7uHVRJCaOVGVloUpKNjRg6QPjxDqrcuDAu/rxxyT99FN37djxsCorj7i2mbnODKNS+/fPV2Vliez2QbzH6gndXkHKbh+gLl3eVkxMZzkce7Vz5xP6+eez1L//ejkc+2SxWBUZ2cTtMVZrczkc+wJT4CBTVQ8njoE6vo4cjn2KjExx2x4WFqHIyETT1mNi4vlKTr5CUVFtdfTodmVnP6K1ay9Qnz5LZbGEm7rODMOpbdsmyG4frLi47pLk1WfR4djn8X1Yta0x81RnktS8+fWKisqQ1ZqukpK12r79IR05skXdu38gyZx1Vly8TqtXD5LTWarw8Dh1775QsbFdVVz8C++xekD4CVJVA92O6an4+AFatixDeXkLFBYWHbByoXFr3vw617/j4nooLq6nli9vr/z8b9W06bAAlizwsrLGq6RkvU477cdAFyVk1FRn6em3u/4dF9dDVmua1qwZpqNHtys6un1DFzMoxMR0Vr9+v6iyskB5ee9r8+Yx6t37u9ofiDqh2ytEREY2UUxMJx09uk1Wa6oMw6Hy8ny3fRyO/bJaUwNTwCBTVQ8Ox3639cfXkdWaqvLyA27bnc4KlZf/Rj3+f9HR7RQZmaSjR7dJMm+dbd16tw4d+li9e3+jqKiWrvXefBat1lSP78OqbY1VTXXmid0+QJLc3mdmq7OwMKtiYjooPr6v2rWbptjYXtqz52XeY/WE8BMiKiqKdfTodlmtaYqP7yuLJVL5+V+5th85skVlZbtktw8KYCmDR1RUW1mtqW51VFFRqMLC5a46stsHqaIiX0VFq1z75Od/LcnpOhmbXWnpHpWXH5LVmibJfHVmGIa2br1bBw8uVK9eXys6uq3bdm8+i3b7IJWUrJPD8X+h8fDhLxQebldsbNeGeSENqLY686S4+BdJcnufmanOPHPK6SzjPVZP6PYKUtu2PaikpItls2XI4cjVzp1TZbGEKyXld4qISFBa2lht23a/IiISFRFhV1bWPbLbBykhYWCgi95gjgXCba7l0tJsFRX9osjIREVFtVbLlhOUk/OkoqM7um51t9nSlZR0mSQpNjZTiYnna8uW29Sp0ywZRrmysu5WSsp1stnSA/Sq6tfJ6iwiIlE5OU8oKelKWa2pKi3dru3bJyk6uoMSE0dKMl+dZWWN1/7989Sjx38UHh6vsrJj4yciIhIUHh7t1WcxMXGEYmO7atOmm9S+/XNyOPYpO/tRtWgxvlH+MndtdXb06Hbt3z9PzZpdqIiIZiopWatt2yYqIeFsxcX1lGS+Otux42ElJl4gm621KiuLdODAPOXnf6uePRfxHqsn/Kp7kNqw4ToVFHyv8vJDioxMVkLCmWrX7ilXf/j/TXr1T9ekVx07vi6bzTxNnIcPf6s1a86ttr558zHKzHzbNclhbu6bqqjIV0LCmerU6XXFxHRy7Xtswr67T5iw75VGOWGfdPI669Rpptavv0zFxT+roiJfVmu6EhNHqG3bP7sNpjRTnX37rcXj+s6d5ygt7WZJ3n0WS0tz/v8EdN8qPDxWzZuPUbt2zzTKCehqq7PS0t3atOlGlZSsV2VliaKiWikp6XJlZDyqiAi7a38z1dnmzWN1+PBXcjj2KiIiQbGxPdW69UNKTDxPEu+x+kD4AQAApsKYHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwAAYCqEHwCmd84552jChAn1tn99HweAbwg/ALy2b98+3XPPPWrXrp1sNptatWqliy++WF999VXtDw4AwgUAT/jFMwBe2blzpwYPHqwmTZro+eefV48ePVReXq5FixZp/Pjx2rx5c52O63A4ZLVaa10HAP5Cyw8Ar9x1112yWCz66aefdOWVV6pTp07q1q2b7r//fi1btkySVFZWpnvvvVcpKSmKiorSmWeeqRUrVrgd55xzztHdd9+tCRMmKCkpSSNHjvS4TpKcTqemTZumtm3bKjo6Wr169dL777/vdjyn06nnnntOHTp0kM1mU+vWrfXUU0/p5ptv1nfffaeXX35ZFotFFotFO3fu9Oq1fv755zrzzDPVpEkTNWvWTKNGjdL27dvd9qmoqNDdd9+thIQEJSUlacqUKTr+d6K9KXttWrZsqddff91t3ZIlSxQTE6OcnByfjgXg/xB+ANTqt99+0+eff67x48crNja22vYmTZpIkiZNmqR///vfeuedd7R69Wp16NBBI0eO1G+//ea2/zvvvCOr1arFixdr1qxZNa6bNm2a5s6dq1mzZmnDhg2aOHGibrzxRn333XeuYz388MN65plnNGXKFG3cuFHz5s1T8+bN9fLLL2vQoEG67bbbtHfvXu3du1etWrXy6vWWlJTo/vvv18qVK/XVV18pLCxMl19+uZxOp9triIiI0E8//aSXX35Z06dP11//+lfXdm/KXpsBAwa4hUfDMDRhwgRNnDhRGRkZXh8HwAkMAKjF8uXLDUnGBx98UOM+xcXFRmRkpPHuu++61jkcDiM9Pd147rnnXOuGDBlinHbaaW6P9bSutLTUiImJMZYsWeK2fuzYscbvfvc7wzAMo7Cw0LDZbMbs2bM9lmnIkCHGfffdV+vrq22/vLw8Q5Kxbt061/6ZmZmG0+l07fPQQw8ZmZmZXpfdm+d97rnnjG7durmW33nnHSM1NdUoKioyDMMwvvrqK+OFF16o9fUBcMeYHwC1Mo7rzqnJ9u3bVV5ersGDB7vWRUZG6vTTT9emTZvc9u3bt2+1x5+4btu2bTpy5IjOO+88t/UOh0OnnXaaJGnTpk0qKyvTsGHDvH4t3sjKytJjjz2m5cuX6+DBg64Wn127dql79+6SpIEDB8pisbgeM2jQIL344ouqrKz0quzeGDhwoCZPnqzi4mJZLBY98sgjevLJJxUXFydJGjp0qIYOHXqqLxcwHcIPgFp17NhRFoulzoOaT+Sp6+zEdcXFxZKkTz75RC1atHDbZrPZJEnR0dF+Kc+JLr74YmVkZGj27NlKT0+X0+lU9+7d5XA4vHq8N2X3Rt++fRUWFqbVq1fryy+/VHJysm655RbX9ksuuURPPfWUevTo4fUxATDmB4AXEhMTNXLkSL322msqKSmptj0/P1/t27d3jdmpUl5erhUrVqhr164+P2fXrl1ls9m0a9cudejQwe2vauxOx44dFR0dXeOt9larVZWVlT4976FDh7RlyxY9+uijGjZsmDIzM3X48OFq+y1fvtxtedmyZerYsaPCw8O9Krs3YmJi1KNHD/373//WCy+8oBkzZigs7P9O25s3b1aXLl18en0AaPkB4KXXXntNgwcP1umnn64//elP6tmzpyoqKvTFF19o5syZ2rRpk+6880794Q9/UGJiolq3bq3nnntOR44c0dixY31+vvj4eD344IOaOHGinE6nzjzzTBUUFGjx4sWy2+0aM2aMoqKi9NBDD2nSpEmyWq0aPHiw8vLytGHDBo0dO1Zt2rTR8uXLtXPnTsXFxSkxMdEtPHjStGlTNWvWTG+++abS0tK0a9cuTZ48udp+u3bt0v33369x48Zp9erVevXVV/Xiiy96XXZvDRw4UK+++qouvfRSnXPOOa71RUVFioqKUmRkpNfHAnAM4QeAV9q1a6fVq1frqaee0gMPPKC9e/cqOTlZffv21cyZMyVJzzzzjJxOp2666SYVFRWpX79+WrRokZo2bVqn5/zzn/+s5ORkTZs2TTt27FCTJk3Up08fPfLII659pkyZooiICD322GPKzc1VWlqa7rjjDknSgw8+qDFjxqhr1646evSosrOz1aZNm5M+Z1hYmObPn697771X3bt3V+fOnfXKK6+4BQ9JGj16tI4eParTTz9d4eHhuu+++3T77bf7VHZv9OrVS5GRkXr++efd1m/YsEHdunXz6VgAjrEY3oxkBAAExLnnnqs+ffq4WpWqzJ49W3l5eT6HKQC0/ABA0HE6ncrLy9Pf/vY3ZWVl6T//+U+1fdatW6fhw4cHoHRA6KPlBwCCzLfffquhQ4eqS5cumjNnjgYMGBDoIgGNCuEHAACYCre6AwAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAUyH8AAAAU/l/gv+BxXCV8W8AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_loss\n", "\n", "crps_metric = CRPS()\n", "plot_crossplot_loss(y_test, y_pred_proba, crps_metric)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4 `skpro` objects - `scikit-base` interface, searching for regressors and metrics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* `skpro` objects - `skbase` interface points `get_tags`, `get_params`/`set_params`\n", "* searching estimators and metrics via `all_objects`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4.1 primer on `skpro` object interface " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "metrics and estimators are first-class citizens in `skpro`, with a `scikit-base` compatible interface" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# example object 1: CRPS metric\n", "from skpro.metrics import CRPS\n", "\n", "crps_metric = CRPS()\n", "\n", "# example object 2: ResidualDouble regressor\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.linear_model import LinearRegression\n", "\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "reg_mean = LinearRegression()\n", "reg_resid = RandomForestRegressor()\n", "reg_proba = ResidualDouble(reg_mean, reg_resid)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "e.g., all have `get_tags` interface" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'estimator_type': 'estimator',\n", " 'object_type': 'metric',\n", " 'reserved_params': ['multioutput', 'score_average'],\n", " 'scitype:y_pred': 'pred_proba',\n", " 'lower_is_better': True}" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crps_metric.get_tags()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'estimator_type': 'regressor_proba',\n", " 'object_type': 'regressor_proba',\n", " 'capability:multioutput': False,\n", " 'capability:missing': True}" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reg_proba.get_tags()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the tag `object_type` indicates the type of object, e.g., metric or proba regressor" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "all objects also have the `get_params`/`set_params` interface known from `scikit-learn`\n", "\n", "= reading or setting hyper-parameters\n", "\n", "`get_params` returns `dict` `{paramname: paramvalue}`; `set_params` writes it" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'multioutput': 'uniform_average', 'multivariate': False}" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crps_metric.get_params()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "composite objects have the nested param interface, keys `componentname__paramname`" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
ResidualDouble(estimator=LinearRegression(),\n",
       "               estimator_resid=RandomForestRegressor())
Please rerun this cell to show the HTML repr or trust the notebook.
" ], "text/plain": [ "ResidualDouble(estimator=LinearRegression(),\n", " estimator_resid=RandomForestRegressor())" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# note that reg_proba has components LinearRegression and RandomForestaregressor\n", "# each with their own parameters\n", "reg_proba" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "so `reg_proba` will have parameters coming from itself and either component:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'cv': None,\n", " 'distr_loc_scale_name': None,\n", " 'distr_params': None,\n", " 'distr_type': 'Normal',\n", " 'estimator': LinearRegression(),\n", " 'estimator_resid': RandomForestRegressor(),\n", " 'min_scale': 1e-10,\n", " 'residual_trafo': 'absolute',\n", " 'use_y_pred': False,\n", " 'estimator__copy_X': True,\n", " 'estimator__fit_intercept': True,\n", " 'estimator__n_jobs': None,\n", " 'estimator__normalize': 'deprecated',\n", " 'estimator__positive': False,\n", " 'estimator_resid__bootstrap': True,\n", " 'estimator_resid__ccp_alpha': 0.0,\n", " 'estimator_resid__criterion': 'squared_error',\n", " 'estimator_resid__max_depth': None,\n", " 'estimator_resid__max_features': 1.0,\n", " 'estimator_resid__max_leaf_nodes': None,\n", " 'estimator_resid__max_samples': None,\n", " 'estimator_resid__min_impurity_decrease': 0.0,\n", " 'estimator_resid__min_samples_leaf': 1,\n", " 'estimator_resid__min_samples_split': 2,\n", " 'estimator_resid__min_weight_fraction_leaf': 0.0,\n", " 'estimator_resid__n_estimators': 100,\n", " 'estimator_resid__n_jobs': None,\n", " 'estimator_resid__oob_score': False,\n", " 'estimator_resid__random_state': None,\n", " 'estimator_resid__verbose': 0,\n", " 'estimator_resid__warm_start': False}" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reg_proba.get_params()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "further common interface points are `get_config`, `set_config`, and `get_fitted_params` (only fittable estimators)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4.2 searching for regressors and metrics " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as first-class citizens, all objects in `skpro` are indexed via the `registry` utility `all_objects`.\n", "\n", "To find probabilistic supervised regressors, use `all_objects` with the type `regressor_proba`:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameobject
0BaggingRegressor<class 'skpro.regression.ensemble.BaggingRegre...
1BootstrapRegressor<class 'skpro.regression.bootstrap.BootstrapRe...
2GridSearchCV<class 'skpro.model_selection._tuning.GridSear...
3Pipeline<class 'skpro.regression.compose._pipeline.Pip...
4RandomizedSearchCV<class 'skpro.model_selection._tuning.Randomiz...
\n", "
" ], "text/plain": [ " name object\n", "0 BaggingRegressor \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameobjectscitype:y_pred
0CRPS<class 'skpro.metrics._classes.CRPS'>pred_proba
1ConstraintViolation<class 'skpro.metrics._classes.ConstraintViola...pred_interval
2EmpiricalCoverage<class 'skpro.metrics._classes.EmpiricalCovera...pred_interval
3LinearizedLogLoss<class 'skpro.metrics._classes.LinearizedLogLo...pred_proba
4LogLoss<class 'skpro.metrics._classes.LogLoss'>pred_proba
5PinballLoss<class 'skpro.metrics._classes.PinballLoss'>pred_quantiles
6SquaredDistrLoss<class 'skpro.metrics._classes.SquaredDistrLoss'>pred_proba
\n", "" ], "text/plain": [ " name object \\\n", "0 CRPS \n", "1 ConstraintViolation \n", "5 PinballLoss \n", "6 SquaredDistrLoss \n", "\n", " scitype:y_pred \n", "0 pred_proba \n", "1 pred_interval \n", "2 pred_interval \n", "3 pred_proba \n", "4 pred_proba \n", "5 pred_quantiles \n", "6 pred_proba " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from skpro.registry import all_objects\n", "\n", "all_objects(\"metric\", as_dataframe=True, return_tags=\"scitype:y_pred\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "all tags can be printed by the `all_tags` utility:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namescitypetypedescription
0lower_is_bettermetricboolwhether lower (True) or higher (False) is better
1scitype:y_predmetricstrexpected input type for y_pred in performance ...
\n", "
" ], "text/plain": [ " name scitype type \\\n", "0 lower_is_better metric bool \n", "1 scitype:y_pred metric str \n", "\n", " description \n", "0 whether lower (True) or higher (False) is better \n", "1 expected input type for y_pred in performance ... " ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# all tags applicable to metrics\n", "from skpro.registry import all_tags\n", "\n", "all_tags(\"metric\", as_dataframe=True)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namescitypetypedescription
0capability:missingregressor_probaboolwhether estimator supports missing values
1capability:multioutputregressor_probaboolwhether estimator supports multioutput regression
\n", "
" ], "text/plain": [ " name scitype type \\\n", "0 capability:missing regressor_proba bool \n", "1 capability:multioutput regressor_proba bool \n", "\n", " description \n", "0 whether estimator supports missing values \n", "1 whether estimator supports multioutput regression " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# all tags applicable to probabilistic regressors\n", "from skpro.registry import all_tags\n", "\n", "all_tags(\"regressor_proba\", as_dataframe=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "filtering in search can be done with the `filter_tags` argument in `all_objects`, see docstring:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameobject
0CRPS<class 'skpro.metrics._classes.CRPS'>
1LinearizedLogLoss<class 'skpro.metrics._classes.LinearizedLogLo...
2LogLoss<class 'skpro.metrics._classes.LogLoss'>
3SquaredDistrLoss<class 'skpro.metrics._classes.SquaredDistrLoss'>
\n", "
" ], "text/plain": [ " name object\n", "0 CRPS \n", "1 LinearizedLogLoss \n", "3 SquaredDistrLoss " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from skpro.registry import all_objects\n", "\n", "# \"retrieve all genuinely probabilistic loss functions\"\n", "all_objects(\"metric\", as_dataframe=True, filter_tags={\"scitype:y_pred\": \"pred_proba\"})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Prediction types, metrics, benchmarking " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This section gives more details on:\n", "\n", "* different prediction types, including a methodological primer\n", "* the API of metrics to compare probabilistic predictions to non-probabilistic actuals\n", "* utilities for batch benchmarking of estimators and metrics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 Probabilistic predictions - methodological primer " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**readers familir with, or less interested in theory, may like to skip section 2.1**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In supervised learning - probabilistic or not:\n", "\n", "* we fit estimator to i.i.d samples $(X_1, Y_1), \\dots, (X_N, Y_N) \\sim (X_*, Y_*)$\n", "* and want to predict $y$ given $x$ accurately, for $(x, y) \\sim (X_*, Y_*)$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $y$ be the (true) value, for an observed feature $x$\n", "\n", "(we consider $y$ a random variable)\n", "\n", "| Name | param | prediction/estimate of | `skpro` |\n", "| ---- | ----- | ---------------------- | -------- |\n", "| point prediction | | conditional expectation $\\mathbb{E}[y\\|x]$ | `predict` |\n", "| variance prediction | | conditional variance $Var[y\\|x]$ | `predict_var` |\n", "| quantile prediction | $\\alpha\\in (0,1)$ | $\\alpha$-quantile of $y\\|x$ | `predict_quantiles` |\n", "| interval prediction | $c\\in (0,1)$| $[a,b]$ s.t. $P(a\\le y \\le b\\| x) = c$ | `predict_interval` |\n", "| distribution prediction | | the law/distribution of $y\\|x$ | `predict_proba` |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### More formal details & intuition:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "let's consider the toy example again" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_new, y_train, _ = train_test_split(X, y)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.model_selection import train_test_split\n", "\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_new, y_train, _ = train_test_split(X, y)\n", "\n", "\n", "reg_mean = RandomForestRegressor()\n", "reg_proba = ResidualDouble(reg_mean)\n", "\n", "reg_proba.fit(X_train, y_train)\n", "y_pred_proba = reg_proba.predict_proba(X_new)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* a **\"point prediction\"** is a prediction/estimate of the conditional expectation $\\mathbb{E}[y|x]$.\\\n", " **Intuition**: \"out of many repetitions/worlds, this value is the arithmetic average of all observations\"." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
421216.595619
81122.436986
326147.317343
10598.226950
416171.539410
\n", "
" ], "text/plain": [ " target\n", "421 216.595619\n", "81 122.436986\n", "326 147.317343\n", "105 98.226950\n", "416 171.539410" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# if y_pred_proba were *true*, here's how many repetitions would look like:\n", "\n", "# repeating this line is \"one repetition\"\n", "y_pred_proba.sample().head()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0421174.503233
81128.299773
326174.547102
10585.523671
416166.025376
.........
99399208.666436
109188.566325
2276.930673
174156.354496
10696.456699
\n", "

11100 rows × 1 columns

\n", "
" ], "text/plain": [ " target\n", "0 421 174.503233\n", " 81 128.299773\n", " 326 174.547102\n", " 105 85.523671\n", " 416 166.025376\n", "... ...\n", "99 399 208.666436\n", " 109 188.566325\n", " 22 76.930673\n", " 174 156.354496\n", " 106 96.456699\n", "\n", "[11100 rows x 1 columns]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "many_samples = y_pred_proba.sample(100)\n", "many_samples" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
421213.432031
81126.286757
326173.065740
105100.126654
416178.876668
\n", "
" ], "text/plain": [ " target\n", "421 213.432031\n", "81 126.286757\n", "326 173.065740\n", "105 100.126654\n", "416 178.876668" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# \"doing many times and taking the mean\" -> usual point prediction\n", "mean_prediction = many_samples.groupby(level=1, sort=False).mean()\n", "mean_prediction.head()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
421213.57
81122.14
326172.48
10598.97
416180.31
\n", "
" ], "text/plain": [ " target\n", "421 213.57\n", "81 122.14\n", "326 172.48\n", "105 98.97\n", "416 180.31" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# if we would do this infinity times instead of 100:\n", "y_pred_proba.mean().head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* a **\"variance prediction\"** is a prediction/estimate of the conditional expectation $Var[y|x]$.\\\n", " **Intuition:** \"out of many repetitions/worlds, this value is the average squared distance of the observation to the perfect point prediction\".\n" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
421237.798822
81262.881415
326275.523556
105401.240249
416267.851337
\n", "
" ], "text/plain": [ " target\n", "421 237.798822\n", "81 262.881415\n", "326 275.523556\n", "105 401.240249\n", "416 267.851337" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# same as above - take many samples, and then compute element-wise statistics\n", "var_prediction = many_samples.groupby(level=1, sort=False).var()\n", "var_prediction.head()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
421289.154099
81289.154099
326289.154099
105289.154099
416289.154099
\n", "
" ], "text/plain": [ " target\n", "421 289.154099\n", "81 289.154099\n", "326 289.154099\n", "105 289.154099\n", "416 289.154099" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# e.g., predict_var should give the same result as infinite large sample's variance\n", "y_pred_proba.var().head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* a **\"quantile prediction\"**, at quantile point $\\alpha\\in (0,1)$ is a prediction/estimate of the $\\alpha$-quantile of $y'|y$, i.e., of $F^{-1}_{y|x}(\\alpha)$, where $F^{-1}$ is the (generalized) inverse cdf = quantile function of the random variable y|x.\\\n", " **Intuition**: \"out of many repetitions/worlds, a fraction of exactly $\\alpha$ will have equal or smaller than this value.\"\n", "* an **\"interval prediction\"** or \"predictive interval\" with (symmetric) coverage $c\\in (0,1)$ is a prediction/estimate pair of lower bound $a$ and upper bound $b$ such that $P(a\\le y \\le b| x) = c$ and $P(y \\gneq b| x) = P(y \\lneq a| x) = (1 - c) /2$.\\\n", " **Intuition**: \"out of many repetitions/worlds, a fraction of exactly $c$ will be contained in the interval $[a,b]$, and being above is equally likely as being below\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(similar - exercise left to the reader)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* a **\"distribution prediction\"** or \"full probabilistic prediction\" is a prediction/estimate of the distribution of $y|x$, e.g., \"it's a normal distribution with mean 42 and variance 1\".\\\n", "**Intuition**: exhaustive description of the generating mechanism of many repetitions/worlds." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "note: the true distribution is unknown, and not accessible easily!\n", "\n", "`y_pred_proba` is a distribution, but in general not equal to the true one!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "that is, there are:\n", "\n", "* *true* distribution `y_pred_proba_true` - unknown and unknowable but estimable\n", "* `y_pred_proba` - our guess at `y_pred_proba_true`\n", "* the actual data `y_true` is *one* `y_pred_proba_true.sample()`\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* `predict` produces guess of `y_pred_proba_true.mean()`\n", "* `predict_var` produces guess of `y_pred_proba_true.var()`\n", "* `predict_quantiles([0.05, 0.5, 0.95])` produces guess of `y_pred_proba_true.quantiles([0.05, 0.5, 0.95])`\n", "* `predict_proba` produces guess of `y_pred_proba_true`\n", "\n", "the guesses are algorithm specific, and some algorithms are more accurate than others, given data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 probabilistic metrics - details " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "General usage pattern same as for `sklearn` metrics:\n", "\n", "1. get some actuals and predictions\n", "2. specify the metric - similar to estimator specs\n", "3. plug the actuals and predictions into metric to get metric values\n", "\n", "*but*: need to use dedicated metric for probabilistic predictions\n", "\n", "* ground truth: `y_true` samples\n", "* prediction e.g., `y_predict_proba`, `y_predict_interval`\n", "* so, match metric with type of prediction!\n", " * `metric(y_true: 2D pd.DataFrame, y_pred: proba_prediction_type) -> float`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall methods available for all probabilistic regressors:\n", "\n", "- `predict_interval` produces interval predictions.\n", " Argument `coverage` (nominal interval coverage) must be provided.\n", "- `predict_quantiles` produces quantile predictions.\n", " Argument `alpha` (quantile values) must be provided.\n", "- `predict_var` produces variance predictions. Same args as `predict`.\n", "- `predict_proba` produces full distributional predictions. Same args as `predict`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Name | param | prediction/estimate of | `skpro` |\n", "| ---- | ----- | ---------------------- | -------- |\n", "| point prediction | | conditional expectation $\\mathbb{E}[y\\|x]$ | `predict` |\n", "| variance prediction | | conditional variance $Var[y\\|x]$ | `predict_var` |\n", "| quantile prediction | $\\alpha\\in (0,1)$ | $\\alpha$-quantile of $y\\|x$ | `predict_quantiles` |\n", "| interval prediction | $c\\in (0,1)$| $[a,b]$ s.t. $P(a\\le y \\le b\\| x) = c$ | `predict_interval` |\n", "| distribution prediction | | the law/distribution of $y\\|x$ | `predict_proba` |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "let's produce some probabilistic predictions!" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "# 1. get some actuals and predictions\n", "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", "# actuals = y_test" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "reg_mean = RandomForestRegressor()\n", "reg_proba = ResidualDouble(reg_mean)\n", "\n", "reg_proba.fit(X_train, y_train)\n", "\n", "# use any of the probabilistic methods, we have seen this\n", "y_pred_int = reg_proba.predict_interval(X_test, coverage=0.95)\n", "y_pred_q = reg_proba.predict_quantiles(X_test, alpha=[0.05, 0.95])\n", "y_pred_proba = reg_proba.predict_proba(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "recall, all have their own output format:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0.95
lowerupper
104112.79411180.58589
33463.02411130.81589
271116.11411183.90589
342155.14411222.93589
24351.14411118.93589
.........
979.16411146.95589
4686.54411154.33589
154136.21411204.00589
402133.12411200.91589
284145.72411213.51589
\n", "

111 rows × 2 columns

\n", "
" ], "text/plain": [ " target \n", " 0.95 \n", " lower upper\n", "104 112.79411 180.58589\n", "334 63.02411 130.81589\n", "271 116.11411 183.90589\n", "342 155.14411 222.93589\n", "243 51.14411 118.93589\n", ".. ... ...\n", "9 79.16411 146.95589\n", "46 86.54411 154.33589\n", "154 136.21411 204.00589\n", "402 133.12411 200.91589\n", "284 145.72411 213.51589\n", "\n", "[111 rows x 2 columns]" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_int # lower/upper intervals" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
0.050.95
104118.243673175.136327
33468.473673125.366327
271121.563673178.456327
342160.593673217.486327
24356.593673113.486327
.........
984.613673141.506327
4691.993673148.886327
154141.663673198.556327
402138.573673195.466327
284151.173673208.066327
\n", "

111 rows × 2 columns

\n", "
" ], "text/plain": [ " target \n", " 0.05 0.95\n", "104 118.243673 175.136327\n", "334 68.473673 125.366327\n", "271 121.563673 178.456327\n", "342 160.593673 217.486327\n", "243 56.593673 113.486327\n", ".. ... ...\n", "9 84.613673 141.506327\n", "46 91.993673 148.886327\n", "154 141.663673 198.556327\n", "402 138.573673 195.466327\n", "284 151.173673 208.066327\n", "\n", "[111 rows x 2 columns]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_q # quantiles" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Normal(columns=Index(['target'], dtype='object'),\n",
       "       index=Index([104, 334, 271, 342, 243, 120, 183, 333, 315, 357,\n",
       "       ...\n",
       "       313, 111, 137, 198, 413,   9,  46, 154, 402, 284],\n",
       "      dtype='int64', length=111),\n",
       "       mu=array([[146.69],\n",
       "       [ 96.92],\n",
       "       [150.01],\n",
       "       [189.04],\n",
       "       [ 85.04],\n",
       "       [ 91.04],\n",
       "       [202.31],\n",
       "       [226.03],\n",
       "       [ 90.7 ],\n",
       "       [153.92],\n",
       "       [263.72],\n",
       "       [139.12],\n",
       "       [ 81.82],\n",
       "       [138.16],\n",
       "       [144.98],\n",
       "       [ 90.28],\n",
       "       [229.32],\n",
       "       [200.46],\n",
       "       [ 83.39],\n",
       "       [196.02],...\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897],\n",
       "       [17.29413897]]))
Please rerun this cell to show the HTML repr or trust the notebook.
" ], "text/plain": [ "Normal(columns=Index(['target'], dtype='object'),\n", " index=Index([104, 334, 271, 342, 243, 120, 183, 333, 315, 357,\n", " ...\n", " 313, 111, 137, 198, 413, 9, 46, 154, 402, 284],\n", " dtype='int64', length=111),\n", " mu=array([[146.69],\n", " [ 96.92],\n", " [150.01],\n", " [189.04],\n", " [ 85.04],\n", " [ 91.04],\n", " [202.31],\n", " [226.03],\n", " [ 90.7 ],\n", " [153.92],\n", " [263.72],\n", " [139.12],\n", " [ 81.82],\n", " [138.16],\n", " [144.98],\n", " [ 90.28],\n", " [229.32],\n", " [200.46],\n", " [ 83.39],\n", " [196.02],...\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897],\n", " [17.29413897]]))" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred_proba # sktime/skpro BaseDistribution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we now need to apply a suitable metric, `metric(y_test, y_pred)`\n", "\n", "IMPORTANT: sequence matters, `y_test` first; `y_pred` has very different type!" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "40.363339883507926" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 2. specify metric\n", "# CRPS = continuous ranked probability score, for distribution predictions\n", "from skpro.metrics import CRPS\n", "\n", "crps = CRPS()\n", "\n", "# 3. evaluate metric\n", "crps(y_test, y_pred_proba)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "how do we find a metric that fits the prediction type?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "answer: metrics are tagged\n", "\n", "important tag: `scitype:y_pred`\n", "\n", "* `\"pred_proba\"` - distributional, can applied to distributions, `predict_proba` output\n", "* `\"pred_quantiles\"` - quantile forecast metric, can be applied to quantile predictions, interval predictions, distributional predictions\n", " * applicable to `predict_quantiles`, `predict_interval`, `predict_proba` outputs\n", "* `\"pred_interval\"` - interval forecast metric, can be applied to interval predictions, distributional predictions\n", " * applicable to `predict_interval`, `predict_proba` outputs" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'estimator_type': 'estimator',\n", " 'object_type': 'metric',\n", " 'reserved_params': ['multioutput', 'score_average'],\n", " 'scitype:y_pred': 'pred_proba',\n", " 'lower_is_better': True}" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crps.get_tags()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "listing metrics with the tag, filtering for probabilistic tags:\n", "\n", "(let's try to find a quantile prediction metric!)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameobjectscitype:y_pred
0CRPS<class 'skpro.metrics._classes.CRPS'>pred_proba
1ConstraintViolation<class 'skpro.metrics._classes.ConstraintViola...pred_interval
2EmpiricalCoverage<class 'skpro.metrics._classes.EmpiricalCovera...pred_interval
3LinearizedLogLoss<class 'skpro.metrics._classes.LinearizedLogLo...pred_proba
4LogLoss<class 'skpro.metrics._classes.LogLoss'>pred_proba
5PinballLoss<class 'skpro.metrics._classes.PinballLoss'>pred_quantiles
6SquaredDistrLoss<class 'skpro.metrics._classes.SquaredDistrLoss'>pred_proba
\n", "
" ], "text/plain": [ " name object \\\n", "0 CRPS \n", "1 ConstraintViolation \n", "5 PinballLoss \n", "6 SquaredDistrLoss \n", "\n", " scitype:y_pred \n", "0 pred_proba \n", "1 pred_interval \n", "2 pred_interval \n", "3 pred_proba \n", "4 pred_proba \n", "5 pred_quantiles \n", "6 pred_proba " ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from skpro.registry import all_objects\n", "\n", "all_objects(\n", " \"metric\",\n", " as_dataframe=True,\n", " return_tags=\"scitype:y_pred\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`PinballLoss` is a quantile forecast metric:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13.648123260286354" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from skpro.metrics import PinballLoss\n", "\n", "pinball_loss = PinballLoss()\n", "\n", "pinball_loss(y_test, y_pred_q)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... this is by default an average (grand average, float)\n", "\n", "* averages over samples in `y_pred` / `y_test` (rows)\n", "* averages over variables (columns)\n", "* average over `alpha` values, quantile points" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "what if we don't want these averages?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* variable (column) averaging is controlled by the `multioutput` arg.\n", " * `\"raw_values\"` prevents averaging, `\"uniform_average\"` computes arithmetic mean.\n", "* quantile points (`alpha`) or coverage (`coverage`) is controlled by `score_average` arg\n", "* evaluation by row via the `evaluate_by_index` method\n", " * can be useful for diagnostics or statistical tests" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.05 13.133967\n", "0.95 14.162279\n", "Name: 0, dtype: float64" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Example 1: Pinball loss by quantile point\n", "loss_multi = PinballLoss(score_average=False)\n", "loss_multi(y_test, y_pred_q)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
target
10441.946574
33416.320990
27114.728135
3426.761400
24328.452058
......
9187.182827
4659.803051
15418.026285
4024.063702
28415.229778
\n", "

111 rows × 1 columns

\n", "
" ], "text/plain": [ " target\n", "104 41.946574\n", "334 16.320990\n", "271 14.728135\n", "342 6.761400\n", "243 28.452058\n", ".. ...\n", "9 187.182827\n", "46 59.803051\n", "154 18.026285\n", "402 4.063702\n", "284 15.229778\n", "\n", "[111 rows x 1 columns]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Example 2: CRPS by test sample index\n", "crps.evaluate_by_index(y_test, y_pred_proba)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Caveat: not every metric is an average over time points, e.g., RMSE\n", "\n", "In this case, `evaluate_by_index` computes jackknife pseudo-samples\n", "\n", "(for mean statistics, jackknife pseudo-samples are equal to individual samples)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 Benchmark evaluation of probabilistic regressors " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for quick evaluation and benchmarking,\n", "\n", "the `benchmarking.evaluate` utility can be used:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
test_CRPSfit_timepred_timelen_y_train
031.7834510.0027780.001045294
133.5743290.0030860.001094295
229.9096550.0038070.001278295
\n", "
" ], "text/plain": [ " test_CRPS fit_time pred_time len_y_train\n", "0 31.783451 0.002778 0.001045 294\n", "1 33.574329 0.003086 0.001094 295\n", "2 29.909655 0.003807 0.001278 295" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import KFold\n", "\n", "from skpro.benchmarking.evaluate import evaluate\n", "from skpro.metrics import CRPS\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "# 1. specify dataset\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "\n", "# 2. specify estimator\n", "estimator = ResidualDouble(LinearRegression())\n", "\n", "# 3. specify cross-validation schema\n", "cv = KFold(n_splits=3)\n", "\n", "# 4. specify evaluation metric\n", "crps = CRPS()\n", "\n", "# 5. evaluate - run the benchmark\n", "results = evaluate(estimator=estimator, X=X, y=y, cv=cv, scoring=crps)\n", "\n", "# results are pd.DataFrame\n", "# each row is one repetition of the cross-validation on one fold fit/predict/evaluate\n", "# columns report performance, runtime, and other optional information (see docstring)\n", "results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Advanced composition patterns " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we introduce a number of composition patterns available in `skpro`:\n", "\n", "* reducer-wrappers that turn `sklearn` regressors into probabilistic ones\n", "* pipelines of `sklearn` transformers with `skpro` regressors\n", "* tuning `skpro` probabilistic regressors via grid/random search, minimizing a probabilistic metric\n", "* ensembling multiple `skpro` probabilistic regressors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "data used in this section:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "evaluation metric used in this section:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "crps = CRPS()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 Reducers to turn `sklearn` regressors probabilistic " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "there are many common algorithms that turn a non-probabilistic tabular regressor probabilistic\n", "\n", "formally, this is a type of \"reduction\" - of probabilistic supervised tabular to non-probabilistic supervised tabular\n", "\n", "Examples:\n", "\n", "* predicting variance equal to training residual variance - `ResidualDouble` with standard settings\n", " * or other unconditional distribution estimate for residuals\n", "* \"squaring the residual\" two-step prediction - `ResidualDouble`\n", "* boostrap prediction intervals - `BootstrapRegressor`\n", "* conformal prediction intervals - contributions appreciated :-)\n", "* natural gradient boosting aka NGBoost - contributions appreciated :-)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1.1 constant variance prediction " ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "36.25453698363302" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.model_selection import KFold\n", "\n", "# estimator specification - use any sklearn regressor for reg_mean\n", "reg_mean = RandomForestRegressor()\n", "reg_proba = ResidualDouble(reg_mean, cv=KFold(5))\n", "# cv is used to estimate out-of-sample residual variance via 5-fold CV\n", "# note - in-sample predictions will usually underestimate the variance!\n", "\n", "# fit and predict\n", "reg_proba.fit(X_train, y_train)\n", "y_pred_proba = reg_proba.predict_proba(X_test)\n", "\n", "# evaluate\n", "crps(y_test, y_pred_proba)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_interval\n", "\n", "plot_crossplot_interval(y_test, y_pred_proba, coverage=0.9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1.2 two-step residual prediction " ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "36.860503015336164" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.model_selection import KFold\n", "\n", "# estimator specification - use any sklearn regressor for reg_mean and reg_resid\n", "reg_mean = RandomForestRegressor()\n", "reg_resid = RandomForestRegressor()\n", "reg_proba = ResidualDouble(reg_mean, estimator_resid=reg_resid, cv=KFold(5))\n", "# cv is used to estimate out-of-sample residual variance via 5-fold CV\n", "\n", "# fit and predict\n", "reg_proba.fit(X_train, y_train)\n", "y_pred_proba = reg_proba.predict_proba(X_test)\n", "\n", "# evaluate\n", "crps(y_test, y_pred_proba)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_interval\n", "\n", "plot_crossplot_interval(y_test, y_pred_proba, coverage=0.9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1.3 bootstrap prediction intervals " ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "43.13652636195608" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "from skpro.regression.bootstrap import BootstrapRegressor\n", "\n", "# estimator specification - use any sklearn regressor for reg_mean\n", "reg_mean = LinearRegression()\n", "reg_proba = BootstrapRegressor(reg_mean, n_bootstrap_samples=100)\n", "\n", "# fit and predict\n", "reg_proba.fit(X_train, y_train)\n", "y_pred_proba = reg_proba.predict_proba(X_test)\n", "\n", "# evaluate\n", "crps(y_test, y_pred_proba)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skpro.utils.plotting import plot_crossplot_interval\n", "\n", "plot_crossplot_interval(y_test, y_pred_proba, coverage=0.9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 Pipelines of `skpro` regressor and `sklearn` transformers " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`skpro` regressors can be pipelined with `sklearn` transformers, using the `skpro` pipeline.\n", "\n", "This ensure presence of `predict_proba` etc in the pipeline object.\n", "\n", "The syntax is exactly the same as for `sklearn`'s pipeline." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "from sklearn.impute import SimpleImputer as Imputer\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.preprocessing import MinMaxScaler\n", "\n", "from skpro.regression.compose import Pipeline\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "# estimator specification\n", "reg_mean = LinearRegression()\n", "reg_proba = ResidualDouble(reg_mean)\n", "\n", "# pipeline is specified as a list of tuples (name, estimator)\n", "pipe = Pipeline(\n", " steps=[\n", " (\"imputer\", Imputer()), # an sklearn transformer\n", " (\"scaler\", MinMaxScaler()), # an sklearn transformer\n", " (\"regressor\", reg_proba), # an skpro regressor\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(steps=[('imputer', SimpleImputer()), ('scaler', MinMaxScaler()),\n",
       "                ('regressor', ResidualDouble(estimator=LinearRegression()))])
Please rerun this cell to show the HTML repr or trust the notebook.
" ], "text/plain": [ "Pipeline(steps=[('imputer', SimpleImputer()), ('scaler', MinMaxScaler()),\n", " ('regressor', ResidualDouble(estimator=LinearRegression()))])" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "# the pipeline behaves as any skpro regressor\n", "pipe.fit(X_train, y_train)\n", "y_pred = pipe.predict(X=X_test)\n", "y_pred_proba = pipe.predict_proba(X=X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the pipeline provides the familiar nested `get_params`, `set_params` interface:\n", "\n", "nested parameters are keyed `componentname__parametername`" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'steps': [('imputer', SimpleImputer()),\n", " ('scaler', MinMaxScaler()),\n", " ('regressor', ResidualDouble(estimator=LinearRegression()))],\n", " 'imputer': SimpleImputer(),\n", " 'scaler': MinMaxScaler(),\n", " 'regressor': ResidualDouble(estimator=LinearRegression()),\n", " 'imputer__add_indicator': False,\n", " 'imputer__copy': True,\n", " 'imputer__fill_value': None,\n", " 'imputer__missing_values': nan,\n", " 'imputer__strategy': 'mean',\n", " 'imputer__verbose': 'deprecated',\n", " 'scaler__clip': False,\n", " 'scaler__copy': True,\n", " 'scaler__feature_range': (0, 1),\n", " 'regressor__cv': None,\n", " 'regressor__distr_loc_scale_name': None,\n", " 'regressor__distr_params': None,\n", " 'regressor__distr_type': 'Normal',\n", " 'regressor__estimator': LinearRegression(),\n", " 'regressor__estimator_resid': None,\n", " 'regressor__min_scale': 1e-10,\n", " 'regressor__residual_trafo': 'absolute',\n", " 'regressor__use_y_pred': False,\n", " 'regressor__estimator__copy_X': True,\n", " 'regressor__estimator__fit_intercept': True,\n", " 'regressor__estimator__n_jobs': None,\n", " 'regressor__estimator__normalize': 'deprecated',\n", " 'regressor__estimator__positive': False}" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pipe.get_params()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pipelines can also be created via simple lists of estimators,\n", "\n", "in this case names are generated automatically:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "# pipeline is specified as a list of tuples (name, estimator)\n", "pipe = Pipeline(\n", " steps=[\n", " Imputer(), # an sklearn transformer\n", " MinMaxScaler(), # an sklearn transformer\n", " reg_proba, # an skpro regressor\n", " ]\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 Tuning of `skpro` regressors via grid and random search " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`skpro` provides grid and random search tuners to tune arbitrary probabilistic regressors,\n", "\n", "using probabilistic metrics. Besides this, they function as the `sklearn` tuners do." ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "from sklearn.model_selection import KFold\n", "\n", "from skpro.metrics import CRPS\n", "from skpro.model_selection import GridSearchCV\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "# cross-validation specification for tuner\n", "cv = KFold(n_splits=3)\n", "\n", "# estimator to be tuned\n", "estimator = ResidualDouble(LinearRegression())\n", "\n", "# tuning grid - do we fit an intercept in the linear regression?\n", "param_grid = {\"estimator__fit_intercept\": [True, False]}\n", "\n", "# metric to be optimized\n", "crps_metric = CRPS()\n", "\n", "# specification of the grid search tuner\n", "gscv = GridSearchCV(\n", " estimator=estimator,\n", " param_grid=param_grid,\n", " cv=cv,\n", " scoring=crps_metric,\n", ")" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
GridSearchCV(cv=KFold(n_splits=3, random_state=None, shuffle=False),\n",
       "             estimator=ResidualDouble(estimator=LinearRegression()),\n",
       "             param_grid={'estimator__fit_intercept': [True, False]},\n",
       "             scoring=CRPS())
Please rerun this cell to show the HTML repr or trust the notebook.
" ], "text/plain": [ "GridSearchCV(cv=KFold(n_splits=3, random_state=None, shuffle=False),\n", " estimator=ResidualDouble(estimator=LinearRegression()),\n", " param_grid={'estimator__fit_intercept': [True, False]},\n", " scoring=CRPS())" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gscv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the grid search tuner behaves like any `skpro` probabilistic regressor:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "gscv.fit(X_train, y_train)\n", "y_pred = gscv.predict(X_test)\n", "y_pred_proba = gscv.predict_proba(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "random search is similar, except that instead of a grid a parameter sampler should be specified:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "from skpro.model_selection import RandomizedSearchCV\n", "\n", "# only difference to GridSearchCV is the param_distributions argument\n", "\n", "# specification of the random search parameter sampler\n", "param_distributions = {\"estimator__fit_intercept\": [True, False]}\n", "\n", "# specification of the random search tuner\n", "rscv = RandomizedSearchCV(\n", " estimator=estimator,\n", " param_distributions=param_distributions,\n", " cv=cv,\n", " scoring=crps_metric,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.4 Bagging/mixture ensemble of probabilistic regressors " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Classical bagging does the following, for a wrapped estimator:\n", "\n", "In `fit`:\n", "\n", "1. subsample rows and/or columns of `X`, `y` to `X_subs`, `y_subs`\n", "2. fit clone of wrapped estimator to `X_subs`, `y_subs`\n", "3. Repeat 1-2 `n_estimators` times, store that many fitted clones.\n", "\n", "In `predict`, for `X_test`:\n", "\n", "1. for all fitted clones, obtain predictions on `X_test` - these are distributions\n", "2. return the uniform mixture of these distributions, per test sample" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.model_selection import train_test_split\n", "\n", "X, y = load_diabetes(return_X_y=True, as_frame=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "from skpro.regression.ensemble import BaggingRegressor\n", "from skpro.regression.residual import ResidualDouble\n", "\n", "reg_mean = LinearRegression()\n", "reg_proba = ResidualDouble(reg_mean)\n", "\n", "ens = BaggingRegressor(reg_proba, n_estimators=10)\n", "ens.fit(X_train, y_train)\n", "\n", "y_pred = ens.predict_proba(X_test)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Mixture(columns=Index(['target'], dtype='object'),\\n distributions=[Normal(columns=Index(['target'], dtype='object'),\\n index=Index([367, 248, 134, 148, 21, 310, 37, 305, 23, 373,\\n ...\\n 365, 204, 309, 379, 7, 440, 178, 160, 119, 441],\\n dtype='int64', length=111),\\n mu=array([[270.91496133],\\n [227.0209857 ],\\n [153.30255219],\\n [133.24435057],\\n [108.55506881],\\n [206.51166703],\\n [153.83348539],\\n [120.5...\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484],\\n [45.96784484]]))],\\n index=Index([367, 248, 134, 148, 21, 310, 37, 305, 23, 373,\\n ...\\n 365, 204, 309, 379, 7, 440, 178, 160, 119, 441],\\n dtype='int64', length=111))\"" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# y_pred is a mixture distribution!\n", "str(y_pred)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal,\n", " skpro.distributions.normal.Normal]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[type(x) for x in y_pred.distributions]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Extension guide - implementing your own probabilistic regressor " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "`skpro` is meant to be easily extensible, for direct contribution to `skpro` as well as for local/private extension with custom methods.\n", "\n", "To get started:\n", "\n", "* Follow the [\"implementing estimator\" developer guide](https://skpro.readthedocs.io/en/stable/developer_guide/add_estimators.html)\n", "* Use the [probabilistic regressor template](https://github.com/sktime/skpro/blob/main/extension_templates/regression.py) to get started\n", "\n", "1. Read through the [probabilistic regression extension template](https://github.com/sktime/skpro/blob/main/extension_templates/regression.py) - this is a `python` file with `todo` blocks that mark the places in which changes need to be added.\n", "2. Copy the proba regressor extension template to a local folder in your own repository (local/private extension), or to a suitable location in your clone of the `skpro` or affiliated repository (if contributed extension), inside `skpro.regression`; rename the file and update the file docstring appropriately.\n", "3. Address the \"todo\" parts. Usually, this means: changing the name of the class, setting the tag values, specifying hyper-parameters, filling in `__init__`, `_fit`, and at least one of the probabilistic prediction methods, preferably `_predict_proba` (for details see the extension template). You can add private methods as long as they do not override the default public interface. For more details, see the extension template.\n", "4. To test your estimator manually: import your estimator and run it in the worfklows in Section 1; then use it in the compositors in Section 3.\n", "5. To test your estimator automatically: call `skpro.utils.check_estimator` on your estimator. You can call this on a class or object instance. Ensure you have specified test parameters in the `get_test_params` method, according to the extension template.\n", "\n", "In case of direct contribution to `skpro` or one of its affiliated packages, additionally:\n", "\n", "* Add yourself as an author to the code, and to the `CODEOWNERS` for the new estimator file(s).\n", "* Create a pull request that contains only the new estimators (and their inheritance tree, if it's not just one class), as well as the automated tests as described above.\n", "* In the pull request, describe the estimator and optimally provide a publication or other technical reference for the strategy it implements.\n", "* Before making the pull request, ensure that you have all necessary permissions to contribute the code to a permissive license (BSD-3) open source project." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Summary\n", "\n", "* `skpro` is a unified interface toolbox for probabilistic supervised regression, that is, for prediction intervals, quantiles, fully distributional predictions, in a tabular regression setting. The interface is fully interoperable with `scikit-learn` and `scikit-base` interface specifications.\n", "\n", "* `skpro` comes with rich composition functionality that allows to build complex pipelines easily, and connect easily with other parts of the open source ecosystem, such as `scikit-learn` and individual algorithm libraries.\n", "\n", "* `skpro` is easy to extend, and comes with user friendly tools to facilitate implementing and testing your own probabilistic regressors and composition principles." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "### Credits:\n", "\n", "noteook creation: fkiraly\n", "\n", "skpro: https://github.com/sktime/skpro/blob/main/CONTRIBUTORS.md" ] } ], "metadata": { "kernelspec": { "display_name": "skpro", "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.11.4" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "3e631b8a076cc106144e9b132b7d31cae2f1e2660b47e5f9fcb0397caae5fbd5" } } }, "nbformat": 4, "nbformat_minor": 2 }