diff --git a/examples/01_skpro_intro.ipynb b/examples/01_skpro_intro.ipynb index aab1b8564..8f9b407ca 100644 --- a/examples/01_skpro_intro.ipynb +++ b/examples/01_skpro_intro.ipynb @@ -5,23 +5,48 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## skpro introduction notebook\n", + "## skpro introduction notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Set-up instructions:** On binder, this should run out-of-the-box.\n", + "\n", + "To run this notebook as intended, 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", - "lists basic vignettes - currently incomplete and used for testing" + "**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": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ + "# hide warnings\n", "import warnings\n", "\n", - "# import numpy as np\n", - "# import pandas as pd\n", - "\n", - "# hide warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, @@ -33,6 +58,20 @@ "## 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)` for interval predictions of labels\n", + "* `predict_quantiles(X_test)` 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", @@ -41,13 +80,21 @@ "### 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": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "\n", "from sklearn.datasets import load_diabetes\n", "from sklearn.ensemble import RandomForestRegressor\n", "from sklearn.linear_model import LinearRegression\n", @@ -61,7 +108,7 @@ "\n", "# step 2: specifying the regressor\n", "# example - random forest for mean prediction\n", - "# near regression for variance prediction\n", + "# linear regression for variance prediction\n", "reg_mean = RandomForestRegressor()\n", "reg_resid = LinearRegression()\n", "reg_proba = ResidualDouble(reg_mean, reg_resid)\n", @@ -70,8 +117,1052 @@ "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([381, 139,  99, 272,  56, 349, 420, 337, 199,  72,\n",
+       "       ...\n",
+       "       300, 236, 160, 227, 241, 268, 388, 127, 412, 283],\n",
+       "      dtype='int64', length=111),\n",
+       "       mu=array([[118.85],\n",
+       "       [228.85],\n",
+       "       [145.66],\n",
+       "       [125.88],\n",
+       "       [205.65],\n",
+       "       [107.12],\n",
+       "       [130.02],\n",
+       "       [164.81],\n",
+       "       [185.76],\n",
+       "       [149.34],\n",
+       "       [217.09],\n",
+       "       [ 96.99],\n",
+       "       [104.97],\n",
+       "       [196.28],\n",
+       "       [208.39],\n",
+       "       [158.98],\n",
+       "       [145.25],\n",
+       "       [248.86],\n",
+       "       [ 89.01],\n",
+       "       [24...\n",
+       "       [16.29396088],\n",
+       "       [16.32129065],\n",
+       "       [15.3176468 ],\n",
+       "       [12.535319  ],\n",
+       "       [13.1500054 ],\n",
+       "       [27.31178894],\n",
+       "       [22.36422301],\n",
+       "       [21.83370339],\n",
+       "       [15.32004588],\n",
+       "       [18.12178421],\n",
+       "       [11.38451594],\n",
+       "       [11.4564265 ],\n",
+       "       [14.77505789],\n",
+       "       [12.47202459],\n",
+       "       [15.8887364 ],\n",
+       "       [20.78791316],\n",
+       "       [19.85426535],\n",
+       "       [19.96654621],\n",
+       "       [12.92540335],\n",
+       "       [11.64591954],\n",
+       "       [15.35777574],\n",
+       "       [23.883902  ],\n",
+       "       [14.26127797],\n",
+       "       [ 8.10192324],\n",
+       "       [24.10078003],\n",
+       "       [15.11159749]]))
Please rerun this cell to show the HTML repr or trust the notebook.
" + ], + "text/plain": [ + "Normal(columns=Index(['target'], dtype='object'),\n", + " index=Index([381, 139, 99, 272, 56, 349, 420, 337, 199, 72,\n", + " ...\n", + " 300, 236, 160, 227, 241, 268, 388, 127, 412, 283],\n", + " dtype='int64', length=111),\n", + " mu=array([[118.85],\n", + " [228.85],\n", + " [145.66],\n", + " [125.88],\n", + " [205.65],\n", + " [107.12],\n", + " [130.02],\n", + " [164.81],\n", + " [185.76],\n", + " [149.34],\n", + " [217.09],\n", + " [ 96.99],\n", + " [104.97],\n", + " [196.28],\n", + " [208.39],\n", + " [158.98],\n", + " [145.25],\n", + " [248.86],\n", + " [ 89.01],\n", + " [24...\n", + " [16.29396088],\n", + " [16.32129065],\n", + " [15.3176468 ],\n", + " [12.535319 ],\n", + " [13.1500054 ],\n", + " [27.31178894],\n", + " [22.36422301],\n", + " [21.83370339],\n", + " [15.32004588],\n", + " [18.12178421],\n", + " [11.38451594],\n", + " [11.4564265 ],\n", + " [14.77505789],\n", + " [12.47202459],\n", + " [15.8887364 ],\n", + " [20.78791316],\n", + " [19.85426535],\n", + " [19.96654621],\n", + " [12.92540335],\n", + " [11.64591954],\n", + " [15.35777574],\n", + " [23.883902 ],\n", + " [14.26127797],\n", + " [ 8.10192324],\n", + " [24.10078003],\n", + " [15.11159749]]))" + ] + }, + "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([381, 139, 99, 272, 56, 349, 420, 337, 199, 72,\n", + " ...\n", + " 300, 236, 160, 227, 241, 268, 388, 127, 412, 283],\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
381101.431079
139209.907161
99148.807803
272151.779165
56222.904201
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 101.431079\n", + "139 209.907161\n", + "99 148.807803\n", + "272 151.779165\n", + "56 222.904201" + ] + }, + "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
381118.85
139228.85
99145.66
272125.88
56205.65
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 118.85\n", + "139 228.85\n", + "99 145.66\n", + "272 125.88\n", + "56 205.65" + ] + }, + "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
381127.633421
139472.467320
99331.036284
272233.990518
56433.604575
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 127.633421\n", + "139 472.467320\n", + "99 331.036284\n", + "272 233.990518\n", + "56 433.604575" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_proba.var().head()" + ] + }, + { + "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
381100.267272137.432728
139193.096946264.603054
99115.732871175.587129
272100.719088151.040912
56171.398927239.901073
\n", + "
" + ], + "text/plain": [ + " target \n", + " 0.9 \n", + " lower upper\n", + "381 100.267272 137.432728\n", + "139 193.096946 264.603054\n", + "99 115.732871 175.587129\n", + "272 100.719088 151.040912\n", + "56 171.398927 239.901073" + ] + }, + "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": [ + "### 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": 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", + "
target
0.050.500.95
381100.267272118.85137.432728
139193.096946228.85264.603054
99115.732871145.66175.587129
272100.719088125.88151.040912
56171.398927205.65239.901073
\n", + "
" + ], + "text/plain": [ + " target \n", + " 0.05 0.50 0.95\n", + "381 100.267272 118.85 137.432728\n", + "139 193.096946 228.85 264.603054\n", + "99 115.732871 145.66 175.587129\n", + "272 100.719088 125.88 151.040912\n", + "56 171.398927 205.65 239.901073" + ] + }, + "execution_count": 11, + "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": [ + "### 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": 12, + "metadata": {}, + "outputs": [], + "source": [ "y_pred_mean = reg_proba.predict(X_new)\n", - "y_pred_proba = reg_proba.predict_proba(X_new)" + "y_pred_var = reg_proba.predict_var(X_new)" + ] + }, + { + "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", + "
target
381118.85
139228.85
99145.66
272125.88
56205.65
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 118.85\n", + "139 228.85\n", + "99 145.66\n", + "272 125.88\n", + "56 205.65" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_mean.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "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
381127.633421
139472.467320
99331.036284
272233.990518
56433.604575
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 127.633421\n", + "139 472.467320\n", + "99 331.036284\n", + "272 233.990518\n", + "56 433.604575" + ] + }, + "execution_count": 14, + "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": 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
381118.85
139228.85
99145.66
272125.88
56205.65
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 118.85\n", + "139 228.85\n", + "99 145.66\n", + "272 125.88\n", + "56 205.65" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_proba.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
381127.633421
139472.467320
99331.036284
272233.990518
56433.604575
\n", + "
" + ], + "text/plain": [ + " target\n", + "381 127.633421\n", + "139 472.467320\n", + "99 331.036284\n", + "272 233.990518\n", + "56 433.604575" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_proba.var().head()" ] }, { @@ -79,14 +1170,41 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1.2 simple evaluation workflow for probabilistic predictions" + "## 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": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "30.429848226043294" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from sklearn.datasets import load_diabetes\n", "from sklearn.ensemble import RandomForestRegressor\n", @@ -101,10 +1219,10 @@ "X_train, X_test, y_train, y_test = train_test_split(X, y)\n", "\n", "# step 2: specifying the regressor\n", - "# example - random forest for mean prediction\n", - "# near regression for variance prediction\n", - "reg_mean = RandomForestRegressor()\n", - "reg_resid = LinearRegression()\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", @@ -123,7 +1241,3524 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "how do we know that metric is of right type? Via `scitype:y_pred` tag" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "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": 18, + "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": 19, + "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": 19, + "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": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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FDh//rzR7efPn0fTpk3N3icgIAABAQHuaB4RERGJjM/1DPn7+6NHjx7IzMw03KbVapGZmYmEhAQPtoyIiIjEyOd6hgBg8uTJSEpKwt13342ePXtiyZIlKC8vx8iRIz3dNCIiIhIZnwxDw4cPx8WLFzFr1iwUFRWhW7du+OWXX0wGVRMRERH5ZBgCgFdeeQWvvPKKp5tBREREIudzY4aIiIiIbMEwRERERJLGMERERESSxjBEt40Y4ekWEBERuR3DEN3GMERERBLEMERERESSxjBEREREksYwRERERJLGMERERESSxjBEREREksYwRERERJLGMERERESSxjBEREREksYwRERERJLGMERERESSxjAkRlwWg4iIyG0YhsSIYYiIiMhtGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGfNmIEZ5uARERkegxDPkyhiEiIqI6MQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaTV83QDxEgQBABAWVmZh1tCRERE1tKft/XncWsxDJlx5coVAEB0dLSHW0JERES2unLlCsLCwqzeXybYGp8kQKvV4ty5c2jQoAFkMpmnm2NRWVkZoqOjcebMGYSGhnq6OaLF42QdHifr8DhZh8fJejxW1rHmOAmCgCtXrqB58+aQy60fCcSeITPkcjmUSqWnm2G10NBQ/gJZgcfJOjxO1uFxsg6Pk/V4rKxT13GypUdIjwOoiYiISNIYhoiIiEjSGIa8WEBAAN555x0EBAR4uimixuNkHR4n6/A4WYfHyXo8VtZx5XHiAGoiIiKSNPYMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDIncu+++C5lMZvSvXbt2hu03btzA+PHjERkZiZCQEDz55JM4f/68B1vsHlu3bsWQIUPQvHlzyGQyrFu3zmi7IAiYNWsWmjVrhsDAQAwYMAC5ublG+5SUlOC5555DaGgowsPDkZKSgqtXr7rxVbhe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Pw4R1UEgIqrD7t27BQDC999/b3Gfq1evCn5+fsIXX3xhuK2iokJo3ry5sGDBAsNtDzzwgHDXXXcZ3dfcbTdu3BCCgoKEnTt3Gt2ekpIijBgxQhAEQSgrKxMCAgKETz75xGybHnjgAWHixIl1vr669rt48aIAQDh8+LBh//bt2wtardawz7Rp04T27dtb3XZrnnfBggVCx44dDT+vWbNGaNq0qXDlyhVBEAQhMzNT+PDDD+t8fURUO44ZIqI6CdUu/1hy8uRJVFZWok+fPobb/Pz80LNnTxw/ftxo3x49epjcv+ZteXl5uHbtGgYOHGh0e0VFBe666y4AwPHjx3Hz5k3079/f6tdijdzcXMyaNQu7d+/GpUuXDD1CBQUF6NSpEwDgnnvugUwmM9wnISEBH330ETQajVVtt8Y999yD6dOn4+rVq5DJZJg5cybmzJmDkJAQAEC/fv3Qr18/R18ukeQxDBFRneLi4iCTyeweJF2TuUttNW+7evUqAOD//u//EBUVZbQtICAAABAYGOiU9tQ0ZMgQxMTE4JNPPkHz5s2h1WrRqVMnVFRUWHV/a9pujR49ekAul2P//v3YtGkT7rjjDowcOdKw/bHHHsPcuXPRuXNnqx+TiExxzBAR1SkiIgKJiYlYtmwZysvLTbZfvnwZbdq0MYz50ausrEROTg46dOhg83N26NABAQEBKCgoQGxsrNE//difuLg4BAYGWpza7+/vD41GY9PzFhcX48SJE3jrrbfQv39/tG/fHn///bfJfrt37zb6edeuXYiLi4NCobCq7dYICgpC586d8d133+HDDz/E4sWLIZff/tr+448/0K5dO5teHxGZYs8QEVll2bJl6NOnD3r27InZs2ejS5cuqKqqQkZGBlasWIHjx49j7NixmDp1KiIiItCiRQssWLAA165dQ0pKis3P16BBA0yZMgWvvfYatFot7r33XpSWlmLHjh0IDQ1FUlIS6tevj2nTpuGNN96Av78/+vTpg4sXL+Lo0aNISUlBy5YtsXv3buTn5yMkJAQRERFGYcKchg0bIjIyEmlpaWjWrBkKCgowffp0k/0KCgowefJkjBkzBvv378e//vUvfPTRR1a33Vr33HMP/vWvf2Ho0KHo27ev4fYrV66gfv368PPzs/qxiMg8hiEiskrr1q2xf/9+zJ07F6+//joKCwtxxx13oEePHlixYgUAYP78+dBqtXjhhRdw5coV3H333di4cSMaNmxo13O+9957uOOOOzBv3jz89ddfCA8PR/fu3TFz5kzDPm+//Tbq1auHWbNm4dy5c2jWrBlefvllAMCUKVOQlJSEDh064Pr16zh16hRatmxZ63PK5XJ89dVXePXVV9GpUye0bdsWH3/8sVEQAYAXX3wR169fR8+ePaFQKDBx4kSkpqba1HZrdO3aFX5+fli4cKHR7UePHkXHjh1teiwiMk8mWDMykoiIPOLBBx9E9+7dDb1Oep988gkuXrxoc7giIlPsGSIiEhmtVouLFy9CpVIhNzcX69evN9nn8OHDGDBggAdaR+R72DNERCQymzdvRr9+/dCuXTusXr0avXr18nSTiHwawxARERFJGqfWExERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaT9f+5o58iVa8z/AAAAAElFTkSuQmCC", + "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": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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FDh//rzR7efPn0fTpk3N3icgIAABAQHuaB4RERGJjM/1DPn7+6NHjx7IzMw03KbVapGZmYmEhAQPtoyIiIjEyOd6hgBg8uTJSEpKwt13342ePXtiyZIlKC8vx8iRIz3dNCIiIhIZnwxDw4cPx8WLFzFr1iwUFRWhW7du+OWXX0wGVRMRERH5ZBgCgFdeeQWvvPKKp5tBREREIudzY4aIiIiIbMEwRERERJLGMERERESSxjBEt40Y4ekWEBERuR3DEN3GMERERBLEMERERESSxjBEREREksYwRERERJLGMERERESSxjBEREREksYwRERERJLGMERERESSxjBEREREksYwRERERJLGMERERESSxjAkRlwWg4iIyG0YhsSIYYiIiMhtGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGiIiISNIYhoiIiEjSGIaIiIhI0hiGfNmIEZ5uARERkegxDPkyhiEiIqI6MQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaTV83QDxEgQBABAWVmZh1tCRERE1tKft/XncWsxDJlx5coVAEB0dLSHW0JERES2unLlCsLCwqzeXybYGp8kQKvV4ty5c2jQoAFkMpmnm2NRWVkZoqOjcebMGYSGhnq6OaLF42QdHifr8DhZh8fJejxW1rHmOAmCgCtXrqB58+aQy60fCcSeITPkcjmUSqWnm2G10NBQ/gJZgcfJOjxO1uFxsg6Pk/V4rKxT13GypUdIjwOoiYiISNIYhoiIiEjSGIa8WEBAAN555x0EBAR4uimixuNkHR4n6/A4WYfHyXo8VtZx5XHiAGoiIiKSNPYMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDIncu+++C5lMZvSvXbt2hu03btzA+PHjERkZiZCQEDz55JM4f/68B1vsHlu3bsWQIUPQvHlzyGQyrFu3zmi7IAiYNWsWmjVrhsDAQAwYMAC5ublG+5SUlOC5555DaGgowsPDkZKSgqtXr7rxVbhe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Pw4R1UEgIqrD7t27BQDC999/b3Gfq1evCn5+fsIXX3xhuK2iokJo3ry5sGDBAsNtDzzwgHDXXXcZ3dfcbTdu3BCCgoKEnTt3Gt2ekpIijBgxQhAEQSgrKxMCAgKETz75xGybHnjgAWHixIl1vr669rt48aIAQDh8+LBh//bt2wtardawz7Rp04T27dtb3XZrnnfBggVCx44dDT+vWbNGaNq0qXDlyhVBEAQhMzNT+PDDD+t8fURUO44ZIqI6CdUu/1hy8uRJVFZWok+fPobb/Pz80LNnTxw/ftxo3x49epjcv+ZteXl5uHbtGgYOHGh0e0VFBe666y4AwPHjx3Hz5k3079/f6tdijdzcXMyaNQu7d+/GpUuXDD1CBQUF6NSpEwDgnnvugUwmM9wnISEBH330ETQajVVtt8Y999yD6dOn4+rVq5DJZJg5cybmzJmDkJAQAEC/fv3Qr18/R18ukeQxDBFRneLi4iCTyeweJF2TuUttNW+7evUqAOD//u//EBUVZbQtICAAABAYGOiU9tQ0ZMgQxMTE4JNPPkHz5s2h1WrRqVMnVFRUWHV/a9pujR49ekAul2P//v3YtGkT7rjjDowcOdKw/bHHHsPcuXPRuXNnqx+TiExxzBAR1SkiIgKJiYlYtmwZysvLTbZfvnwZbdq0MYz50ausrEROTg46dOhg83N26NABAQEBKCgoQGxsrNE//difuLg4BAYGWpza7+/vD41GY9PzFhcX48SJE3jrrbfQv39/tG/fHn///bfJfrt37zb6edeuXYiLi4NCobCq7dYICgpC586d8d133+HDDz/E4sWLIZff/tr+448/0K5dO5teHxGZYs8QEVll2bJl6NOnD3r27InZs2ejS5cuqKqqQkZGBlasWIHjx49j7NixmDp1KiIiItCiRQssWLAA165dQ0pKis3P16BBA0yZMgWvvfYatFot7r33XpSWlmLHjh0IDQ1FUlIS6tevj2nTpuGNN96Av78/+vTpg4sXL+Lo0aNISUlBy5YtsXv3buTn5yMkJAQRERFGYcKchg0bIjIyEmlpaWjWrBkKCgowffp0k/0KCgowefJkjBkzBvv378e//vUvfPTRR1a33Vr33HMP/vWvf2Ho0KHo27ev4fYrV66gfv368PPzs/qxiMg8hiEiskrr1q2xf/9+zJ07F6+//joKCwtxxx13oEePHlixYgUAYP78+dBqtXjhhRdw5coV3H333di4cSMaNmxo13O+9957uOOOOzBv3jz89ddfCA8PR/fu3TFz5kzDPm+//Tbq1auHWbNm4dy5c2jWrBlefvllAMCUKVOQlJSEDh064Pr16zh16hRatmxZ63PK5XJ89dVXePXVV9GpUye0bdsWH3/8sVEQAYAXX3wR169fR8+ePaFQKDBx4kSkpqba1HZrdO3aFX5+fli4cKHR7UePHkXHjh1teiwiMk8mWDMykoiIPOLBBx9E9+7dDb1Oep988gkuXrxoc7giIlPsGSIiEhmtVouLFy9CpVIhNzcX69evN9nn8OHDGDBggAdaR+R72DNERCQymzdvRr9+/dCuXTusXr0avXr18nSTiHwawxARERFJGqfWExERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaQxDBEREZGkMQwRERGRpDEMERERkaT9f+5o58iVa8z/AAAAAElFTkSuQmCC", + "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": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAG1CAYAAAAFuNXgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABN30lEQVR4nO3de1xUZf4H8M9wlevgBUEEEZMVNW9hKt4yZUV/ZRetLdMyw0ssGkKU2q62qyVlqWm7ShoqbdnF7LJZrSmiphKpUHklvCBMCLopN1Fuc35/zDIy3BzOnJk5c+bzfr3mNXBm5sx3HoY533nO83wflSAIAoiIiIgUwsHaARARERFJickNERERKQqTGyIiIlIUJjdERESkKExuiIiISFGY3BAREZGiMLkhIiIiRWFyQ0RERIriZO0ALE2r1aKwsBBeXl5QqVTWDoeIiIiMIAgCysvLERAQAAeH1vtm7C65KSwsRFBQkLXDICIiIhEKCgoQGBjY6n3sLrnx8vICoGscb29vK0dDRERExigrK0NQUJD+ON4au0tu6k9FeXt7M7khIiKyMcYMKeGAYiIiIlIUJjdERESkKExuiIiISFGY3BAREZGiMLkhIiIiRWFyQ0RERIrC5IaIiIgUhckNERERKQqTGyIiIlIUJjdERESkKExuiIiISFGY3BDZCY0GSE/XXRMRKRmTGyI7kJICBAcDY8fqrlNSrB0REZH5MLkhUjiNBpgzB9Bqdb9rtcDcuezBISLlYnJDpHC5ubcSm3p1dcDZs9aJh4jI3JjcEClcaCjg0Og/3dER6NnTOvEQEZkbkxsihQsMBDZu1CU0gO76nXd024mIlEhWyU1dXR2WLFmCkJAQuLm54Y477sDy5cshCIL+PoIgYOnSpejSpQvc3NwQGRmJ3NxcK0ZNJH/R0UBenm62VF6e7nciIqVysnYADb3++uvYsGEDUlNT0bdvXxw9ehQzZ86EWq3Gc889BwBYuXIl1q1bh9TUVISEhGDJkiWIiorCqVOn0K5dOyu/AiL5Cgxkbw0R2QeV0LBbxMruv/9++Pn5IaXBPNUpU6bAzc0N77//PgRBQEBAAJ5//nkkJiYCAEpLS+Hn54etW7fi8ccfv+1zlJWVQa1Wo7S0FN7e3mZ7LURERCSdthy/ZXVaavjw4UhLS8Ovv/4KAPj5559x8OBBTJw4EQBw4cIFFBUVITIyUv8YtVqNoUOHIiMjwyoxExERkbzI6rTUokWLUFZWhrCwMDg6OqKurg6vvvoqpk2bBgAoKioCAPj5+Rk8zs/PT39bY1VVVaiqqtL/XlZWZqboiYiISA5k1XPzySef4IMPPsC2bduQlZWF1NRUvPnmm0hNTRW9z6SkJKjVav0lKChIwoiJiIhIbmSV3LzwwgtYtGgRHn/8cfTr1w9PPvkk4uPjkZSUBADw9/cHABQXFxs8rri4WH9bY4sXL0Zpaan+UlBQYN4XQURERFYlq+SmsrISDo2qjTk6OkL7v/KqISEh8Pf3R1pamv72srIyZGZmIiIiotl9urq6wtvb2+BCREREyiWrMTeTJk3Cq6++im7duqFv377Izs7G6tWr8cwzzwAAVCoVFixYgFdeeQWhoaH6qeABAQF46KGHrBs8ERERyYKskpu3334bS5YswZ///GdcvnwZAQEBmDt3LpYuXaq/z4svvojr169jzpw5KCkpwciRI/Gf//yHNW6IiIgIgMzq3FgC69wQERHZHputc0NERERkKiY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRopiU3KxZswYAcPLkSdTV1UkSEBEREZEpnEx58MCBAwEAL730Es6cOQM3Nzf07dsX/fr1w5133on7779fihiJiIiIjKYSBEEw5o7l5eXw8vICABQUFCAoKKjJfSoqKnDy5EkcP34cJ06cwFtvvSVpsFIoKyuDWq1GaWkpvL29rR0OERERGaEtx2+jT0vt2bNH/3NYWBiWLl2KyspKg/t4enpi6NChmDVrliwTGyIiIlI+o5Ob4uJi/c+7d+/Grl27EBoaiq1bt5ojLiIiIiJRjEpuTpw4ga5du+p/Hz58ODIzM5GUlIQlS5YgPDwc33//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", + "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": 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_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": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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J57A3r17sXjxYjzwwAPVfq+MrI/3ryEiIrIei8LQpk2bsH79eowYMQLHjx9Hp06dUFFRgSNHjkChUNiqjEREREQ2Y9FNFy9evIj4+HgAQFxcHDQaDaZNm8YgRERERE7LojBUWVkJtVotPVapVPDx8bF6oYiIiIgaS4PuQG3q7tMA70BNREREzsOiMDR27FijLjHefZqIiIicnUVhaO3atTYqBhEREZF9WDRmaNu2bejQoQN0Ol21efn5+YiNjcXOnTutVjgiIiIiW7MoDL333nt4+umnodVqq83z9fVFUlISFi9ebLXCEREREdmaRWHoyJEjGDx4cI3zBw0ahIMHDza4UERERESNxaIxQzk5OXB3d695ZSoVcnNzG1woIiJz8EeLicgaLApDzZs3x/Hjx9GmTRuT848ePYrQUB54iKhx8EeLicgaLApD99xzD2bPno3BgwfDw8PDaF5JSQnmzp2LYcOGWbWAREQ14Y8WE5E1KIQQwtyFc3Jy0LVrV7i5uWHy5Mlo164dACA5ORnLli1DZWUlDh06hODgYJsVuDHodDr4+voiPz/f5GBxIiIicjz1PX9b1DIUHByM3bt3429/+xteeuklVOUohUKBxMRELFu2zOmDEBEREcmLRWEIACIjI/H999/j+vXrSEtLgxAC0dHR8PPzs0X5iIiIiGzK4jBUxc/PD927d7dmWYjIgfBKLSKSi3qHISJybbxSi4jkgmGIiEzilVpEJBcMQ0RkkkbDbjAikgeLfo6DiIiIyNUwDBEREZGsMQwRERGRrDEMERERkawxDBEREZGs8WoyIiIHwxteEjUuhiEiIgfDG14SNS6GISIiB8MbXhI1LoYhIiIHwxteUk3YhWobDENERBbgyYjsiV2otuHUYSgj4y2kp7+E5s2fR3T0ewCAyspSnDnzAi5f3giDoQz+/olo2/ZDqNXB9i2sg+KBncgyPBmRPbEL1TacNgzpdPuRlbUS3t6djKafOTMNV69+h9jYTVCpfJGaOhnHj9+Hrl132amkttXQMFPXgT00dCLCwpIYioj+hycjsid2odqGU4ahiopCnDo1Bm3brkZGxhs3Tc9HVta/EROzAX5+/QEA7dqtwf79McjP3wtf3172KrLNNPRbatWB/dKllcjOXlVtflbWKmRlreK3XXJYjd26yZMRketxyjCUmjoJzZoNhb//QKMw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", + "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": [ + "### 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": 25, + "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": 26, + "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": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "crps_metric.get_tags()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'estimator_type': 'regressor_proba',\n", + " 'object_type': 'regressor_proba',\n", + " 'capability:multioutput': False,\n", + " 'capability:missing': True}" + ] + }, + "execution_count": 27, + "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": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'multioutput': 'uniform_average', 'multivariate': False}" + ] + }, + "execution_count": 28, + "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": 29, + "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": 29, + "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": 30, + "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": 30, + "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": 31, + "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": 32, + "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": 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", + "
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": 33, + "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": 34, + "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": 34, + "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": 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", + " \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": 35, + "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": 36, + "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": 37, + "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": 38, + "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
9126.436327
142228.752373
117229.274334
154190.479808
199198.487125
\n", + "
" + ], + "text/plain": [ + " target\n", + "9 126.436327\n", + "142 228.752373\n", + "117 229.274334\n", + "154 190.479808\n", + "199 198.487125" + ] + }, + "execution_count": 38, + "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": 39, + "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
09154.654233
142168.793099
117205.445650
154185.737977
199172.479164
.........
99336227.567609
407133.807497
354194.368428
104149.853900
417159.109449
\n", + "

11100 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " target\n", + "0 9 154.654233\n", + " 142 168.793099\n", + " 117 205.445650\n", + " 154 185.737977\n", + " 199 172.479164\n", + "... ...\n", + "99 336 227.567609\n", + " 407 133.807497\n", + " 354 194.368428\n", + " 104 149.853900\n", + " 417 159.109449\n", + "\n", + "[11100 rows x 1 columns]" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "many_samples = y_pred_proba.sample(100)\n", + "many_samples" + ] + }, + { + "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
9149.404360
142187.103481
117207.415288
154181.764525
199169.965189
\n", + "
" + ], + "text/plain": [ + " target\n", + "9 149.404360\n", + "142 187.103481\n", + "117 207.415288\n", + "154 181.764525\n", + "199 169.965189" + ] + }, + "execution_count": 40, + "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": 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", + "
target
9151.44
142188.04
117205.71
154183.37
199168.71
\n", + "
" + ], + "text/plain": [ + " target\n", + "9 151.44\n", + "142 188.04\n", + "117 205.71\n", + "154 183.37\n", + "199 168.71" + ] + }, + "execution_count": 41, + "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": 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
9275.380423
142307.560818
117369.623033
154263.550387
199315.443840
\n", + "
" + ], + "text/plain": [ + " target\n", + "9 275.380423\n", + "142 307.560818\n", + "117 369.623033\n", + "154 263.550387\n", + "199 315.443840" + ] + }, + "execution_count": 42, + "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": 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
9296.662638
142296.662638
117296.662638
154296.662638
199296.662638
\n", + "
" + ], + "text/plain": [ + " target\n", + "9 296.662638\n", + "142 296.662638\n", + "117 296.662638\n", + "154 296.662638\n", + "199 296.662638" + ] + }, + "execution_count": 43, + "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! `metric(y_true, y_predict_proba)`" + ] + }, + { + "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": 44, + "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": 45, + "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": 46, + "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
38557.568213128.151787
4857.438213128.021787
8451.838213122.421787
248184.628213255.211787
33167.838213138.421787
.........
34054.788213125.371787
129188.558213259.141787
313195.668213266.251787
368188.288213258.871787
6061.178213131.761787
\n", + "

111 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " target \n", + " 0.95 \n", + " lower upper\n", + "385 57.568213 128.151787\n", + "48 57.438213 128.021787\n", + "84 51.838213 122.421787\n", + "248 184.628213 255.211787\n", + "331 67.838213 138.421787\n", + ".. ... ...\n", + "340 54.788213 125.371787\n", + "129 188.558213 259.141787\n", + "313 195.668213 266.251787\n", + "368 188.288213 258.871787\n", + "60 61.178213 131.761787\n", + "\n", + "[111 rows x 2 columns]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_int # lower/upper intervals" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "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
38563.242199122.477801
4863.112199122.347801
8457.512199116.747801
248190.302199249.537801
33173.512199132.747801
.........
34060.462199119.697801
129194.232199253.467801
313201.342199260.577801
368193.962199253.197801
6066.852199126.087801
\n", + "

111 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " target \n", + " 0.05 0.95\n", + "385 63.242199 122.477801\n", + "48 63.112199 122.347801\n", + "84 57.512199 116.747801\n", + "248 190.302199 249.537801\n", + "331 73.512199 132.747801\n", + ".. ... ...\n", + "340 60.462199 119.697801\n", + "129 194.232199 253.467801\n", + "313 201.342199 260.577801\n", + "368 193.962199 253.197801\n", + "60 66.852199 126.087801\n", + "\n", + "[111 rows x 2 columns]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred_q # quantiles" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Normal(columns=Index(['target'], dtype='object'),\n",
+       "       index=Index([385,  48,  84, 248, 331, 170, 230, 383, 309,  86,\n",
+       "       ...\n",
+       "       266, 346, 211, 171, 319, 340, 129, 313, 368,  60],\n",
+       "      dtype='int64', length=111),\n",
+       "       mu=array([[ 92.86],\n",
+       "       [ 92.73],\n",
+       "       [ 87.13],\n",
+       "       [219.92],\n",
+       "       [103.13],\n",
+       "       [ 69.04],\n",
+       "       [188.5 ],\n",
+       "       [ 93.05],\n",
+       "       [164.58],\n",
+       "       [ 95.23],\n",
+       "       [ 86.68],\n",
+       "       [107.67],\n",
+       "       [127.11],\n",
+       "       [116.98],\n",
+       "       [136.79],\n",
+       "       [185.75],\n",
+       "       [191.78],\n",
+       "       [132.92],\n",
+       "       [172.28],\n",
+       "       [116.68],\n",
+       "       [...\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441],\n",
+       "       [18.00634441]]))
Please rerun this cell to show the HTML repr or trust the notebook.
" + ], + "text/plain": [ + "Normal(columns=Index(['target'], dtype='object'),\n", + " index=Index([385, 48, 84, 248, 331, 170, 230, 383, 309, 86,\n", + " ...\n", + " 266, 346, 211, 171, 319, 340, 129, 313, 368, 60],\n", + " dtype='int64', length=111),\n", + " mu=array([[ 92.86],\n", + " [ 92.73],\n", + " [ 87.13],\n", + " [219.92],\n", + " [103.13],\n", + " [ 69.04],\n", + " [188.5 ],\n", + " [ 93.05],\n", + " [164.58],\n", + " [ 95.23],\n", + " [ 86.68],\n", + " [107.67],\n", + " [127.11],\n", + " [116.98],\n", + " [136.79],\n", + " [185.75],\n", + " [191.78],\n", + " [132.92],\n", + " [172.28],\n", + " [116.68],\n", + " [...\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441],\n", + " [18.00634441]]))" + ] + }, + "execution_count": 48, + "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": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "32.4116032777842" + ] + }, + "execution_count": 49, + "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": 50, + "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": 50, + "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": 51, + "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": 51, + "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": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10.256319541091692" + ] + }, + "execution_count": 52, + "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)" + ] + }, + { + "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", + "* evaluation by row via the `evaluate_by_index` method\n", + " * can be useful for diagnostics or statistical tests" + ] + }, + { + "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", + "
target
385115.981008
4810.660141
8413.874095
24828.144593
33185.711008
......
340115.761008
12934.074696
31357.801692
36890.421008
6025.642375
\n", + "

111 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " target\n", + "385 115.981008\n", + "48 10.660141\n", + "84 13.874095\n", + "248 28.144593\n", + "331 85.711008\n", + ".. ...\n", + "340 115.761008\n", + "129 34.074696\n", + "313 57.801692\n", + "368 90.421008\n", + "60 25.642375\n", + "\n", + "[111 rows x 1 columns]" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "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": 54, + "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.0028860.000984294
133.5743290.0037540.001477295
229.9096550.0025800.001086295
\n", + "
" + ], + "text/plain": [ + " test_CRPS fit_time pred_time len_y_train\n", + "0 31.783451 0.002886 0.000984 294\n", + "1 33.574329 0.003754 0.001477 295\n", + "2 29.909655 0.002580 0.001086 295" + ] + }, + "execution_count": 54, + "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": 55, + "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": 56, + "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": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "31.18872502807047" + ] + }, + "execution_count": 57, + "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": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 58, + "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": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "31.76074641872546" + ] + }, + "execution_count": 59, + "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": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 60, + "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": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "35.73832114895831" + ] + }, + "execution_count": 61, + "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": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 62, + "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": 63, + "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": 64, + "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": 65, + "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": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pipe" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "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": 67, + "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": 67, + "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": 68, + "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": 69, + "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": 70, + "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": 71, + "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": 71, + "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": 72, + "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": 73, + "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": 74, + "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": 75, + "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": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Mixture(columns=Index(['target'], dtype='object'),\\n distributions=[Normal(columns=Index(['target'], dtype='object'),\\n index=Index([ 61, 354, 104, 3, 76, 318, 205, 389, 12, 193,\\n ...\\n 199, 175, 134, 280, 74, 181, 297, 350, 110, 32],\\n dtype='int64', length=111),\\n mu=array([[178.82396796],\\n [193.48352954],\\n [151.05555714],\\n [174.3113541 ],\\n [182.55152692],\\n [169.66476115],\\n [241.12041457],\\n [ 81.8989...\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626],\\n [39.20371626]]))],\\n index=Index([ 61, 354, 104, 3, 76, 318, 205, 389, 12, 193,\\n ...\\n 199, 175, 134, 280, 74, 181, 297, 350, 110, 32],\\n dtype='int64', length=111))\"" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# y_pred is a mixture distribution!\n", + "str(y_pred)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "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": 77, + "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": { @@ -142,7 +4777,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.11.4" }, "orig_nbformat": 4, "vscode": {