{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have gone through a manual process of modeling our dataset, let's see if we can replicate this using an Automated workflow. As a reminder, our plan of action was as follows:\n", "\n", "1. Perform EDA on the dataset to extract valuable insight about the process generating the time series **(COMPLETED)**.\n", "2. Build a baseline model (univariable model without exogenous variables) for benchmarking purposes **(COMPLETED)**.\n", "3. Build a univariate model with all exogenous variables to check best possible performance **(COMPLETED)**.\n", "4. Evaluate the model with exogenous variables and discuss any potential issues **(COMPLETED)**.\n", "5. Overcome issues identified above **(COMPLETED)**.\n", "6. Make future predictions with the best model **(COMPLETED)**.\n", "7. Replicate flow with Automated Time Series Modeling (AutoML) **(Covered in this notebook)**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Only enable critical logging (Optional)\n", "import os\n", "os.environ[\"PYCARET_CUSTOM_LOGGING_LEVEL\"] = \"CRITICAL\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "System:\n", " python: 3.8.13 (default, Mar 28 2022, 06:59:08) [MSC v.1916 64 bit (AMD64)]\n", "executable: C:\\Users\\Nikhil\\.conda\\envs\\pycaret_dev_sktime_0p11_2\\python.exe\n", " machine: Windows-10-10.0.19044-SP0\n", "\n", "PyCaret required dependencies:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Nikhil\\.conda\\envs\\pycaret_dev_sktime_0p11_2\\lib\\site-packages\\_distutils_hack\\__init__.py:30: UserWarning: Setuptools is replacing distutils.\n", " warnings.warn(\"Setuptools is replacing distutils.\")\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " pip: 21.2.2\n", " setuptools: 61.2.0\n", " pycaret: 3.0.0\n", " ipython: Not installed\n", " ipywidgets: 7.7.0\n", " numpy: 1.21.6\n", " pandas: 1.4.2\n", " jinja2: 3.1.2\n", " scipy: 1.8.0\n", " joblib: 1.1.0\n", " sklearn: 1.0.2\n", " pyod: Installed but version unavailable\n", " imblearn: 0.9.0\n", " category_encoders: 2.4.1\n", " lightgbm: 3.3.2\n", " numba: 0.55.1\n", " requests: 2.27.1\n", " matplotlib: 3.5.2\n", " scikitplot: 0.3.7\n", " yellowbrick: 1.4\n", " plotly: 5.8.0\n", " kaleido: 0.2.1\n", " statsmodels: 0.13.2\n", " sktime: 0.11.4\n", " tbats: Installed but version unavailable\n", " pmdarima: 1.8.5\n", "\n", "PyCaret optional dependencies:\n", " shap: Not installed\n", " interpret: Not installed\n", " umap: Not installed\n", " pandas_profiling: Not installed\n", " explainerdashboard: Not installed\n", " autoviz: Not installed\n", " fairlearn: Not installed\n", " xgboost: Not installed\n", " catboost: Not installed\n", " kmodes: Not installed\n", " mlxtend: Not installed\n", " statsforecast: 0.5.5\n", " tune_sklearn: Not installed\n", " ray: Not installed\n", " hyperopt: Not installed\n", " optuna: Not installed\n", " skopt: Not installed\n", " mlflow: 1.25.1\n", " gradio: Not installed\n", " fastapi: Not installed\n", " uvicorn: Not installed\n", " m2cgen: Not installed\n", " evidently: Not installed\n", " nltk: Not installed\n", " pyLDAvis: Not installed\n", " gensim: Not installed\n", " spacy: Not installed\n", " wordcloud: Not installed\n", " textblob: Not installed\n", " psutil: 5.9.0\n", " fugue: Not installed\n", " streamlit: Not installed\n", " prophet: Not installed\n" ] } ], "source": [ "def what_is_installed():\n", " from pycaret import show_versions\n", " show_versions()\n", "\n", "try:\n", " what_is_installed()\n", "except ModuleNotFoundError:\n", " !pip install pycaret\n", " what_is_installed()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from pycaret.datasets import get_data\n", "from pycaret.time_series import TSForecastingExperiment" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Global Figure Settings for notebook ----\n", "global_fig_settings = {\"renderer\": \"notebook\", \"width\": 1000, \"height\": 600}" ] }, { "cell_type": "code", "execution_count": 5, "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", "
CO(GT)NOx(GT)PT08.S3(NOx)RH
index
2004-03-10 18:00:002.6166.01056.048.9
2004-03-10 19:00:002.0103.01174.047.7
2004-03-10 20:00:002.2131.01140.054.0
2004-03-10 21:00:002.2172.01092.060.0
2004-03-10 22:00:001.6131.01205.059.6
\n", "
" ], "text/plain": [ " CO(GT) NOx(GT) PT08.S3(NOx) RH\n", "index \n", "2004-03-10 18:00:00 2.6 166.0 1056.0 48.9\n", "2004-03-10 19:00:00 2.0 103.0 1174.0 47.7\n", "2004-03-10 20:00:00 2.2 131.0 1140.0 54.0\n", "2004-03-10 21:00:00 2.2 172.0 1092.0 60.0\n", "2004-03-10 22:00:00 1.6 131.0 1205.0 59.6" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = get_data(\"airquality\", verbose=False)\n", "data[\"index\"] = pd.to_datetime(data[\"Date\"] + \" \" + data[\"Time\"])\n", "data.drop(columns=[\"Date\", \"Time\"], inplace=True)\n", "data.replace(-200, np.nan, inplace=True)\n", "data.set_index(\"index\", inplace=True)\n", "\n", "target = \"CO(GT)\"\n", "exog_vars = ['NOx(GT)', 'PT08.S3(NOx)', 'RH']\n", "include = [target] + exog_vars\n", "data = data[include]\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 7: AutoML" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "FH=48\n", "metric = \"mase\"\n", "exclude = [\"auto_arima\", \"bats\", \"tbats\", \"lar_cds_dt\", \"par_cds_dt\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 7A: Univariate AutoML with and without Exogenous Variables" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 DescriptionValue
0session_id42
1TargetCO(GT)
2ApproachUnivariate
3Exogenous VariablesPresent
4Original data shape(9357, 4)
5Transformed data shape(9357, 4)
6Transformed train set shape(9309, 4)
7Transformed test set shape(48, 4)
8Rows with missing values25.8%
9Fold GeneratorExpandingWindowSplitter
10Fold Number3
11Enforce Prediction IntervalFalse
12Seasonal Period(s) Tested24
13Seasonality PresentTrue
14Seasonalities Detected[24]
15Primary Seasonality24
16Target Strictly PositiveTrue
17Target White NoiseNo
18Recommended d1
19Recommended Seasonal D0
20PreprocessTrue
21Numerical Imputation (Target)ffill
22Transformation (Target)None
23Scaling (Target)None
24Numerical Imputation (Exogenous)ffill
25Transformation (Exogenous)None
26Scaling (Exogenous)None
27CPU Jobs-1
28Use GPUFalse
29Log ExperimentFalse
30Experiment Namets-default-name
31USIaa6b
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exp_auto = TSForecastingExperiment()\n", "\n", "# enforce_exogenous=False --> Use multivariate forecasting when model supports it, else use univariate forecasting\n", "exp_auto.setup(\n", " data=data, target=target, fh=FH, enforce_exogenous=False,\n", " numeric_imputation_target=\"ffill\", numeric_imputation_exogenous=\"ffill\",\n", " fig_kwargs=global_fig_settings, session_id=42\n", ")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# # Check available models ----\n", "# exp_auto_noexo.models()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelMASERMSSEMAERMSEMAPESMAPER2TT (Sec)
arimaARIMA0.19630.17580.16740.23010.13800.15120.865224.1733
br_cds_dtBayesian Ridge w/ Cond. Deseasonalize & Detrending0.55760.48410.47560.63380.36830.2969-0.01348.9533
ridge_cds_dtRidge w/ Cond. Deseasonalize & Detrending0.56390.48980.48090.64130.37250.2997-0.03678.8033
lr_cds_dtLinear w/ Cond. Deseasonalize & Detrending0.56400.48990.48110.64140.37260.2998-0.03729.2867
omp_cds_dtOrthogonal Matching Pursuit w/ Cond. Deseasonalize & Detrending0.63730.56160.54350.73530.42230.3325-0.40629.1567
exp_smoothExponential Smoothing0.67290.61500.57420.80550.38130.3681-0.02784.5233
thetaTheta Forecaster0.70120.58880.59860.77140.40090.40670.14675.2033
rf_cds_dtRandom Forest w/ Cond. Deseasonalize & Detrending0.71310.58030.60820.75990.48870.3689-0.289625.8700
gbr_cds_dtGradient Boosting w/ Cond. Deseasonalize & Detrending0.71440.57980.60920.75900.51950.3738-0.534218.5533
lightgbm_cds_dtLight Gradient Boosting w/ Cond. Deseasonalize & Detrending0.77320.61650.65940.80720.54270.3930-0.32969.8100
snaiveSeasonal Naive Forecaster0.81750.78470.69721.02750.46450.3643-1.86165.9833
et_cds_dtExtra Trees w/ Cond. Deseasonalize & Detrending0.84100.67290.71730.88100.59270.4188-1.051514.6700
huber_cds_dtHuber w/ Cond. Deseasonalize & Detrending0.86750.66340.74000.86860.61350.4357-0.93049.2500
en_cds_dtElastic Net w/ Cond. Deseasonalize & Detrending0.87200.67120.74380.87890.60330.4312-1.01728.6667
lasso_cds_dtLasso w/ Cond. Deseasonalize & Detrending0.87640.67880.74750.88880.59340.4267-1.06968.9633
naiveNaive Forecaster0.92120.75540.78610.98950.61250.5160-0.37847.1367
crostonCroston0.93370.74640.79660.97750.77440.5053-0.64743.7600
llar_cds_dtLasso Least Angular Regressor w/ Cond. Deseasonalize & Detrending1.05510.77350.89991.01270.83150.5344-2.31128.7700
grand_meansGrand Means Forecaster1.13320.83800.96661.09731.02690.5836-1.87076.4433
knn_cds_dtK Neighbors w/ Cond. Deseasonalize & Detrending1.15070.89520.98141.17210.80980.5266-3.02019.0300
dt_cds_dtDecision Tree w/ Cond. Deseasonalize & Detrending1.21281.08151.03461.41630.87800.5389-2.88799.5533
polytrendPolynomial Trend Forecaster1.26650.91681.08031.20031.17410.6261-2.66104.0433
etsETS1.87341.56721.59852.05281.08190.7912-4.81387.0567
ada_cds_dtAdaBoost w/ Cond. Deseasonalize & Detrending1.97461.40701.68391.84181.71050.7690-10.971012.0200
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Include slower models like Prophet (turbo=False), but exclude some specific models ----\n", "best = exp_auto.compare_models(sort=metric, turbo=False, exclude=exclude)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "exp_auto.plot_model(best)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "final_auto_model = exp_auto.finalize_model(best)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def safe_predict(exp, model):\n", " \"\"\"Prediction wrapper for demo purposes.\"\"\"\n", " try: \n", " future_preds = exp.predict_model(model)\n", " except ValueError as exception:\n", " print(exception)\n", " exo_vars = exp.exogenous_variables\n", " print(f\"{len(exo_vars)} exogenous variables (X) needed in order to make future predictions:\\n{exo_vars}\")\n", " \n", " \n", " exog_exps = []\n", " exog_models = []\n", " for exog_var in exog_vars:\n", " exog_exp = TSForecastingExperiment()\n", " exog_exp.setup(\n", " data=data[exog_var], fh=FH,\n", " numeric_imputation_target=\"ffill\", numeric_imputation_exogenous=\"ffill\",\n", " fig_kwargs=global_fig_settings, session_id=42\n", " )\n", "\n", " # Users can customize how to model future exogenous variables i.e. add\n", " # more steps and models to potentially get better models at the expense\n", " # of higher modeling time.\n", " best = exog_exp.compare_models(\n", " sort=metric, include=[\"arima\", \"ets\", \"exp_smooth\", \"theta\", \"lightgbm_cds_dt\",] \n", " )\n", " final_exog_model = exog_exp.finalize_model(best)\n", "\n", " exog_exps.append(exog_exp)\n", " exog_models.append(final_exog_model)\n", "\n", " # Step 2: Get future predictions for exog variables ----\n", " future_exog = [\n", " exog_exp.predict_model(exog_model)\n", " for exog_exp, exog_model in zip(exog_exps, exog_models)\n", " ]\n", " future_exog = pd.concat(future_exog, axis=1)\n", " future_exog.columns = exog_vars\n", " \n", " future_preds = exp.predict_model(model, X=future_exog)\n", " \n", " return future_preds " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelMASERMSSEMAERMSEMAPESMAPER2TT (Sec)
lightgbm_cds_dtLight Gradient Boosting w/ Cond. Deseasonalize & Detrending1.19901.048611.083613.58790.28620.2304-0.95025.1967
exp_smoothExponential Smoothing1.48901.190413.751015.41400.30370.2478-0.42483.1167
arimaARIMA1.56571.369314.469617.74120.35390.2739-2.11913.7867
thetaTheta Forecaster1.91021.490217.642019.29580.37130.2986-1.26293.2633
etsETS3.45042.655731.865234.38390.62950.4585-6.173310.4200
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "future_preds = safe_predict(exp_auto, final_auto_model)\n", "future_preds.plot()" ] } ], "metadata": { "interpreter": { "hash": "c161a91f6f4623a54f30c5492a42e7cf0592610fb90c8abd312086f09f8fbe0f" }, "kernelspec": { "display_name": "pycaret_sktime_0p11_2", "language": "python", "name": "pycaret_sktime_0p11_2" }, "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.13" } }, "nbformat": 4, "nbformat_minor": 2 }