{
"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",
" CO(GT) | \n",
" NOx(GT) | \n",
" PT08.S3(NOx) | \n",
" RH | \n",
"
\n",
" \n",
" index | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2004-03-10 18:00:00 | \n",
" 2.6 | \n",
" 166.0 | \n",
" 1056.0 | \n",
" 48.9 | \n",
"
\n",
" \n",
" 2004-03-10 19:00:00 | \n",
" 2.0 | \n",
" 103.0 | \n",
" 1174.0 | \n",
" 47.7 | \n",
"
\n",
" \n",
" 2004-03-10 20:00:00 | \n",
" 2.2 | \n",
" 131.0 | \n",
" 1140.0 | \n",
" 54.0 | \n",
"
\n",
" \n",
" 2004-03-10 21:00:00 | \n",
" 2.2 | \n",
" 172.0 | \n",
" 1092.0 | \n",
" 60.0 | \n",
"
\n",
" \n",
" 2004-03-10 22:00:00 | \n",
" 1.6 | \n",
" 131.0 | \n",
" 1205.0 | \n",
" 59.6 | \n",
"
\n",
" \n",
"
\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",
" Description | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" session_id | \n",
" 42 | \n",
"
\n",
" \n",
" 1 | \n",
" Target | \n",
" CO(GT) | \n",
"
\n",
" \n",
" 2 | \n",
" Approach | \n",
" Univariate | \n",
"
\n",
" \n",
" 3 | \n",
" Exogenous Variables | \n",
" Present | \n",
"
\n",
" \n",
" 4 | \n",
" Original data shape | \n",
" (9357, 4) | \n",
"
\n",
" \n",
" 5 | \n",
" Transformed data shape | \n",
" (9357, 4) | \n",
"
\n",
" \n",
" 6 | \n",
" Transformed train set shape | \n",
" (9309, 4) | \n",
"
\n",
" \n",
" 7 | \n",
" Transformed test set shape | \n",
" (48, 4) | \n",
"
\n",
" \n",
" 8 | \n",
" Rows with missing values | \n",
" 25.8% | \n",
"
\n",
" \n",
" 9 | \n",
" Fold Generator | \n",
" ExpandingWindowSplitter | \n",
"
\n",
" \n",
" 10 | \n",
" Fold Number | \n",
" 3 | \n",
"
\n",
" \n",
" 11 | \n",
" Enforce Prediction Interval | \n",
" False | \n",
"
\n",
" \n",
" 12 | \n",
" Seasonal Period(s) Tested | \n",
" 24 | \n",
"
\n",
" \n",
" 13 | \n",
" Seasonality Present | \n",
" True | \n",
"
\n",
" \n",
" 14 | \n",
" Seasonalities Detected | \n",
" [24] | \n",
"
\n",
" \n",
" 15 | \n",
" Primary Seasonality | \n",
" 24 | \n",
"
\n",
" \n",
" 16 | \n",
" Target Strictly Positive | \n",
" True | \n",
"
\n",
" \n",
" 17 | \n",
" Target White Noise | \n",
" No | \n",
"
\n",
" \n",
" 18 | \n",
" Recommended d | \n",
" 1 | \n",
"
\n",
" \n",
" 19 | \n",
" Recommended Seasonal D | \n",
" 0 | \n",
"
\n",
" \n",
" 20 | \n",
" Preprocess | \n",
" True | \n",
"
\n",
" \n",
" 21 | \n",
" Numerical Imputation (Target) | \n",
" ffill | \n",
"
\n",
" \n",
" 22 | \n",
" Transformation (Target) | \n",
" None | \n",
"
\n",
" \n",
" 23 | \n",
" Scaling (Target) | \n",
" None | \n",
"
\n",
" \n",
" 24 | \n",
" Numerical Imputation (Exogenous) | \n",
" ffill | \n",
"
\n",
" \n",
" 25 | \n",
" Transformation (Exogenous) | \n",
" None | \n",
"
\n",
" \n",
" 26 | \n",
" Scaling (Exogenous) | \n",
" None | \n",
"
\n",
" \n",
" 27 | \n",
" CPU Jobs | \n",
" -1 | \n",
"
\n",
" \n",
" 28 | \n",
" Use GPU | \n",
" False | \n",
"
\n",
" \n",
" 29 | \n",
" Log Experiment | \n",
" False | \n",
"
\n",
" \n",
" 30 | \n",
" Experiment Name | \n",
" ts-default-name | \n",
"
\n",
" \n",
" 31 | \n",
" USI | \n",
" aa6b | \n",
"
\n",
" \n",
"
\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",
" Model | \n",
" MASE | \n",
" RMSSE | \n",
" MAE | \n",
" RMSE | \n",
" MAPE | \n",
" SMAPE | \n",
" R2 | \n",
" TT (Sec) | \n",
"
\n",
" \n",
" \n",
" \n",
" arima | \n",
" ARIMA | \n",
" 0.1963 | \n",
" 0.1758 | \n",
" 0.1674 | \n",
" 0.2301 | \n",
" 0.1380 | \n",
" 0.1512 | \n",
" 0.8652 | \n",
" 24.1733 | \n",
"
\n",
" \n",
" br_cds_dt | \n",
" Bayesian Ridge w/ Cond. Deseasonalize & Detrending | \n",
" 0.5576 | \n",
" 0.4841 | \n",
" 0.4756 | \n",
" 0.6338 | \n",
" 0.3683 | \n",
" 0.2969 | \n",
" -0.0134 | \n",
" 8.9533 | \n",
"
\n",
" \n",
" ridge_cds_dt | \n",
" Ridge w/ Cond. Deseasonalize & Detrending | \n",
" 0.5639 | \n",
" 0.4898 | \n",
" 0.4809 | \n",
" 0.6413 | \n",
" 0.3725 | \n",
" 0.2997 | \n",
" -0.0367 | \n",
" 8.8033 | \n",
"
\n",
" \n",
" lr_cds_dt | \n",
" Linear w/ Cond. Deseasonalize & Detrending | \n",
" 0.5640 | \n",
" 0.4899 | \n",
" 0.4811 | \n",
" 0.6414 | \n",
" 0.3726 | \n",
" 0.2998 | \n",
" -0.0372 | \n",
" 9.2867 | \n",
"
\n",
" \n",
" omp_cds_dt | \n",
" Orthogonal Matching Pursuit w/ Cond. Deseasonalize & Detrending | \n",
" 0.6373 | \n",
" 0.5616 | \n",
" 0.5435 | \n",
" 0.7353 | \n",
" 0.4223 | \n",
" 0.3325 | \n",
" -0.4062 | \n",
" 9.1567 | \n",
"
\n",
" \n",
" exp_smooth | \n",
" Exponential Smoothing | \n",
" 0.6729 | \n",
" 0.6150 | \n",
" 0.5742 | \n",
" 0.8055 | \n",
" 0.3813 | \n",
" 0.3681 | \n",
" -0.0278 | \n",
" 4.5233 | \n",
"
\n",
" \n",
" theta | \n",
" Theta Forecaster | \n",
" 0.7012 | \n",
" 0.5888 | \n",
" 0.5986 | \n",
" 0.7714 | \n",
" 0.4009 | \n",
" 0.4067 | \n",
" 0.1467 | \n",
" 5.2033 | \n",
"
\n",
" \n",
" rf_cds_dt | \n",
" Random Forest w/ Cond. Deseasonalize & Detrending | \n",
" 0.7131 | \n",
" 0.5803 | \n",
" 0.6082 | \n",
" 0.7599 | \n",
" 0.4887 | \n",
" 0.3689 | \n",
" -0.2896 | \n",
" 25.8700 | \n",
"
\n",
" \n",
" gbr_cds_dt | \n",
" Gradient Boosting w/ Cond. Deseasonalize & Detrending | \n",
" 0.7144 | \n",
" 0.5798 | \n",
" 0.6092 | \n",
" 0.7590 | \n",
" 0.5195 | \n",
" 0.3738 | \n",
" -0.5342 | \n",
" 18.5533 | \n",
"
\n",
" \n",
" lightgbm_cds_dt | \n",
" Light Gradient Boosting w/ Cond. Deseasonalize & Detrending | \n",
" 0.7732 | \n",
" 0.6165 | \n",
" 0.6594 | \n",
" 0.8072 | \n",
" 0.5427 | \n",
" 0.3930 | \n",
" -0.3296 | \n",
" 9.8100 | \n",
"
\n",
" \n",
" snaive | \n",
" Seasonal Naive Forecaster | \n",
" 0.8175 | \n",
" 0.7847 | \n",
" 0.6972 | \n",
" 1.0275 | \n",
" 0.4645 | \n",
" 0.3643 | \n",
" -1.8616 | \n",
" 5.9833 | \n",
"
\n",
" \n",
" et_cds_dt | \n",
" Extra Trees w/ Cond. Deseasonalize & Detrending | \n",
" 0.8410 | \n",
" 0.6729 | \n",
" 0.7173 | \n",
" 0.8810 | \n",
" 0.5927 | \n",
" 0.4188 | \n",
" -1.0515 | \n",
" 14.6700 | \n",
"
\n",
" \n",
" huber_cds_dt | \n",
" Huber w/ Cond. Deseasonalize & Detrending | \n",
" 0.8675 | \n",
" 0.6634 | \n",
" 0.7400 | \n",
" 0.8686 | \n",
" 0.6135 | \n",
" 0.4357 | \n",
" -0.9304 | \n",
" 9.2500 | \n",
"
\n",
" \n",
" en_cds_dt | \n",
" Elastic Net w/ Cond. Deseasonalize & Detrending | \n",
" 0.8720 | \n",
" 0.6712 | \n",
" 0.7438 | \n",
" 0.8789 | \n",
" 0.6033 | \n",
" 0.4312 | \n",
" -1.0172 | \n",
" 8.6667 | \n",
"
\n",
" \n",
" lasso_cds_dt | \n",
" Lasso w/ Cond. Deseasonalize & Detrending | \n",
" 0.8764 | \n",
" 0.6788 | \n",
" 0.7475 | \n",
" 0.8888 | \n",
" 0.5934 | \n",
" 0.4267 | \n",
" -1.0696 | \n",
" 8.9633 | \n",
"
\n",
" \n",
" naive | \n",
" Naive Forecaster | \n",
" 0.9212 | \n",
" 0.7554 | \n",
" 0.7861 | \n",
" 0.9895 | \n",
" 0.6125 | \n",
" 0.5160 | \n",
" -0.3784 | \n",
" 7.1367 | \n",
"
\n",
" \n",
" croston | \n",
" Croston | \n",
" 0.9337 | \n",
" 0.7464 | \n",
" 0.7966 | \n",
" 0.9775 | \n",
" 0.7744 | \n",
" 0.5053 | \n",
" -0.6474 | \n",
" 3.7600 | \n",
"
\n",
" \n",
" llar_cds_dt | \n",
" Lasso Least Angular Regressor w/ Cond. Deseasonalize & Detrending | \n",
" 1.0551 | \n",
" 0.7735 | \n",
" 0.8999 | \n",
" 1.0127 | \n",
" 0.8315 | \n",
" 0.5344 | \n",
" -2.3112 | \n",
" 8.7700 | \n",
"
\n",
" \n",
" grand_means | \n",
" Grand Means Forecaster | \n",
" 1.1332 | \n",
" 0.8380 | \n",
" 0.9666 | \n",
" 1.0973 | \n",
" 1.0269 | \n",
" 0.5836 | \n",
" -1.8707 | \n",
" 6.4433 | \n",
"
\n",
" \n",
" knn_cds_dt | \n",
" K Neighbors w/ Cond. Deseasonalize & Detrending | \n",
" 1.1507 | \n",
" 0.8952 | \n",
" 0.9814 | \n",
" 1.1721 | \n",
" 0.8098 | \n",
" 0.5266 | \n",
" -3.0201 | \n",
" 9.0300 | \n",
"
\n",
" \n",
" dt_cds_dt | \n",
" Decision Tree w/ Cond. Deseasonalize & Detrending | \n",
" 1.2128 | \n",
" 1.0815 | \n",
" 1.0346 | \n",
" 1.4163 | \n",
" 0.8780 | \n",
" 0.5389 | \n",
" -2.8879 | \n",
" 9.5533 | \n",
"
\n",
" \n",
" polytrend | \n",
" Polynomial Trend Forecaster | \n",
" 1.2665 | \n",
" 0.9168 | \n",
" 1.0803 | \n",
" 1.2003 | \n",
" 1.1741 | \n",
" 0.6261 | \n",
" -2.6610 | \n",
" 4.0433 | \n",
"
\n",
" \n",
" ets | \n",
" ETS | \n",
" 1.8734 | \n",
" 1.5672 | \n",
" 1.5985 | \n",
" 2.0528 | \n",
" 1.0819 | \n",
" 0.7912 | \n",
" -4.8138 | \n",
" 7.0567 | \n",
"
\n",
" \n",
" ada_cds_dt | \n",
" AdaBoost w/ Cond. Deseasonalize & Detrending | \n",
" 1.9746 | \n",
" 1.4070 | \n",
" 1.6839 | \n",
" 1.8418 | \n",
" 1.7105 | \n",
" 0.7690 | \n",
" -10.9710 | \n",
" 12.0200 | \n",
"
\n",
" \n",
"
\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",
" Model | \n",
" MASE | \n",
" RMSSE | \n",
" MAE | \n",
" RMSE | \n",
" MAPE | \n",
" SMAPE | \n",
" R2 | \n",
" TT (Sec) | \n",
"
\n",
" \n",
" \n",
" \n",
" lightgbm_cds_dt | \n",
" Light Gradient Boosting w/ Cond. Deseasonalize & Detrending | \n",
" 1.1990 | \n",
" 1.0486 | \n",
" 11.0836 | \n",
" 13.5879 | \n",
" 0.2862 | \n",
" 0.2304 | \n",
" -0.9502 | \n",
" 5.1967 | \n",
"
\n",
" \n",
" exp_smooth | \n",
" Exponential Smoothing | \n",
" 1.4890 | \n",
" 1.1904 | \n",
" 13.7510 | \n",
" 15.4140 | \n",
" 0.3037 | \n",
" 0.2478 | \n",
" -0.4248 | \n",
" 3.1167 | \n",
"
\n",
" \n",
" arima | \n",
" ARIMA | \n",
" 1.5657 | \n",
" 1.3693 | \n",
" 14.4696 | \n",
" 17.7412 | \n",
" 0.3539 | \n",
" 0.2739 | \n",
" -2.1191 | \n",
" 3.7867 | \n",
"
\n",
" \n",
" theta | \n",
" Theta Forecaster | \n",
" 1.9102 | \n",
" 1.4902 | \n",
" 17.6420 | \n",
" 19.2958 | \n",
" 0.3713 | \n",
" 0.2986 | \n",
" -1.2629 | \n",
" 3.2633 | \n",
"
\n",
" \n",
" ets | \n",
" ETS | \n",
" 3.4504 | \n",
" 2.6557 | \n",
" 31.8652 | \n",
" 34.3839 | \n",
" 0.6295 | \n",
" 0.4585 | \n",
" -6.1733 | \n",
" 10.4200 | \n",
"
\n",
" \n",
"
\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": [
"