From f9c1b8b6e0f6b71e5d065d03aa79b4b0d1add28b Mon Sep 17 00:00:00 2001 From: Daniel Ciborowski Date: Tue, 3 Mar 2020 12:26:33 -0500 Subject: [PATCH] Fixing AML Example Notebook (#84) * Cleaning notebook output, adding get_or_create workspace call, and fixing get_or_create AmlCompute --- .../azure_automl_forecast.ipynb | 2140 +---------------- 1 file changed, 56 insertions(+), 2084 deletions(-) diff --git a/examples/00_quick_start/azure_automl_forecast.ipynb b/examples/00_quick_start/azure_automl_forecast.ipynb index db91f42b..cce1a92a 100644 --- a/examples/00_quick_start/azure_automl_forecast.ipynb +++ b/examples/00_quick_start/azure_automl_forecast.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -42,20 +42,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "System version: 3.6.10 |Anaconda, Inc.| (default, Jan 7 2020, 21:14:29) \n", - "[GCC 7.3.0]\n", - "This notebook was created using version 1.0.85 of the Azure ML SDK\n", - "You are currently using version 1.0.85 of the Azure ML SDK\n" - ] - } - ], + "outputs": [], "source": [ "import os\n", "import sys\n", @@ -89,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -150,20 +139,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Workspace configuration succeeded. Skip the workspace creation steps below\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", - " ws = Workspace(subscription_id=subscription_id, resource_group=resource_group, workspace_name=workspace_name)\n", + " ws = Workspace.create(subscription_id=subscription_id, resource_group=resource_group, \n", + " name=workspace_name, create_resource_group=True, exist_ok=True, \n", + " location=workspace_region)\n", " # write the details of the workspace to a configuration file to the notebook library\n", " ws.write_config()\n", " print(\"Workspace configuration succeeded. Skip the workspace creation steps below\")\n", @@ -182,28 +165,20 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found existing cpu-cluster\n" - ] - } - ], + "outputs": [], "source": [ "# Choose a name for your CPU cluster\n", "cpu_cluster_name = \"cpu-cluster\"\n", "\n", "# Verify that cluster does not exist already\n", - "try:\n", - " cpu_cluster = ComputeTarget(workspace=ws, name=cpu_cluster_name)\n", + "workspace_compute = ws.compute_targets\n", + "if cpu_cluster_name in workspace_compute:\n", " print(\"Found existing cpu-cluster\")\n", - "except ComputeTargetException:\n", - " raise Exception(\"Creating new cpu-cluster\")\n", - " # print(\"Creating new cpu-cluster\")\n", + " cpu_cluster = ComputeTarget(workspace=ws, name=cpu_cluster_name)\n", + "else: \n", + " print(\"Creating new cpu-cluster\")\n", "\n", " # Specify the configuration for the new cluster\n", " compute_config = AmlCompute.provisioning_configuration(vm_size=\"STANDARD_D2_V2\", min_nodes=4, max_nodes=4)\n", @@ -226,77 +201,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "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", - "
SDK version1.0.85
Workspacechhamlws
SKUBasic
Resource Groupchhamlwsrg
Locationwestcentralus
Run History Nameautoml-ojforecasting
\n", - "
" - ], - "text/plain": [ - " \n", - "SDK version 1.0.85 \n", - "Workspace chhamlws \n", - "SKU Basic \n", - "Resource Group chhamlwsrg \n", - "Location westcentralus \n", - "Run History Name automl-ojforecasting" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# choose a name for the run history container in the workspace\n", "experiment_name = \"automl-ojforecasting\"\n", @@ -335,17 +242,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data already exists at the specified location.\n" - ] - } - ], + "outputs": [], "source": [ "if DOWNLOAD_SPLIT_DATA:\n", " download_ojdata(DATA_DIR)\n", @@ -355,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -369,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -409,32 +308,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Uploading an estimated of 2 files\n", - "Uploading /data/home/chenhui/work/forecasting/ojdata/test.csv\n", - "Uploading /data/home/chenhui/work/forecasting/ojdata/train.csv\n", - "Uploaded /data/home/chenhui/work/forecasting/ojdata/test.csv, 1 files out of an estimated total of 2\n", - "Uploaded /data/home/chenhui/work/forecasting/ojdata/train.csv, 2 files out of an estimated total of 2\n", - "Uploaded 2 files\n" - ] - }, - { - "data": { - "text/plain": [ - "$AZUREML_DATAREFERENCE_915f6f441f974f5cacaf1e031febc60f" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "datastore = ws.get_default_datastore()\n", "datastore.upload_files(files=local_data_pathes, target_path=\"dataset/\", overwrite=True, show_progress=True)" @@ -449,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -458,209 +334,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
storebrandweeklogmoveconstantprice1price2price3price4price5...price7price8price9price10price11dealfeatprofitmoveweek_start
297681113110.4010.030.040.040.030.03...0.040.030.020.020.0200.005.52330241992-03-12
297781113210.3910.030.040.040.040.03...0.030.030.020.020.0211.005.48323841992-03-19
29788111339.3710.050.040.040.030.04...0.030.030.020.020.0200.005.38117761992-03-26
29798111349.3410.040.040.040.030.03...0.040.030.020.020.0200.007.16113921992-04-02
298081113510.5110.040.040.040.040.03...0.040.030.030.020.0211.008.29368641992-04-09
\n", - "

5 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " store brand week logmove constant price1 price2 price3 price4 \\\n", - "2976 8 11 131 10.40 1 0.03 0.04 0.04 0.03 \n", - "2977 8 11 132 10.39 1 0.03 0.04 0.04 0.04 \n", - "2978 8 11 133 9.37 1 0.05 0.04 0.04 0.03 \n", - "2979 8 11 134 9.34 1 0.04 0.04 0.04 0.03 \n", - "2980 8 11 135 10.51 1 0.04 0.04 0.04 0.04 \n", - "\n", - " price5 ... price7 price8 price9 price10 price11 deal \\\n", - "2976 0.03 ... 0.04 0.03 0.02 0.02 0.02 0 \n", - "2977 0.03 ... 0.03 0.03 0.02 0.02 0.02 1 \n", - "2978 0.04 ... 0.03 0.03 0.02 0.02 0.02 0 \n", - "2979 0.03 ... 0.04 0.03 0.02 0.02 0.02 0 \n", - "2980 0.03 ... 0.04 0.03 0.03 0.02 0.02 1 \n", - "\n", - " feat profit move week_start \n", - "2976 0.00 5.52 33024 1992-03-12 \n", - "2977 1.00 5.48 32384 1992-03-19 \n", - "2978 0.00 5.38 11776 1992-03-26 \n", - "2979 0.00 7.16 11392 1992-04-02 \n", - "2980 1.00 8.29 36864 1992-04-09 \n", - "\n", - "[5 rows x 21 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "train_dataset.to_pandas_dataframe().tail()" ] @@ -708,7 +384,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -736,26 +412,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
ExperimentIdTypeStatusDetails PageDocs Page
automl-ojforecastingAutoML_185eaec3-f0be-400a-ab3e-144fae82b764automlStartingLink to Azure Machine Learning studioLink to Documentation
" - ], - "text/plain": [ - "Run(Experiment: automl-ojforecasting,\n", - "Id: AutoML_185eaec3-f0be-400a-ab3e-144fae82b764,\n", - "Type: automl,\n", - "Status: Starting)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "remote_run = experiment.submit(automl_config, show_output=False)\n", "remote_run" @@ -781,24 +440,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('timeseriestransformer', TimeSeriesTransformer(logger=None,\n", - " pipeline_type=)), ('prefittedsoftvotingregressor', PreFittedSoftVotingRegressor(estimators=[('9', Pipeline(memory=None,\n", - " steps=[('minmaxscaler', MinMaxScaler(copy=True, feature_range=(0, 1))), ('gradientboostingregressor', GradientBoostingRegressor(alpha=0.9, criterion='mse', init=None,\n", - " learning_rate=0.1, loss='huber', max_depth=10,\n", - " max_features='s... min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", - " splitter='best'))]))],\n", - " flatten_transform=None,\n", - " weights=[0.5384615384615384, 0.23076923076923078, 0.23076923076923078]))]\n" - ] - } - ], + "outputs": [], "source": [ "best_run, fitted_model = remote_run.get_output()\n", "print(fitted_model.steps)\n", @@ -823,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -833,207 +477,16 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
storebrandweeklogmoveconstantprice1price2price3price4price5price6price7price8price9price10price11dealfeatprofitweek_start
85211368.5910.050.050.050.050.040.050.030.040.030.020.0300.0033.541992-04-16
86211379.1910.040.050.050.040.030.040.030.040.040.020.0300.0020.431992-04-23
87211389.7410.040.040.050.040.040.050.040.040.040.030.0311.0011.291992-04-30
195221369.1410.050.050.050.050.040.050.030.040.030.020.0310.0027.131992-04-16
196221378.7410.040.050.050.040.030.040.030.040.040.020.0300.0033.301992-04-23
\n", - "
" - ], - "text/plain": [ - " store brand week logmove constant price1 price2 price3 price4 \\\n", - "85 2 1 136 8.59 1 0.05 0.05 0.05 0.05 \n", - "86 2 1 137 9.19 1 0.04 0.05 0.05 0.04 \n", - "87 2 1 138 9.74 1 0.04 0.04 0.05 0.04 \n", - "195 2 2 136 9.14 1 0.05 0.05 0.05 0.05 \n", - "196 2 2 137 8.74 1 0.04 0.05 0.05 0.04 \n", - "\n", - " price5 price6 price7 price8 price9 price10 price11 deal feat \\\n", - "85 0.04 0.05 0.03 0.04 0.03 0.02 0.03 0 0.00 \n", - "86 0.03 0.04 0.03 0.04 0.04 0.02 0.03 0 0.00 \n", - "87 0.04 0.05 0.04 0.04 0.04 0.03 0.03 1 1.00 \n", - "195 0.04 0.05 0.03 0.04 0.03 0.02 0.03 1 0.00 \n", - "196 0.03 0.04 0.03 0.04 0.04 0.02 0.03 0 0.00 \n", - "\n", - " profit week_start \n", - "85 33.54 1992-04-16 \n", - "86 20.43 1992-04-23 \n", - "87 11.29 1992-04-30 \n", - "195 27.13 1992-04-16 \n", - "196 33.30 1992-04-23 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "X_test.head()" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1051,209 +504,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
week_startstorebrandpredictedweeklogmoveconstantprice1price2price3...price6price7price8price9price10price11dealfeatprofitmove
01992-04-16215681.581368.5910.050.050.05...0.050.030.040.030.020.0300.0033.545376
11992-04-16227044.851369.1410.050.050.05...0.050.030.040.030.020.0310.0027.139312
21992-04-16233350.331367.8510.050.050.05...0.050.030.040.030.020.0300.0032.552560
31992-04-16243759.641367.4210.050.050.05...0.050.030.040.030.020.0300.0034.981664
41992-04-16255094.801368.5910.050.050.05...0.050.030.040.030.020.0300.0028.805376
\n", - "

5 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " week_start store brand predicted week logmove constant price1 \\\n", - "0 1992-04-16 2 1 5681.58 136 8.59 1 0.05 \n", - "1 1992-04-16 2 2 7044.85 136 9.14 1 0.05 \n", - "2 1992-04-16 2 3 3350.33 136 7.85 1 0.05 \n", - "3 1992-04-16 2 4 3759.64 136 7.42 1 0.05 \n", - "4 1992-04-16 2 5 5094.80 136 8.59 1 0.05 \n", - "\n", - " price2 price3 ... price6 price7 price8 price9 price10 price11 \\\n", - "0 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", - "1 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", - "2 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", - "3 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", - "4 0.05 0.05 ... 0.05 0.03 0.04 0.03 0.02 0.03 \n", - "\n", - " deal feat profit move \n", - "0 0 0.00 33.54 5376 \n", - "1 1 0.00 27.13 9312 \n", - "2 0 0.00 32.55 2560 \n", - "3 0 0.00 34.98 1664 \n", - "4 0 0.00 28.80 5376 \n", - "\n", - "[5 rows x 22 columns]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pred_automl = align_outputs(y_predictions, X_trans, X_test, y_test, target_column_name)\n", "pred_automl.head()" @@ -1268,1050 +521,9 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Test data scores]\n", - "\n", - "explained_variance: 0.350\n", - "r2_score: 0.348\n", - "spearman_correlation: 0.810\n", - "mean_absolute_percentage_error: 105.761\n", - "mean_absolute_error: 6474.420\n", - "normalized_mean_absolute_error: 0.045\n", - "median_absolute_error: 2811.380\n", - "normalized_median_absolute_error: 0.019\n", - "root_mean_squared_error: 14786.120\n", - "normalized_root_mean_squared_error: 0.102\n", - "root_mean_squared_log_error: 0.787\n", - "normalized_root_mean_squared_log_error: 0.124\n" - ] - }, - { - "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Use automl metrics module\n", "scores = metrics.compute_metrics_regression(\n", @@ -2344,17 +556,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAPE of forecasts obtained by AutoML in the last two weeks: 107.56218463381626\n" - ] - } - ], + "outputs": [], "source": [ "pred_automl_sub = pred_automl.loc[pred_automl.week >= max(test_df.week) - NUM_TEST_PERIODS + GAP]\n", "mape_automl_sub = MAPE(pred_automl_sub[\"predicted\"], pred_automl_sub[\"move\"]) * 100\n", @@ -2379,7 +583,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2418,209 +622,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
week_startpredictionstorebrandweeklogmoveconstantprice1price2price3...price11dealfeatprofitmovepriceavg_priceprice_ratiomove_lag1move_lag2
01992-04-1612507211368.5910.050.050.05...0.0300.0033.5453760.050.041.2712416.0028096.00
11992-04-2317664211379.1910.040.050.05...0.0300.0020.4397920.040.041.115376.0012416.00
21992-04-3021670211389.7410.040.040.05...0.0311.0011.29169600.040.040.949792.005376.00
31992-04-169551221369.1410.050.050.05...0.0310.0027.1393120.050.041.2111424.004992.00
41992-04-237452221378.7410.040.050.05...0.0300.0033.3062400.050.041.399312.0011424.00
\n", - "

5 rows × 27 columns

\n", - "
" - ], - "text/plain": [ - " week_start prediction store brand week logmove constant price1 \\\n", - "0 1992-04-16 12507 2 1 136 8.59 1 0.05 \n", - "1 1992-04-23 17664 2 1 137 9.19 1 0.04 \n", - "2 1992-04-30 21670 2 1 138 9.74 1 0.04 \n", - "3 1992-04-16 9551 2 2 136 9.14 1 0.05 \n", - "4 1992-04-23 7452 2 2 137 8.74 1 0.04 \n", - "\n", - " price2 price3 ... price11 deal feat profit move price \\\n", - "0 0.05 0.05 ... 0.03 0 0.00 33.54 5376 0.05 \n", - "1 0.05 0.05 ... 0.03 0 0.00 20.43 9792 0.04 \n", - "2 0.04 0.05 ... 0.03 1 1.00 11.29 16960 0.04 \n", - "3 0.05 0.05 ... 0.03 1 0.00 27.13 9312 0.05 \n", - "4 0.05 0.05 ... 0.03 0 0.00 33.30 6240 0.05 \n", - "\n", - " avg_price price_ratio move_lag1 move_lag2 \n", - "0 0.04 1.27 12416.00 28096.00 \n", - "1 0.04 1.11 5376.00 12416.00 \n", - "2 0.04 0.94 9792.00 5376.00 \n", - "3 0.04 1.21 11424.00 4992.00 \n", - "4 0.04 1.39 9312.00 11424.00 \n", - "\n", - "[5 rows x 27 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Split data into training and test sets\n", "train_df, test_df = split_last_n_by_grain(df_sub, NUM_TEST_PERIODS)\n", @@ -2650,17 +654,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAPE of forecasts obtained by multiple linear regression on entire test period: 83.90865445283927\n" - ] - } - ], + "outputs": [], "source": [ "mape_lr_entire = MAPE(pred_lr[\"prediction\"], pred_lr[\"move\"]) * 100\n", "print(\"MAPE of forecasts obtained by multiple linear regression on entire test period: \" + str(mape_lr_entire))" @@ -2668,17 +664,9 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAPE of forecasts obtained by multiple linear regression in the last two weeks: 72.11741385279376\n" - ] - } - ], + "outputs": [], "source": [ "pred_lr_sub = pred_lr.loc[pred_lr.week >= max(test_df.week) - NUM_TEST_PERIODS + GAP]\n", "mape_lr_sub = MAPE(pred_lr_sub[\"prediction\"], pred_lr_sub[\"move\"]) * 100\n", @@ -2696,7 +684,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2711,17 +699,9 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAPE of forecasts obtained by the combined model on entire test period: 80.89857577119083\n" - ] - } - ], + "outputs": [], "source": [ "mape_entire = MAPE(pred_final[\"combined_prediction\"], pred_final[\"move\"]) * 100\n", "print(\"MAPE of forecasts obtained by the combined model on entire test period: \" + str(mape_entire))" @@ -2729,17 +709,9 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAPE of forecasts obtained by the combined model in the last two weeks: 74.51782264415391\n" - ] - } - ], + "outputs": [], "source": [ "pred_final_sub = pred_final.loc[pred_final.week >= max(test_df.week) - NUM_TEST_PERIODS + GAP]\n", "mape_final_sub = MAPE(pred_final_sub[\"combined_prediction\"], pred_final_sub[\"move\"]) * 100\n", @@ -2781,4 +753,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file