{
"cells": [
{
"cell_type": "markdown",
"id": "e4793ef5",
"metadata": {},
"source": [
"# Ensembles notebook\n",
"\n",
"\n",
"
\n",
""
]
},
{
"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",
"\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. Working process with the dataset containing more segments will be absolutely the same."
]
},
{
"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": "68918585",
"metadata": {},
"outputs": [],
"source": [
"from etna.pipeline.pipeline import Pipeline"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "0ee58fa6",
"metadata": {},
"outputs": [],
"source": [
"from etna.pipeline import Pipeline\n",
"from etna.models import (\n",
" NaiveModel,\n",
" SeasonalMovingAverageModel,\n",
" CatBoostModelMultiSegment,\n",
")\n",
"from etna.transforms import LagTransform\n",
"from etna.metrics import MAE, MSE, SMAPE, MAPE\n",
"\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": 6,
"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),\n",
" transforms=[],\n",
" horizon=HORIZON,\n",
")\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\", \"catboost\"]\n",
"pipelines = [naive_pipeline, seasonalma_pipeline, catboost_pipeline]"
]
},
{
"cell_type": "markdown",
"id": "106e3885",
"metadata": {},
"source": [
"And evaluate their performance on the backtest"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "53c1a0b9",
"metadata": {
"scrolled": false
},
"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: 0.2s\n",
"[Parallel(n_jobs=5)]: Batch computation too fast (0.0880s.) Setting batch_size=2.\n",
"[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 0.2s remaining: 0.3s\n",
"[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 0.2s remaining: 0.1s\n",
"[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n",
"[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 0.2s\n",
"[Parallel(n_jobs=5)]: Batch computation too fast (0.0887s.) Setting batch_size=2.\n",
"[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 0.2s remaining: 0.3s\n",
"[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 0.2s remaining: 0.1s\n",
"[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=5)]: Using backend MultiprocessingBackend with 5 concurrent workers.\n",
"[Parallel(n_jobs=5)]: Done 1 tasks | elapsed: 9.1s\n",
"[Parallel(n_jobs=5)]: Done 2 out of 5 | elapsed: 9.9s remaining: 14.9s\n",
"[Parallel(n_jobs=5)]: Done 3 out of 5 | elapsed: 10.1s remaining: 6.7s\n",
"[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 10.2s remaining: 0.0s\n",
"[Parallel(n_jobs=5)]: Done 5 out of 5 | elapsed: 10.2s finished\n"
]
}
],
"source": [
"metrics = []\n",
"for pipeline in pipelines:\n",
" metrics.append(\n",
" pipeline.backtest(ts=ts, metrics=[MAE(), MSE(), MAPE()], n_folds=N_FOLDS, aggregate_metrics=True, n_jobs=5,)[\n",
" 0\n",
" ].iloc[:, 1:]\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "928e04bd",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" MAE | \n",
" MSE | \n",
" MAPE | \n",
"
\n",
" \n",
" \n",
" \n",
" naive | \n",
" 2437.466667 | \n",
" 1.089199e+07 | \n",
" 10.222106 | \n",
"
\n",
" \n",
" moving average | \n",
" 1913.826667 | \n",
" 6.113701e+06 | \n",
" 7.824056 | \n",
"
\n",
" \n",
" catboost | \n",
" 2271.766726 | \n",
" 8.923741e+06 | \n",
" 10.013138 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" MAE MSE MAPE\n",
"naive 2437.466667 1.089199e+07 10.222106\n",
"moving average 1913.826667 6.113701e+06 7.824056\n",
"catboost 2271.766726 8.923741e+06 10.013138"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"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": 9,
"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. However, you can specify the weights manually using the `weights` parameter. The higher weight the more you trust the base model. In addition, you can set `weights` with the literal `auto`. In this case, the weights of pipelines are assigned with the importances got from `feature_importance_` property of `regressor`.\n",
"\n",
"*Note*: The `weights` are automatically normalized."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "1c4029fc",
"metadata": {},
"outputs": [],
"source": [
"voting_ensemble = VotingEnsemble(pipelines=pipelines, weights=[1, 9, 4], n_jobs=4)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f1cb83b8",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.2s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.3s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.3s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 2.7s\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 2.9s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.5s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.6s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.8s remaining: 0.0s\n",
"[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 4.7s remaining: 3.1s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.9s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.3s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 6.3s remaining: 0.0s\n",
"[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 6.3s finished\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" MAE | \n",
" MSE | \n",
" SMAPE | \n",
" MAPE | \n",
"
\n",
" \n",
" \n",
" \n",
" voting ensemble | \n",
" 1972.207943 | \n",
" 6.685831e+06 | \n",
" 8.172377 | \n",
" 8.299714 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" MAE MSE SMAPE MAPE\n",
"voting ensemble 1972.207943 6.685831e+06 8.172377 8.299714"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"voting_ensamble_metrics = voting_ensemble.backtest(\n",
" ts=ts,\n",
" metrics=[MAE(), MSE(), SMAPE(), MAPE()],\n",
" n_folds=N_FOLDS,\n",
" aggregate_metrics=True,\n",
" n_jobs=2,\n",
")[0].iloc[:, 1:]\n",
"voting_ensamble_metrics.index = [\"voting ensemble\"]\n",
"voting_ensamble_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`. 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 available features\n",
"\n",
"*Note:* It is possible to use only the features available for the base models."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "273626b1",
"metadata": {},
"outputs": [],
"source": [
"stacking_ensemble_unfeatured = StackingEnsemble(pipelines=pipelines, n_folds=10, n_jobs=4)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "272cc433",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=2)]: Using backend MultiprocessingBackend with 2 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.7s finished\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.8s finished\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 1.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 1.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 1.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 1.0s finished\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 1.0s finished\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 2.3s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 2.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 2.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 2.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 3.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 3.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 5.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 5.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 7.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 7.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 9.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 9.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 11.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 11.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 13.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 13.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 15.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 15.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 17.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 18.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 19.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 19.6s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 22.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 22.2s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 19.8s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 19.9s finished\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 22.5s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 22.6s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.2s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.1s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.3s finished\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=2)]: Done 1 tasks | elapsed: 25.1s\n",
"[Parallel(n_jobs=2)]: Done 2 tasks | elapsed: 25.3s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s finished\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 1.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s finished\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 1.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s finished\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 2.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s finished\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 2.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 1.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 1.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 3.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 3.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 4.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 5.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 6.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 6.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 8.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 8.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 10.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 10.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 12.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 12.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 14.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 15.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 17.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 18.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 21.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 21.3s finished\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 21.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 21.1s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 24.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 23.8s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 24.0s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 23.8s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.0s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 2.1s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[Parallel(n_jobs=2)]: Done 3 out of 5 | elapsed: 51.7s remaining: 34.5s\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s finished\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 1.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 0.3s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 0.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 0.5s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 0.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 0.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 0.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 0.9s finished\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 2.4s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 2 out of 2 | elapsed: 1.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 3 out of 3 | elapsed: 2.8s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 4 out of 4 | elapsed: 3.7s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 5 out of 5 | elapsed: 4.6s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 6 out of 6 | elapsed: 5.2s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 7 out of 7 | elapsed: 5.9s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 8 out of 8 | elapsed: 7.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 9 out of 9 | elapsed: 8.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 9.0s remaining: 0.0s\n",
"[Parallel(n_jobs=1)]: Done 10 out of 10 | elapsed: 9.1s finished\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 11.7s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 11.7s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 1.0s finished\n",
"[Parallel(n_jobs=4)]: Using backend SequentialBackend with 1 concurrent workers.\n",
"[Parallel(n_jobs=4)]: Done 1 out of 1 | elapsed: 0.0s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 2 out of 2 | elapsed: 0.1s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s remaining: 0.0s\n",
"[Parallel(n_jobs=4)]: Done 3 out of 3 | elapsed: 0.2s finished\n",
"[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.1min remaining: 0.0s\n",
"[Parallel(n_jobs=2)]: Done 5 out of 5 | elapsed: 1.1min finished\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" MAE | \n",
" MSE | \n",
" SMAPE | \n",
" MAPE | \n",
"
\n",
" \n",
" \n",
" \n",
" stacking ensemble | \n",
" 2058.487868 | \n",
" 8.182131e+06 | \n",
" 8.508705 | \n",
" 8.50082 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" MAE MSE SMAPE MAPE\n",
"stacking ensemble 2058.487868 8.182131e+06 8.508705 8.50082"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stacking_ensamble_metrics = stacking_ensemble_unfeatured.backtest(\n",
" ts=ts,\n",
" metrics=[MAE(), MSE(), SMAPE(), MAPE()],\n",
" n_folds=N_FOLDS,\n",
" aggregate_metrics=True,\n",
" n_jobs=2,\n",
")[0].iloc[:, 1:]\n",
"stacking_ensamble_metrics.index = [\"stacking ensemble\"]\n",
"stacking_ensamble_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": "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": 15,
"id": "c2f1d397",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" MAE | \n",
" MSE | \n",
" MAPE | \n",
" SMAPE | \n",
"
\n",
" \n",
" \n",
" \n",
" naive | \n",
" 2437.466667 | \n",
" 1.089199e+07 | \n",
" 10.222106 | \n",
" NaN | \n",
"
\n",
" \n",
" moving average | \n",
" 1913.826667 | \n",
" 6.113701e+06 | \n",
" 7.824056 | \n",
" NaN | \n",
"
\n",
" \n",
" catboost | \n",
" 2271.766726 | \n",
" 8.923741e+06 | \n",
" 10.013138 | \n",
" NaN | \n",
"
\n",
" \n",
" voting ensemble | \n",
" 1972.207943 | \n",
" 6.685831e+06 | \n",
" 8.299714 | \n",
" 8.172377 | \n",
"
\n",
" \n",
" stacking ensemble | \n",
" 2058.487868 | \n",
" 8.182131e+06 | \n",
" 8.500820 | \n",
" 8.508705 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" MAE MSE MAPE SMAPE\n",
"naive 2437.466667 1.089199e+07 10.222106 NaN\n",
"moving average 1913.826667 6.113701e+06 7.824056 NaN\n",
"catboost 2271.766726 8.923741e+06 10.013138 NaN\n",
"voting ensemble 1972.207943 6.685831e+06 8.299714 8.172377\n",
"stacking ensemble 2058.487868 8.182131e+06 8.500820 8.508705"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"metrics = pd.concat([metrics, voting_ensamble_metrics, stacking_ensamble_metrics])\n",
"metrics"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9378bcf5",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}