From 2ef5fca6ce17fe7942f6f394fca21257bc72b0eb Mon Sep 17 00:00:00 2001 From: alex-hse-repository Date: Wed, 20 Oct 2021 13:35:39 +0300 Subject: [PATCH 1/3] Add Ensembles notebook --- README.md | 6 +- docs/source/tutorials.rst | 1 + examples/ensembles.ipynb | 988 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 994 insertions(+), 1 deletion(-) create mode 100644 examples/ensembles.ipynb diff --git a/README.md b/README.md index f05a0e8f5..268be2f50 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ We have also prepared a set of tutorials for an easy introduction: - Custom Distance - Visualisation -#### 04. [Deep learning models](https://github.com/tinkoff-ai/etna-ts/tree/master/examples/NN_examples.ipynb) +#### 06. [Deep learning models](https://github.com/tinkoff-ai/etna-ts/tree/master/examples/NN_examples.ipynb) - Creating TSDataset - Architecture - Testing models @@ -106,6 +106,10 @@ We have also prepared a set of tutorials for an easy introduction: - TFT - Simple Model +#### 07. [Ensembles](https://github.com/tinkoff-ai/etna-ts/tree/master/examples/ensembles.ipynb) +- VotingEnsemble +- StackingEnsemble + ## Documentation ETNA documentation is available [here](https://etna-docs.netlify.app/). diff --git a/docs/source/tutorials.rst b/docs/source/tutorials.rst index 2687264b1..92d576548 100644 --- a/docs/source/tutorials.rst +++ b/docs/source/tutorials.rst @@ -13,3 +13,4 @@ Tutorials tutorials/outliers tutorials/clustering tutorials/custom_transform_and_model + tutorials/ensembles diff --git a/examples/ensembles.ipynb b/examples/ensembles.ipynb new file mode 100644 index 000000000..b9b88ff4e --- /dev/null +++ b/examples/ensembles.ipynb @@ -0,0 +1,988 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e4793ef5", + "metadata": {}, + "source": [ + "# Ensembles notebook" + ] + }, + { + "cell_type": "markdown", + "id": "4949ce7f", + "metadata": {}, + "source": [ + "This notebook contains the simple examples of using the ensemble models with ETNA library.\n", + "\n", + "**Table of Contents**\n", + "\n", + "* [Load Dataset](#chapter1) \n", + "* [Build Pipelines](#chapter2)\n", + "* [Ensembles](#chapter3)\n", + " * [VotingEnsemble](#section_3_1)\n", + " * [StackingEnsamble](#section_3_2)\n", + " * [Results](#section_3_3)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7b9df4dc", + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "id": "f82360d8", + "metadata": {}, + "source": [ + "## 1. Load Dataset \n", + "\n", + "In this notebook we will work with the dataset contains only one segment with monthly wine sales." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "639d0580", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from etna.datasets import TSDataset" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "01e2fcee", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "original_df = pd.read_csv(\"data/monthly-australian-wine-sales.csv\")\n", + "original_df[\"timestamp\"] = pd.to_datetime(original_df[\"month\"])\n", + "original_df[\"target\"] = original_df[\"sales\"]\n", + "original_df.drop(columns=[\"month\", \"sales\"], inplace=True)\n", + "original_df[\"segment\"] = \"main\"\n", + "original_df.head()\n", + "df = TSDataset.to_dataset(original_df)\n", + "ts = TSDataset(df=df, freq=\"MS\")\n", + "ts.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "c879183c", + "metadata": {}, + "source": [ + "## 2. Build Pipelines \n", + "\n", + "Given the sales' history, we want to select the best model(pipeline) to forecast future sales." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0ee58fa6", + "metadata": {}, + "outputs": [], + "source": [ + "from etna.pipeline import Pipeline\n", + "from etna.models import NaiveModel, SeasonalMovingAverageModel, ProphetModel, CatBoostModelMultiSegment\n", + "from etna.transforms import LagTransform\n", + "from etna.metrics import MAE, MSE, SMAPE, MAPE\n", + "HORIZON = 3\n", + "N_FOLDS = 5" + ] + }, + { + "cell_type": "markdown", + "id": "b6815f49", + "metadata": {}, + "source": [ + "Let's build four pipelines using the different models" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f0dc26e4", + "metadata": {}, + "outputs": [], + "source": [ + "naive_pipeline = Pipeline(model=NaiveModel(lag=12), transforms=[], horizon=HORIZON)\n", + "seasonalma_pipeline = Pipeline(\n", + " model=SeasonalMovingAverageModel(window=5, seasonality=12), transforms=[], horizon=HORIZON\n", + ")\n", + "prophet_pipeline = Pipeline(model=ProphetModel(), transforms=[], horizon=HORIZON)\n", + "catboost_pipeline = Pipeline(\n", + " model=CatBoostModelMultiSegment(),\n", + " transforms=[LagTransform(lags=[6, 7, 8, 9, 10, 11, 12], in_column=\"target\")],\n", + " horizon=HORIZON,\n", + ")\n", + "pipeline_names = [\"naive\", \"moving average\", \"prophet\", \"catboost\"]\n", + "pipelines = [naive_pipeline, seasonalma_pipeline, prophet_pipeline, catboost_pipeline]" + ] + }, + { + "cell_type": "markdown", + "id": "106e3885", + "metadata": {}, + "source": [ + "And evaluate their performance on the backtest" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "53c1a0b9", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.4s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.6s remaining: 9.9s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.5s remaining: 6.4s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 15.6s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 15.6s finished\n", + "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.6s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.4s remaining: 9.6s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.2s remaining: 6.2s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 14.8s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 14.8s finished\n", + "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 6.1s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 10.4s remaining: 15.6s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 14.6s remaining: 9.7s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 22.5s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 22.5s finished\n", + "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 4.1s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 7.2s remaining: 10.7s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 10.2s remaining: 6.8s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.7s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.7s finished\n" + ] + }, + { + "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", + "
MAEMSESMAPEMAPE
naive2437.4666671.089199e+079.94988610.222106
moving average1913.8266676.113701e+067.8975707.824056
prophet2174.8390536.577668e+068.8911479.047454
catboost2224.6610628.699304e+069.0956149.733325
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE MAPE\n", + "naive 2437.466667 1.089199e+07 9.949886 10.222106\n", + "moving average 1913.826667 6.113701e+06 7.897570 7.824056\n", + "prophet 2174.839053 6.577668e+06 8.891147 9.047454\n", + "catboost 2224.661062 8.699304e+06 9.095614 9.733325" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics = []\n", + "for pipeline in pipelines:\n", + " metrics.append(\n", + " pipeline.backtest(\n", + " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=5\n", + " )[0].iloc[:, 1:]\n", + " )\n", + "metrics = pd.concat(metrics)\n", + "metrics.index = pipeline_names\n", + "metrics" + ] + }, + { + "cell_type": "markdown", + "id": "b9581f2a", + "metadata": {}, + "source": [ + "## 3. Ensembles \n", + "To improve the performance of the individual models, we can try to make ensembles out of them. Our library contains two ensembling methods, which we will try on now." + ] + }, + { + "cell_type": "markdown", + "id": "f0e7e3e6", + "metadata": {}, + "source": [ + "### 3.1 VotingEnsemble\n", + "\n", + "`VotingEnsemble` forecasts future values with weighted averaging of it's `pipelines` forecasts." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5338aeea", + "metadata": {}, + "outputs": [], + "source": [ + "from etna.ensembles import VotingEnsemble" + ] + }, + { + "cell_type": "markdown", + "id": "9f7ee7db", + "metadata": {}, + "source": [ + "By default, `VotingEnsemble` uses **uniform** weights for the pipelines' forecasts." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1c4029fc", + "metadata": {}, + "outputs": [], + "source": [ + "voting_ensemble = VotingEnsemble(pipelines=pipelines, n_jobs=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f1cb83b8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 6.7s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 11.1s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 11.2s remaining: 7.5s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.3s remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.3s finished\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MAEMSESMAPEMAPE
voting ensemble(uniform weights)2089.2143277.245760e+068.5948288.83881
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE MAPE\n", + "voting ensemble(uniform weights) 2089.214327 7.245760e+06 8.594828 8.83881" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "voting_ensamble_metrics = voting_ensemble.backtest(\n", + " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", + ")[0].iloc[:, 1:]\n", + "voting_ensamble_metrics.index = [\"voting ensemble(uniform weights)\"]\n", + "voting_ensamble_metrics" + ] + }, + { + "cell_type": "markdown", + "id": "7d661818", + "metadata": {}, + "source": [ + "You can specify the `weights` manually, the higher weight the more you trust the base model. The `weights` are automatically normalized." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "7be24d69", + "metadata": {}, + "outputs": [], + "source": [ + "voting_ensemble_custom_weights = VotingEnsemble(pipelines=pipelines, weights=[1, 16, 9, 4], n_jobs=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "beed0ae4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 6.8s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 11.4s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 11.5s remaining: 7.6s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.5s remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.5s finished\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MAEMSESMAPEMAPE
voting ensemble(custom weights)1961.7131726.152859e+068.0941238.19029
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE MAPE\n", + "voting ensemble(custom weights) 1961.713172 6.152859e+06 8.094123 8.19029" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "voting_ensamble_custom_weights_metrics = voting_ensemble_custom_weights.backtest(\n", + " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", + ")[0].iloc[:, 1:]\n", + "voting_ensamble_custom_weights_metrics.index = [\"voting ensemble(custom weights)\"]\n", + "voting_ensamble_custom_weights_metrics" + ] + }, + { + "cell_type": "markdown", + "id": "a26b503b", + "metadata": {}, + "source": [ + "### 3.2 StackingEnsemble\n", + "`StackingEnsemble` forecasts future using the metamodel to combine the forecasts of it's `pipelines`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "78c46663", + "metadata": {}, + "outputs": [], + "source": [ + "from etna.ensembles import StackingEnsemble" + ] + }, + { + "cell_type": "markdown", + "id": "3b430668", + "metadata": {}, + "source": [ + "By default, `StackingEnsemble` uses only the pipelines' forecasts as features for the `final_model`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "273626b1", + "metadata": {}, + "outputs": [], + "source": [ + "stacking_ensemble_unfeatured = StackingEnsemble(pipelines=pipelines, cv=10, n_jobs=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "272cc433", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 27.2s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 32.0s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 50.6s remaining: 33.7s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.2min remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.2min finished\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MAEMSESMAPEMAPE
stacking ensemble2002.6573757.227136e+068.3296968.461256
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE MAPE\n", + "stacking ensemble 2002.657375 7.227136e+06 8.329696 8.461256" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stacking_ensamble_unfeatured_metrics = stacking_ensemble_unfeatured.backtest(\n", + " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", + ")[0].iloc[:, 1:]\n", + "stacking_ensamble_unfeatured_metrics.index = [\"stacking ensemble\"]\n", + "stacking_ensamble_unfeatured_metrics" + ] + }, + { + "cell_type": "markdown", + "id": "60eaa513", + "metadata": {}, + "source": [ + "However, sometimes it might be useful to combine them with the other features, which were used to fit the base models. You can specify the additional features using the `features_to_use` parameter." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "acdf24fb", + "metadata": {}, + "outputs": [], + "source": [ + "stacking_ensemble_featured = StackingEnsemble(pipelines=pipelines, cv=10, features_to_use=\"all\", n_jobs=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "906ffd7b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 29.8s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 35.8s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 53.3s remaining: 35.5s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min finished\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MAEMSESMAPEMAPE
stacking ensemble + features2012.2460217.284254e+068.2926198.525519
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE MAPE\n", + "stacking ensemble + features 2012.246021 7.284254e+06 8.292619 8.525519" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stacking_ensamble_featured_metrics = stacking_ensemble_featured.backtest(\n", + " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", + ")[0].iloc[:, 1:]\n", + "stacking_ensamble_featured_metrics.index = [\"stacking ensemble + features\"]\n", + "stacking_ensamble_featured_metrics" + ] + }, + { + "cell_type": "markdown", + "id": "051a0ba0", + "metadata": {}, + "source": [ + "In addition, it is also possible to specify the `final_model`. You can use any regression model with the sklearn interface for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "df04bfc8", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import Lasso" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "b6f4f011", + "metadata": {}, + "outputs": [], + "source": [ + "stacking_ensemble_final_model = StackingEnsemble(\n", + " pipelines=pipelines, final_model=Lasso(alpha=10), cv=10, features_to_use=\"all\", n_jobs=4\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "be99b902", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 29.0s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 35.1s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 52.3s remaining: 34.8s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min finished\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MAEMSESMAPEMAPE
stacking ensemble + features + lasso2012.244697.284238e+068.2926158.525514
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE \\\n", + "stacking ensemble + features + lasso 2012.24469 7.284238e+06 8.292615 \n", + "\n", + " MAPE \n", + "stacking ensemble + features + lasso 8.525514 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stacking_ensamble_final_model_metrics = stacking_ensemble_final_model.backtest(\n", + " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", + ")[0].iloc[:, 1:]\n", + "stacking_ensamble_final_model_metrics.index = [\"stacking ensemble + features + lasso\"]\n", + "stacking_ensamble_final_model_metrics" + ] + }, + { + "cell_type": "markdown", + "id": "c975d5c5", + "metadata": {}, + "source": [ + "### 3.3 Results\n", + "Finally, let's take a look at the results of our experiments" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c2f1d397", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MAEMSESMAPEMAPE
naive2437.4666671.089199e+079.94988610.222106
moving average1913.8266676.113701e+067.8975707.824056
prophet2174.8390536.577668e+068.8911479.047454
catboost2224.6610628.699304e+069.0956149.733325
voting ensemble(uniform weights)2089.2143277.245760e+068.5948288.838810
voting ensemble(custom weights)1961.7131726.152859e+068.0941238.190290
stacking ensemble2002.6573757.227136e+068.3296968.461256
stacking ensemble + features2012.2460217.284254e+068.2926198.525519
stacking ensemble + features + lasso2012.2446907.284238e+068.2926158.525514
\n", + "
" + ], + "text/plain": [ + " MAE MSE SMAPE \\\n", + "naive 2437.466667 1.089199e+07 9.949886 \n", + "moving average 1913.826667 6.113701e+06 7.897570 \n", + "prophet 2174.839053 6.577668e+06 8.891147 \n", + "catboost 2224.661062 8.699304e+06 9.095614 \n", + "voting ensemble(uniform weights) 2089.214327 7.245760e+06 8.594828 \n", + "voting ensemble(custom weights) 1961.713172 6.152859e+06 8.094123 \n", + "stacking ensemble 2002.657375 7.227136e+06 8.329696 \n", + "stacking ensemble + features 2012.246021 7.284254e+06 8.292619 \n", + "stacking ensemble + features + lasso 2012.244690 7.284238e+06 8.292615 \n", + "\n", + " MAPE \n", + "naive 10.222106 \n", + "moving average 7.824056 \n", + "prophet 9.047454 \n", + "catboost 9.733325 \n", + "voting ensemble(uniform weights) 8.838810 \n", + "voting ensemble(custom weights) 8.190290 \n", + "stacking ensemble 8.461256 \n", + "stacking ensemble + features 8.525519 \n", + "stacking ensemble + features + lasso 8.525514 " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metrics = pd.concat(\n", + " [\n", + " metrics,\n", + " voting_ensamble_metrics,\n", + " voting_ensamble_custom_weights_metrics,\n", + " stacking_ensamble_unfeatured_metrics,\n", + " stacking_ensamble_featured_metrics,\n", + " stacking_ensamble_final_model_metrics,\n", + " ]\n", + ")\n", + "metrics\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfad369f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "etna-Wq0dxOda-py3.8", + "language": "python", + "name": "etna-wq0dxoda-py3.8" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d5633800438b4a7f75d33c49f6cc67ed3075bc28 Mon Sep 17 00:00:00 2001 From: alex-hse-repository Date: Wed, 20 Oct 2021 13:38:06 +0300 Subject: [PATCH 2/3] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 774aac4b8..2e8259440 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add 'in_column' parameter to get_anomalies methods([#199](https://github.com/tinkoff-ai/etna-ts/pull/199)) - Clustering notebook ([#152](https://github.com/tinkoff-ai/etna-ts/pull/152)) - StackingEnsemble ([#195](https://github.com/tinkoff-ai/etna-ts/pull/195)) +- Ensembles notebook ([#218](https://github.com/tinkoff-ai/etna-ts/pull/218)) ### Changed - Delete offset from WindowStatisticsTransform ([#111](https://github.com/tinkoff-ai/etna-ts/pull/111)) From 59669d819dea397d1985756a558045bf0ab7cf1c Mon Sep 17 00:00:00 2001 From: alex-hse-repository Date: Fri, 22 Oct 2021 11:37:11 +0300 Subject: [PATCH 3/3] Fixes --- examples/ensembles.ipynb | 498 +++++++-------------------------------- 1 file changed, 79 insertions(+), 419 deletions(-) diff --git a/examples/ensembles.ipynb b/examples/ensembles.ipynb index b9b88ff4e..e5ae036b1 100644 --- a/examples/ensembles.ipynb +++ b/examples/ensembles.ipynb @@ -43,7 +43,7 @@ "source": [ "## 1. Load Dataset \n", "\n", - "In this notebook we will work with the dataset contains only one segment with monthly wine sales." + "In this notebook we will work with the dataset contains only one segment with monthly wine sales. Working process with the dataset containing more segments will be absolutely the same." ] }, { @@ -106,7 +106,7 @@ "outputs": [], "source": [ "from etna.pipeline import Pipeline\n", - "from etna.models import NaiveModel, SeasonalMovingAverageModel, ProphetModel, CatBoostModelMultiSegment\n", + "from etna.models import NaiveModel, SeasonalMovingAverageModel, CatBoostModelMultiSegment\n", "from etna.transforms import LagTransform\n", "from etna.metrics import MAE, MSE, SMAPE, MAPE\n", "HORIZON = 3\n", @@ -132,14 +132,13 @@ "seasonalma_pipeline = Pipeline(\n", " model=SeasonalMovingAverageModel(window=5, seasonality=12), transforms=[], horizon=HORIZON\n", ")\n", - "prophet_pipeline = Pipeline(model=ProphetModel(), transforms=[], horizon=HORIZON)\n", "catboost_pipeline = Pipeline(\n", " model=CatBoostModelMultiSegment(),\n", " transforms=[LagTransform(lags=[6, 7, 8, 9, 10, 11, 12], in_column=\"target\")],\n", " horizon=HORIZON,\n", ")\n", - "pipeline_names = [\"naive\", \"moving average\", \"prophet\", \"catboost\"]\n", - "pipelines = [naive_pipeline, seasonalma_pipeline, prophet_pipeline, catboost_pipeline]" + "pipeline_names = [\"naive\", \"moving average\", \"catboost\"]\n", + "pipelines = [naive_pipeline, seasonalma_pipeline, catboost_pipeline]" ] }, { @@ -163,29 +162,23 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", - "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.4s\n", - "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.6s remaining: 9.9s\n", - "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.5s remaining: 6.4s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 15.6s remaining: 0.0s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 15.6s finished\n", - "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", - "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.6s\n", - "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.4s remaining: 9.6s\n", - "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.2s remaining: 6.2s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 14.8s remaining: 0.0s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 14.8s finished\n", + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.7s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.5s remaining: 9.7s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.8s remaining: 6.5s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.8s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.8s finished\n", "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", - "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 6.1s\n", - "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 10.4s remaining: 15.6s\n", - "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 14.6s remaining: 9.7s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 22.5s remaining: 0.0s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 22.5s finished\n", + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.4s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.7s remaining: 10.0s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.9s remaining: 6.6s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.3s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.3s finished\n", "[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n", - "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 4.1s\n", - "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 7.2s remaining: 10.7s\n", - "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 10.2s remaining: 6.8s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.7s remaining: 0.0s\n", - "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 16.7s finished\n" + "[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 3.7s\n", + "[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 6.7s remaining: 10.0s\n", + "[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 9.6s remaining: 6.4s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 15.7s remaining: 0.0s\n", + "[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 15.7s finished\n" ] }, { @@ -231,13 +224,6 @@ " 7.824056\n", " \n", " \n", - " prophet\n", - " 2174.839053\n", - " 6.577668e+06\n", - " 8.891147\n", - " 9.047454\n", - " \n", - " \n", " catboost\n", " 2224.661062\n", " 8.699304e+06\n", @@ -252,7 +238,6 @@ " MAE MSE SMAPE MAPE\n", "naive 2437.466667 1.089199e+07 9.949886 10.222106\n", "moving average 1913.826667 6.113701e+06 7.897570 7.824056\n", - "prophet 2174.839053 6.577668e+06 8.891147 9.047454\n", "catboost 2224.661062 8.699304e+06 9.095614 9.733325" ] }, @@ -308,7 +293,9 @@ "id": "9f7ee7db", "metadata": {}, "source": [ - "By default, `VotingEnsemble` uses **uniform** weights for the pipelines' forecasts." + "By default, `VotingEnsemble` uses **uniform** weights for the pipelines' forecasts. However, you can specify the weights manually usign the `weights` parameter. The higher weight the more you trust the base model. \n", + "\n", + "*Note*: The `weights` are automatically normalized." ] }, { @@ -318,7 +305,7 @@ "metadata": {}, "outputs": [], "source": [ - "voting_ensemble = VotingEnsemble(pipelines=pipelines, n_jobs=4)" + "voting_ensemble = VotingEnsemble(pipelines=pipelines, weights=[1, 9, 4], n_jobs=4)" ] }, { @@ -332,11 +319,11 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", - "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 6.7s\n", - "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 11.1s\n", - "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 11.2s remaining: 7.5s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.3s remaining: 0.0s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.3s finished\n" + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 4.6s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 7.9s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 7.9s remaining: 5.3s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 8.8s remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 8.8s finished\n" ] }, { @@ -368,19 +355,19 @@ " \n", " \n", " \n", - " voting ensemble(uniform weights)\n", - " 2089.214327\n", - " 7.245760e+06\n", - " 8.594828\n", - " 8.83881\n", + " voting ensemble\n", + " 1969.545363\n", + " 6.558551e+06\n", + " 8.125364\n", + " 8.257041\n", " \n", " \n", "\n", "" ], "text/plain": [ - " MAE MSE SMAPE MAPE\n", - "voting ensemble(uniform weights) 2089.214327 7.245760e+06 8.594828 8.83881" + " MAE MSE SMAPE MAPE\n", + "voting ensemble 1969.545363 6.558551e+06 8.125364 8.257041" ] }, "execution_count": 9, @@ -392,103 +379,10 @@ "voting_ensamble_metrics = voting_ensemble.backtest(\n", " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", ")[0].iloc[:, 1:]\n", - "voting_ensamble_metrics.index = [\"voting ensemble(uniform weights)\"]\n", + "voting_ensamble_metrics.index = [\"voting ensemble\"]\n", "voting_ensamble_metrics" ] }, - { - "cell_type": "markdown", - "id": "7d661818", - "metadata": {}, - "source": [ - "You can specify the `weights` manually, the higher weight the more you trust the base model. The `weights` are automatically normalized." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "7be24d69", - "metadata": {}, - "outputs": [], - "source": [ - "voting_ensemble_custom_weights = VotingEnsemble(pipelines=pipelines, weights=[1, 16, 9, 4], n_jobs=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "beed0ae4", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", - "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 6.8s\n", - "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 11.4s\n", - "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 11.5s remaining: 7.6s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.5s remaining: 0.0s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 13.5s finished\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MAEMSESMAPEMAPE
voting ensemble(custom weights)1961.7131726.152859e+068.0941238.19029
\n", - "
" - ], - "text/plain": [ - " MAE MSE SMAPE MAPE\n", - "voting ensemble(custom weights) 1961.713172 6.152859e+06 8.094123 8.19029" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "voting_ensamble_custom_weights_metrics = voting_ensemble_custom_weights.backtest(\n", - " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", - ")[0].iloc[:, 1:]\n", - "voting_ensamble_custom_weights_metrics.index = [\"voting ensemble(custom weights)\"]\n", - "voting_ensamble_custom_weights_metrics" - ] - }, { "cell_type": "markdown", "id": "a26b503b", @@ -500,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "78c46663", "metadata": {}, "outputs": [], @@ -513,12 +407,17 @@ "id": "3b430668", "metadata": {}, "source": [ - "By default, `StackingEnsemble` uses only the pipelines' forecasts as features for the `final_model`." + "By default, `StackingEnsemble` uses only the pipelines' forecasts as features for the `final_model`. However, you can specify the additional features using the `features_to_use` parameter. The following values are possible:\n", + "+ **None** - use only the pipelines' forecasts(default)\n", + "+ **List[str]** - use the pipelines' forecasts + features from the list\n", + "+ **\"all\"** - use all the avalible features\n", + "\n", + "*Note:* It is possible to use only the features available for the base models." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "273626b1", "metadata": {}, "outputs": [], @@ -528,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "272cc433", "metadata": {}, "outputs": [ @@ -537,11 +436,11 @@ "output_type": "stream", "text": [ "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", - "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 27.2s\n", - "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 32.0s\n", - "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 50.6s remaining: 33.7s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.2min remaining: 0.0s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.2min finished\n" + "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 12.3s\n", + "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 16.0s\n", + "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 21.2s remaining: 14.1s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 29.1s remaining: 0.0s\n", + "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 29.1s finished\n" ] }, { @@ -574,10 +473,10 @@ " \n", " \n", " stacking ensemble\n", - " 2002.657375\n", - " 7.227136e+06\n", - " 8.329696\n", - " 8.461256\n", + " 2109.063596\n", + " 8.609287e+06\n", + " 8.694399\n", + " 8.678903\n", " \n", " \n", "\n", @@ -585,113 +484,20 @@ ], "text/plain": [ " MAE MSE SMAPE MAPE\n", - "stacking ensemble 2002.657375 7.227136e+06 8.329696 8.461256" + "stacking ensemble 2109.063596 8.609287e+06 8.694399 8.678903" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "stacking_ensamble_unfeatured_metrics = stacking_ensemble_unfeatured.backtest(\n", + "stacking_ensamble_metrics = stacking_ensemble_unfeatured.backtest(\n", " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", ")[0].iloc[:, 1:]\n", - "stacking_ensamble_unfeatured_metrics.index = [\"stacking ensemble\"]\n", - "stacking_ensamble_unfeatured_metrics" - ] - }, - { - "cell_type": "markdown", - "id": "60eaa513", - "metadata": {}, - "source": [ - "However, sometimes it might be useful to combine them with the other features, which were used to fit the base models. You can specify the additional features using the `features_to_use` parameter." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "acdf24fb", - "metadata": {}, - "outputs": [], - "source": [ - "stacking_ensemble_featured = StackingEnsemble(pipelines=pipelines, cv=10, features_to_use=\"all\", n_jobs=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "906ffd7b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", - "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 29.8s\n", - "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 35.8s\n", - "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 53.3s remaining: 35.5s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min remaining: 0.0s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min finished\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MAEMSESMAPEMAPE
stacking ensemble + features2012.2460217.284254e+068.2926198.525519
\n", - "
" - ], - "text/plain": [ - " MAE MSE SMAPE MAPE\n", - "stacking ensemble + features 2012.246021 7.284254e+06 8.292619 8.525519" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stacking_ensamble_featured_metrics = stacking_ensemble_featured.backtest(\n", - " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", - ")[0].iloc[:, 1:]\n", - "stacking_ensamble_featured_metrics.index = [\"stacking ensemble + features\"]\n", - "stacking_ensamble_featured_metrics" + "stacking_ensamble_metrics.index = [\"stacking ensemble\"]\n", + "stacking_ensamble_metrics" ] }, { @@ -702,106 +508,6 @@ "In addition, it is also possible to specify the `final_model`. You can use any regression model with the sklearn interface for this purpose." ] }, - { - "cell_type": "code", - "execution_count": 17, - "id": "df04bfc8", - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import Lasso" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "b6f4f011", - "metadata": {}, - "outputs": [], - "source": [ - "stacking_ensemble_final_model = StackingEnsemble(\n", - " pipelines=pipelines, final_model=Lasso(alpha=10), cv=10, features_to_use=\"all\", n_jobs=4\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "be99b902", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n", - "[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 29.0s\n", - "[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 35.1s\n", - "[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 52.3s remaining: 34.8s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min remaining: 0.0s\n", - "[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.3min finished\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MAEMSESMAPEMAPE
stacking ensemble + features + lasso2012.244697.284238e+068.2926158.525514
\n", - "
" - ], - "text/plain": [ - " MAE MSE SMAPE \\\n", - "stacking ensemble + features + lasso 2012.24469 7.284238e+06 8.292615 \n", - "\n", - " MAPE \n", - "stacking ensemble + features + lasso 8.525514 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stacking_ensamble_final_model_metrics = stacking_ensemble_final_model.backtest(\n", - " ts=ts, metrics=[MAE(), MSE(), SMAPE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=2\n", - ")[0].iloc[:, 1:]\n", - "stacking_ensamble_final_model_metrics.index = [\"stacking ensemble + features + lasso\"]\n", - "stacking_ensamble_final_model_metrics" - ] - }, { "cell_type": "markdown", "id": "c975d5c5", @@ -813,7 +519,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 16, "id": "c2f1d397", "metadata": {}, "outputs": [ @@ -860,13 +566,6 @@ " 7.824056\n", " \n", " \n", - " prophet\n", - " 2174.839053\n", - " 6.577668e+06\n", - " 8.891147\n", - " 9.047454\n", - " \n", - " \n", " catboost\n", " 2224.661062\n", " 8.699304e+06\n", @@ -874,69 +573,33 @@ " 9.733325\n", " \n", " \n", - " voting ensemble(uniform weights)\n", - " 2089.214327\n", - " 7.245760e+06\n", - " 8.594828\n", - " 8.838810\n", - " \n", - " \n", - " voting ensemble(custom weights)\n", - " 1961.713172\n", - " 6.152859e+06\n", - " 8.094123\n", - " 8.190290\n", + " voting ensemble\n", + " 1969.545363\n", + " 6.558551e+06\n", + " 8.125364\n", + " 8.257041\n", " \n", " \n", " stacking ensemble\n", - " 2002.657375\n", - " 7.227136e+06\n", - " 8.329696\n", - " 8.461256\n", - " \n", - " \n", - " stacking ensemble + features\n", - " 2012.246021\n", - " 7.284254e+06\n", - " 8.292619\n", - " 8.525519\n", - " \n", - " \n", - " stacking ensemble + features + lasso\n", - " 2012.244690\n", - " 7.284238e+06\n", - " 8.292615\n", - " 8.525514\n", + " 2109.063596\n", + " 8.609287e+06\n", + " 8.694399\n", + " 8.678903\n", " \n", " \n", "\n", "" ], "text/plain": [ - " MAE MSE SMAPE \\\n", - "naive 2437.466667 1.089199e+07 9.949886 \n", - "moving average 1913.826667 6.113701e+06 7.897570 \n", - "prophet 2174.839053 6.577668e+06 8.891147 \n", - "catboost 2224.661062 8.699304e+06 9.095614 \n", - "voting ensemble(uniform weights) 2089.214327 7.245760e+06 8.594828 \n", - "voting ensemble(custom weights) 1961.713172 6.152859e+06 8.094123 \n", - "stacking ensemble 2002.657375 7.227136e+06 8.329696 \n", - "stacking ensemble + features 2012.246021 7.284254e+06 8.292619 \n", - "stacking ensemble + features + lasso 2012.244690 7.284238e+06 8.292615 \n", - "\n", - " MAPE \n", - "naive 10.222106 \n", - "moving average 7.824056 \n", - "prophet 9.047454 \n", - "catboost 9.733325 \n", - "voting ensemble(uniform weights) 8.838810 \n", - "voting ensemble(custom weights) 8.190290 \n", - "stacking ensemble 8.461256 \n", - "stacking ensemble + features 8.525519 \n", - "stacking ensemble + features + lasso 8.525514 " + " MAE MSE SMAPE MAPE\n", + "naive 2437.466667 1.089199e+07 9.949886 10.222106\n", + "moving average 1913.826667 6.113701e+06 7.897570 7.824056\n", + "catboost 2224.661062 8.699304e+06 9.095614 9.733325\n", + "voting ensemble 1969.545363 6.558551e+06 8.125364 8.257041\n", + "stacking ensemble 2109.063596 8.609287e+06 8.694399 8.678903" ] }, - "execution_count": 20, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -946,19 +609,16 @@ " [\n", " metrics,\n", " voting_ensamble_metrics,\n", - " voting_ensamble_custom_weights_metrics,\n", - " stacking_ensamble_unfeatured_metrics,\n", - " stacking_ensamble_featured_metrics,\n", - " stacking_ensamble_final_model_metrics,\n", + " stacking_ensamble_metrics\n", " ]\n", ")\n", - "metrics\n" + "metrics" ] }, { "cell_type": "code", "execution_count": null, - "id": "cfad369f", + "id": "70c0f874", "metadata": {}, "outputs": [], "source": []