Skip to content

Instantly share code, notes, and snippets.

@ohmeow
Created July 16, 2023 21:55
Show Gist options
  • Save ohmeow/4cd9342f7c901d6396a8d489c6fbac44 to your computer and use it in GitHub Desktop.
Save ohmeow/4cd9342f7c901d6396a8d489c6fbac44 to your computer and use it in GitHub Desktop.
Corise Forecasting - Project 4
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project 4: End-to-End Workflow"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the final project I introduced a number of updates to my work in project #3. They include:\n",
"- Shifting heavy data preprocessing to `polars` (huge speed improvements there)\n",
"- Caching datasets, fold train/eval datasets, fold features/models, and fold results\n",
"- Using `fast.ai` for putting datasets into formats suitable for decision trees, GBDTs, and NNs\n",
"- Ensembling and weighting model predictions\n",
"- Inference on new data\n",
"\n",
"Things to improve:\n",
"- Adding a simple FF NN to the mix \n",
"- Adding transformer based TS models to the mix\n",
"- Refactor everything into an ML pipeline that can be run as a whole\n",
"- Persist features, fold data, models, results in something a bit more maintable (e.g., S3 buckets, etc...)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# add imports\n",
"import json, joblib, pickle\n",
"import datetime as dt\n",
"from pathlib import Path\n",
"\n",
"import lightgbm as lgbm\n",
"import pandas as pd\n",
"import polars as pl\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import torch\n",
"\n",
"from fastai.data.transforms import ColSplitter\n",
"from fastai.metrics import mse, rmse, mae, msle, exp_rmspe\n",
"from fastai.tabular.core import TabularPandas, Categorify, FillMissing, Normalize, add_datepart, add_elapsed_times\n",
"from fastai.tabular.learner import tabular_learner\n",
"from scipy.optimize import minimize\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"\n",
"\n",
"pl.enable_string_cache(True)\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"data_path = \"./data\"\n",
"models_path = \"./models\"\n",
"results_path = \"./results\"\n",
"\n",
"level = \"id\"\n",
"forecast_horizon = 28\n",
"use_pd = False\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 1: Build Dataset\n",
"\n",
"\"You can fit the models at any level you want (just make sure both are fit at the same level), but I'd recommend trying out `item_id`. It's a little faster than at the `id` level, and it gives both models a good opportunity to show their diversity.\"\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"def get_data_by_level(raw_sales_df: pl.DataFrame, level: str = \"id\"):\n",
" aggs = {\"state_id\": pl.col(\"state_id\").first(), \"sales\": pl.col(\"sales\").sum()}\n",
"\n",
" if level == \"id\":\n",
" aggs.update(\n",
" {\n",
" \"item_id\": pl.col(\"item_id\").first(),\n",
" \"dept_id\": pl.col(\"dept_id\").first(),\n",
" \"cat_id\": pl.col(\"cat_id\").first(),\n",
" \"store_id\": pl.col(\"store_id\").first(),\n",
" }\n",
" )\n",
" elif level == \"item_id\":\n",
" aggs.update(\n",
" {\n",
" \"dept_id\": pl.col(\"dept_id\").first(),\n",
" \"cat_id\": pl.col(\"cat_id\").first(),\n",
" \"store_id\": pl.col(\"store_id\").first(),\n",
" }\n",
" )\n",
" elif level == \"dept_id\":\n",
" aggs.update(\n",
" {\n",
" \"cat_id\": pl.col(\"cat_id\").first(),\n",
" \"store_id\": pl.col(\"store_id\").first(),\n",
" }\n",
" )\n",
" elif level == \"cat_id\":\n",
" aggs.update(\n",
" {\n",
" \"store_id\": pl.col(\"store_id\").first(),\n",
" }\n",
" )\n",
"\n",
" df = raw_sales_df.groupby([level, \"date\"], maintain_order=True).agg(list(aggs.values()))\n",
" return df\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"def calc_lag(df: pl.DataFrame, shift_length: int, forecast_horizon: int, level: str = \"id\", by_day_of_week: bool = False):\n",
" \"\"\"Use to create lagged features\"\"\"\n",
" group_cols = [level]\n",
"\n",
" if not by_day_of_week:\n",
" feature_name = f\"lag_{shift_length}_{forecast_horizon}\"\n",
" else:\n",
" feature_name = f\"seasonal_lag_{shift_length}_{forecast_horizon}\"\n",
" group_cols += [\"Dayofweek\"]\n",
"\n",
" lag_df = df.clone()\n",
" return (\n",
" lag_df.with_columns(shifted_sales=pl.col(\"sales\").shift(forecast_horizon + shift_length).over(group_cols)).rename(\n",
" {\"shifted_sales\": feature_name}\n",
" )\n",
" ), feature_name\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"def calc_rolling_agg(\n",
" df: pl.DataFrame, window_length: int, forecast_horizon: int, agg_func: str = \"mean\", level: str = \"id\", by_day_of_week: bool = False\n",
"):\n",
" \"\"\"Use to create rolling aggregations\"\"\"\n",
" group_cols = [level]\n",
"\n",
" if not by_day_of_week:\n",
" feature_name = f\"rolling_{agg_func}_{window_length}_{forecast_horizon}\"\n",
" else:\n",
" feature_name = f\"seasonal_rolling_{agg_func}_{window_length}_{forecast_horizon}\"\n",
" group_cols += [\"Dayofweek\"]\n",
"\n",
" roll_df = df.clone()\n",
" return (\n",
" roll_df.with_columns(\n",
" sales=pl.col(\"sales\").rolling_mean(window_length, min_periods=1).over(group_cols)\n",
" if agg_func == \"mean\"\n",
" else pl.col(\"sales\").rolling_std(window_length, min_periods=1).over(group_cols)\n",
" )\n",
" .with_columns(date=pl.col(\"date\").dt.offset_by(f\"{forecast_horizon}d\"))\n",
" .rename({\"sales\": feature_name})\n",
" ), feature_name\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"def add_new_feature(df: pl.DataFrame, feat_df: pl.DataFrame, feat_name: str, level: str = \"id\"):\n",
" \"\"\"Use to append created lag/rolling features to full dataset\"\"\"\n",
" return df.join(feat_df[[\"date\", level, feat_name]], on=[\"date\", \"id\"], how=\"left\")\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"def add_target_features(\n",
" df: pl.DataFrame,\n",
" level: str = \"id\",\n",
" lag_features: list[int] = [],\n",
" seasonal_lag_features: list[int] = [],\n",
" rolling_features: dict[str, list[int]] = {},\n",
" seasonal_rolling_features: dict[str, list[int]] = {},\n",
"):\n",
" \"\"\"Apply feature engineering to add additional features to our full and train/eval datasets\"\"\"\n",
" df = df.clone()\n",
"\n",
" # calculate lag/rolling features\n",
" for lag in lag_features:\n",
" feat_df, feature_name = calc_lag(df, lag, forecast_horizon, level=level, by_day_of_week=False)\n",
" df = add_new_feature(df, feat_df, feature_name, level=level)\n",
"\n",
" for lag in seasonal_lag_features:\n",
" feat_df, feature_name = calc_lag(df, lag, forecast_horizon, level=level, by_day_of_week=True)\n",
" df = add_new_feature(df, feat_df, feature_name, level=level)\n",
"\n",
" for agg_func, windows in rolling_features.items():\n",
" for window in windows:\n",
" feat_df, feature_name = calc_rolling_agg(df, window, forecast_horizon, agg_func=agg_func, level=level, by_day_of_week=False)\n",
" df = add_new_feature(df, feat_df, feature_name, level=level)\n",
"\n",
" for agg_func, windows in seasonal_rolling_features.items():\n",
" for window in windows:\n",
" feat_df, feature_name = calc_rolling_agg(df, window, forecast_horizon, agg_func=agg_func, level=level, by_day_of_week=True)\n",
" df = add_new_feature(df, feat_df, feature_name, level=level)\n",
"\n",
" return df\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def build_dataset(\n",
" data_fpath: str,\n",
" latest_sales_df: pd.DataFrame|None = None,\n",
" level: str = \"id\",\n",
" forecast_horizon: int = 28,\n",
" lag_features: list[int] = [],\n",
" seasonal_lag_features: list[int] = [],\n",
" rolling_features: dict[str, list[int]] = {},\n",
" seasonal_rolling_features: dict[str, list[int]] = {},\n",
" cache: bool = True,\n",
" override: bool = False,\n",
"):\n",
" if latest_sales_df is None:\n",
" raw_sales_df = get_data_by_level(pl.read_parquet(f\"{data_fpath}/sales_data.parquet\"), level=level)\n",
" else:\n",
" raw_sales_df = get_data_by_level(pl.from_pandas(latest_sales_df), level=level)\n",
" \n",
" max_yyyymmdd = raw_sales_df[\"date\"].max().strftime(\"%Y%m%d\")\n",
" raw_train_fpath = Path(f\"{data_fpath}/{max_yyyymmdd}_data_fh_{forecast_horizon}.parquet\")\n",
"\n",
" if not override and raw_train_fpath.exists():\n",
" return pd.read_parquet(raw_train_fpath)\n",
" \n",
" # drop records until we start seeing sales (some products don't start showing sales for some time)\n",
" # we only care about no gaps by product!\n",
" raw_sales_df = raw_sales_df.filter(pl.col(\"sales\").cumsum().over(\"id\").gt(0))\n",
" \n",
" # merge prices\n",
" prices_df = pl.read_parquet(f\"{data_fpath}/prices.parquet\")\n",
" merged_df = raw_sales_df.join(prices_df, how=\"left\", on=[\"date\", \"store_id\", \"item_id\"])\n",
"\n",
" # merge calendar\n",
" calendar_df = pl.read_parquet(f\"{data_fpath}/calendar.parquet\")\n",
"\n",
" calendar_df = calendar_df.with_columns(\n",
" is_holiday=pl.when((pl.col(\"event_name_1\").is_not_null()) & (pl.col(\"event_name_2\").is_not_null())).then(True).otherwise(False)\n",
" )\n",
"\n",
" big_event_1s = [\n",
" \"SuperBowl\",\n",
" \"MemorialDay\",\n",
" \"NewYear\",\n",
" \"Christmas\",\n",
" \"Thanksgiving\",\n",
" \"IndependenceDay\",\n",
" \"Halloween\",\n",
" \"LaborDay\",\n",
" \"Cinco De Mayo\",\n",
" \"Easter\",\n",
" ]\n",
"\n",
" calendar_df = calendar_df.with_columns(is_big_holiday=pl.when(pl.col(\"event_name_1\").is_in(big_event_1s)).then(True).otherwise(False))\n",
"\n",
" # add in elapsed times for key events (by state)\n",
" calendar_df = calendar_df.to_pandas()\n",
" calendar_df[\"base_field\"] = \"cal\"\n",
" calendar_df = add_elapsed_times(calendar_df, [\"snap_TX\", \"is_holiday\", \"is_big_holiday\"], \"date\", \"base_field\")\n",
" calendar_df = calendar_df.drop(\"base_field\", axis=1)\n",
" calendar_df = pl.from_pandas(calendar_df)\n",
"\n",
" merged_df = merged_df.join(calendar_df, how=\"left\", on=[\"date\"])\n",
" \n",
"\n",
" # add dateparts\n",
" merged_df = merged_df.to_pandas()\n",
" merged_df = add_datepart(merged_df, \"date\", prefix=None, drop=False, time=False)\n",
" merged_df = pl.from_pandas(merged_df)\n",
"\n",
" # add base target features (lags, olling averages, etc..)\n",
" merged_df = add_target_features(\n",
" merged_df,\n",
" level=level,\n",
" lag_features=lag_features,\n",
" seasonal_lag_features=seasonal_lag_features,\n",
" rolling_features=rolling_features,\n",
" seasonal_rolling_features=seasonal_rolling_features,\n",
" )\n",
"\n",
" merged_df = merged_df.to_pandas()\n",
" if cache:\n",
" merged_df.to_parquet(raw_train_fpath)\n",
"\n",
" return merged_df\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 2: `TabularPandas`\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10298579\n",
"CPU times: user 24.1 s, sys: 20.1 s, total: 44.2 s\n",
"Wall time: 11.8 s\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>date</th>\n",
" <th>state_id</th>\n",
" <th>sales</th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>sell_price</th>\n",
" <th>snap_TX</th>\n",
" <th>...</th>\n",
" <th>seasonal_rolling_mean_2_28</th>\n",
" <th>seasonal_rolling_mean_4_28</th>\n",
" <th>seasonal_rolling_mean_12_28</th>\n",
" <th>seasonal_rolling_mean_26_28</th>\n",
" <th>seasonal_rolling_mean_52_28</th>\n",
" <th>seasonal_rolling_std_2_28</th>\n",
" <th>seasonal_rolling_std_4_28</th>\n",
" <th>seasonal_rolling_std_12_28</th>\n",
" <th>seasonal_rolling_std_26_28</th>\n",
" <th>seasonal_rolling_std_52_28</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>FOODS_1_004_TX_1_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_1</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>FOODS_1_004_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>FOODS_1_004_TX_3_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>4</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_3</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>FOODS_1_005_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>1</td>\n",
" <td>FOODS_1_005</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>3.28</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>FOODS_1_009_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>3</td>\n",
" <td>FOODS_1_009</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>2.68</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 71 columns</p>\n",
"</div>"
],
"text/plain": [
" id date state_id sales item_id \\\n",
"0 FOODS_1_004_TX_1_evaluation 2013-01-01 TX 20 FOODS_1_004 \n",
"1 FOODS_1_004_TX_2_evaluation 2013-01-01 TX 20 FOODS_1_004 \n",
"2 FOODS_1_004_TX_3_evaluation 2013-01-01 TX 4 FOODS_1_004 \n",
"3 FOODS_1_005_TX_2_evaluation 2013-01-01 TX 1 FOODS_1_005 \n",
"4 FOODS_1_009_TX_2_evaluation 2013-01-01 TX 3 FOODS_1_009 \n",
"\n",
" dept_id cat_id store_id sell_price snap_TX ... \\\n",
"0 FOODS_1 FOODS TX_1 1.78 True ... \n",
"1 FOODS_1 FOODS TX_2 1.78 True ... \n",
"2 FOODS_1 FOODS TX_3 1.78 True ... \n",
"3 FOODS_1 FOODS TX_2 3.28 True ... \n",
"4 FOODS_1 FOODS TX_2 2.68 True ... \n",
"\n",
" seasonal_rolling_mean_2_28 seasonal_rolling_mean_4_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_mean_12_28 seasonal_rolling_mean_26_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_mean_52_28 seasonal_rolling_std_2_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_std_4_28 seasonal_rolling_std_12_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_std_26_28 seasonal_rolling_std_52_28 \n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
"[5 rows x 71 columns]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"\n",
"lag_features = [1, 2, 3, 7, 14, 21, 30, 90, 365]\n",
"seasonal_lag_features = [1, 2, 4, 12, 26, 52]\n",
"\n",
"rolling_features = {\"mean\": [7, 14], \"std\": [7, 14]}\n",
"seasonal_rolling_features = {\"mean\": [1, 2, 4, 12, 26, 52], \"std\": [2, 4, 12, 26, 52]} # a std for 1 results in all NaNs (why???)\n",
"\n",
"df = build_dataset(\n",
" data_path,\n",
" level=\"id\",\n",
" forecast_horizon=28,\n",
" lag_features=lag_features,\n",
" seasonal_lag_features=seasonal_lag_features,\n",
" rolling_features=rolling_features,\n",
" seasonal_rolling_features=seasonal_rolling_features,\n",
")\n",
"\n",
"print(len(df))\n",
"df.head()\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### A. Build Train/Evaluation Splits\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"def build_train_test_splits(df, forecast_horizon=28, fold=1):\n",
" \"\"\"Creates the train/eval split based on `forecast_horizon`\"\"\"\n",
"\n",
" # create our train/eval splits by `forecast_horizon` * fold\n",
" test_days_start = dt.timedelta(days=forecast_horizon * fold)\n",
" forecast_horizon_days = test_days_start - dt.timedelta(days=forecast_horizon)\n",
"\n",
" train_filter = df[\"date\"] <= (df[\"date\"].max() - test_days_start)\n",
" test_filter = (df[\"date\"] > (df[\"date\"].max() - test_days_start)) & (df[\"date\"] <= (df[\"date\"].max() - forecast_horizon_days))\n",
"\n",
" train_df, test_df = df.loc[train_filter, :].copy(), df.loc[test_filter, :].copy()\n",
"\n",
" # add 'is_valid' column (helpful if you need to concat the datasets and split them back out)\n",
" train_df.loc[:, \"is_valid\"] = False\n",
" test_df.loc[:, \"is_valid\"] = True\n",
"\n",
" return train_df, test_df\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2013-01-01 00:00:00 2016-05-22 00:00:00\n",
"2013-01-01 00:00:00 2016-03-27 00:00:00\n",
"2016-03-28 00:00:00 2016-04-24 00:00:00\n"
]
}
],
"source": [
"train_df, test_df = build_train_test_splits(df, forecast_horizon=forecast_horizon, fold=2)\n",
"\n",
"print(df.date.min(), df.date.max())\n",
"print(train_df.date.min(), train_df.date.max())\n",
"print(test_df.date.min(), test_df.date.max())\n"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2013-01-01 00:00:00 2016-05-22 00:00:00\n",
"2013-01-01 00:00:00 2016-04-24 00:00:00\n",
"2016-04-25 00:00:00 2016-05-22 00:00:00\n"
]
}
],
"source": [
"train_df, test_df = build_train_test_splits(df, forecast_horizon=forecast_horizon, fold=1)\n",
"\n",
"print(df.date.min(), df.date.max())\n",
"print(train_df.date.min(), train_df.date.max())\n",
"print(test_df.date.min(), test_df.date.max())\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### B. Add Global/Grouped Aggregations\n",
"\n",
"Notes:\n",
"\n",
"1. \"A common example in retail _(that may help you on the project)_ is taking the average sales at different product hierarchy levels, so averages grouped by category, averages grouped by departments, averages grouped by department and store, etc.\"\n",
"\n",
"2. \"But, **be very careful!** All of these aggregations **can ONLY be calculated on the training set!** Including the validation set leaks information about the validation set to the model while it's training, which is information it certainly won't have in Production.\"\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"def add_group_features(train_df, test_df):\n",
" train_df = pl.from_pandas(train_df)\n",
" test_df = pl.from_pandas(test_df)\n",
"\n",
" for hierarchy_level in [\"id\", \"item_id\", \"dept_id\", \"cat_id\", \"store_id\"]:\n",
" price_feats_df = train_df.groupby(hierarchy_level, maintain_order=True).agg(\n",
" [\n",
" pl.col(\"sell_price\").max().alias(f\"max_price_{hierarchy_level}\"),\n",
" pl.col(\"sell_price\").median().alias(f\"median_price_{hierarchy_level}\"),\n",
" ]\n",
" )\n",
"\n",
" train_df = train_df.join(price_feats_df.clone(), on=hierarchy_level, how=\"left\")\n",
" test_df = test_df.join(price_feats_df.clone(), on=hierarchy_level, how=\"left\")\n",
"\n",
" return train_df.to_pandas(), test_df.to_pandas()\n"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 20.5 s, sys: 7.62 s, total: 28.1 s\n",
"Wall time: 11.8 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"train_df, test_df = add_group_features(train_df, test_df)\n",
"test_df = test_df.fillna(0)\n"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['id', 'date', 'state_id', 'sales', 'item_id', 'dept_id', 'cat_id',\n",
" 'store_id', 'sell_price', 'snap_TX', 'event_name_1', 'event_type_1',\n",
" 'event_name_2', 'event_type_2', 'is_holiday', 'is_big_holiday',\n",
" 'Aftersnap_TX', 'Afteris_holiday', 'Afteris_big_holiday',\n",
" 'Beforesnap_TX', 'Beforeis_holiday', 'Beforeis_big_holiday',\n",
" 'snap_TX_bw', 'is_holiday_bw', 'is_big_holiday_bw', 'snap_TX_fw',\n",
" 'is_holiday_fw', 'is_big_holiday_fw', 'Year', 'Month', 'Week', 'Day',\n",
" 'Dayofweek', 'Dayofyear', 'Is_month_end', 'Is_month_start',\n",
" 'Is_quarter_end', 'Is_quarter_start', 'Is_year_end', 'Is_year_start',\n",
" 'Elapsed', 'lag_1_28', 'lag_2_28', 'lag_3_28', 'lag_7_28', 'lag_14_28',\n",
" 'lag_21_28', 'lag_30_28', 'lag_90_28', 'lag_365_28',\n",
" 'seasonal_lag_1_28', 'seasonal_lag_2_28', 'seasonal_lag_4_28',\n",
" 'seasonal_lag_12_28', 'seasonal_lag_26_28', 'seasonal_lag_52_28',\n",
" 'rolling_mean_7_28', 'rolling_mean_14_28', 'rolling_std_7_28',\n",
" 'rolling_std_14_28', 'seasonal_rolling_mean_1_28',\n",
" 'seasonal_rolling_mean_2_28', 'seasonal_rolling_mean_4_28',\n",
" 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28',\n",
" 'seasonal_rolling_mean_52_28', 'seasonal_rolling_std_2_28',\n",
" 'seasonal_rolling_std_4_28', 'seasonal_rolling_std_12_28',\n",
" 'seasonal_rolling_std_26_28', 'seasonal_rolling_std_52_28', 'is_valid',\n",
" 'max_price_id', 'median_price_id', 'max_price_item_id',\n",
" 'median_price_item_id', 'max_price_dept_id', 'median_price_dept_id',\n",
" 'max_price_cat_id', 'median_price_cat_id', 'max_price_store_id',\n",
" 'median_price_store_id'],\n",
" dtype='object')"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df.columns\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### C. Build `TabularPandas` object\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training Features:\n",
"['lag_1_28', 'lag_2_28', 'lag_3_28', 'lag_7_28', 'lag_14_28', 'lag_21_28', 'lag_30_28', 'lag_90_28', 'lag_365_28', 'seasonal_lag_1_28', 'seasonal_lag_2_28', 'seasonal_lag_4_28', 'seasonal_lag_12_28', 'seasonal_lag_26_28', 'seasonal_lag_52_28', 'rolling_mean_7_28', 'rolling_mean_14_28', 'rolling_std_7_28', 'rolling_std_14_28', 'seasonal_rolling_mean_1_28', 'seasonal_rolling_mean_2_28', 'seasonal_rolling_mean_4_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_mean_52_28', 'seasonal_rolling_std_2_28', 'seasonal_rolling_std_4_28', 'seasonal_rolling_std_12_28', 'seasonal_rolling_std_26_28', 'seasonal_rolling_std_52_28', 'Aftersnap_TX', 'Afteris_holiday', 'Afteris_big_holiday', 'Beforesnap_TX', 'Beforeis_holiday', 'Beforeis_big_holiday', 'max_price_id', 'median_price_id', 'max_price_item_id', 'median_price_item_id', 'max_price_dept_id', 'median_price_dept_id', 'max_price_cat_id', 'median_price_cat_id', 'max_price_store_id', 'median_price_store_id', 'id', 'item_id', 'dept_id', 'cat_id', 'store_id', 'snap_TX', 'event_name_1', 'event_type_1', 'event_name_2', 'event_type_2', 'Month', 'Day', 'Dayofweek', 'Is_month_end', 'Is_month_start', 'is_holiday', 'is_big_holiday', 'snap_TX_bw', 'snap_TX_fw']\n",
"\n",
"10298579\n"
]
}
],
"source": [
"# --- for full dataset ---\n",
"cont_features = [\n",
" \"lag_1_28\",\n",
" \"lag_2_28\",\n",
" \"lag_3_28\",\n",
" \"lag_7_28\",\n",
" \"lag_14_28\",\n",
" \"lag_21_28\",\n",
" \"lag_30_28\",\n",
" \"lag_90_28\",\n",
" \"lag_365_28\",\n",
" \"seasonal_lag_1_28\",\n",
" \"seasonal_lag_2_28\",\n",
" \"seasonal_lag_4_28\",\n",
" \"seasonal_lag_12_28\",\n",
" \"seasonal_lag_26_28\",\n",
" \"seasonal_lag_52_28\",\n",
" \"rolling_mean_7_28\",\n",
" \"rolling_mean_14_28\",\n",
" \"rolling_std_7_28\",\n",
" \"rolling_std_14_28\",\n",
" \"seasonal_rolling_mean_1_28\",\n",
" \"seasonal_rolling_mean_2_28\",\n",
" \"seasonal_rolling_mean_4_28\",\n",
" \"seasonal_rolling_mean_12_28\",\n",
" \"seasonal_rolling_mean_26_28\",\n",
" \"seasonal_rolling_mean_52_28\",\n",
" # \"seasonal_rolling_std_1_28\",\n",
" \"seasonal_rolling_std_2_28\",\n",
" \"seasonal_rolling_std_4_28\",\n",
" \"seasonal_rolling_std_12_28\",\n",
" \"seasonal_rolling_std_26_28\",\n",
" \"seasonal_rolling_std_52_28\",\n",
" \"Aftersnap_TX\",\n",
" \"Afteris_holiday\",\n",
" \"Afteris_big_holiday\",\n",
" \"Beforesnap_TX\",\n",
" \"Beforeis_holiday\",\n",
" \"Beforeis_big_holiday\",\n",
" \"max_price_id\",\n",
" \"median_price_id\",\n",
" \"max_price_item_id\",\n",
" \"median_price_item_id\",\n",
" \"max_price_dept_id\",\n",
" \"median_price_dept_id\",\n",
" \"max_price_cat_id\",\n",
" \"median_price_cat_id\",\n",
" \"max_price_store_id\",\n",
" \"median_price_store_id\",\n",
"]\n",
"\n",
"cat_features = [\n",
" \"id\",\n",
" \"item_id\",\n",
" \"dept_id\",\n",
" \"cat_id\",\n",
" \"store_id\",\n",
" \"snap_TX\",\n",
" \"event_name_1\",\n",
" \"event_type_1\",\n",
" \"event_name_2\",\n",
" \"event_type_2\",\n",
" \"Month\",\n",
" \"Day\",\n",
" \"Dayofweek\",\n",
" \"Is_month_end\",\n",
" \"Is_month_start\",\n",
" \"is_holiday\",\n",
" \"is_big_holiday\",\n",
" \"snap_TX_bw\",\n",
" \"snap_TX_fw\",\n",
"]\n",
"\n",
"features = cont_features + cat_features\n",
"target_attr = \"sales\"\n",
"\n",
"print(f\"Training Features:\\n{features}\\n\")\n",
"print(len(train_df) + len(test_df))\n"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10298579\n"
]
}
],
"source": [
"combined_df = pd.concat([train_df, test_df])\n",
"print(len(combined_df))\n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"splits = ColSplitter(col=\"is_valid\")(combined_df)\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"procs = [Categorify, FillMissing, Normalize]\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"to = TabularPandas(combined_df, procs, cat_names=cat_features, cont_names=cont_features, y_names=target_attr, splits=splits)\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"def build_fold_to(\n",
" df: pd.DataFrame,\n",
" cat_features,\n",
" cont_features,\n",
" target_attr,\n",
" forecast_horizon: int = 28,\n",
" fold: int = 1,\n",
" data_fpath: str = \"./data\",\n",
" cache: bool = True,\n",
" override: bool = False,\n",
"):\n",
" max_yyyymmdd = df[\"date\"].max().strftime(\"%Y%m%d\")\n",
" to_fpath = Path(f\"{data_fpath}/{max_yyyymmdd}_to_fh_{forecast_horizon}_fold_{fold}.pkl\")\n",
"\n",
" if not override and to_fpath.exists():\n",
" with open(to_fpath, \"rb\") as file:\n",
" to = pickle.load(file)\n",
" else:\n",
" train_df, test_df = build_train_test_splits(df, forecast_horizon=forecast_horizon, fold=fold)\n",
" train_df, test_df = add_group_features(train_df, test_df)\n",
" \n",
" test_df = test_df.fillna(0)\n",
" \n",
" combined_df = pd.concat([train_df.copy(), test_df.copy()])\n",
"\n",
" splits = ColSplitter(col=\"is_valid\")(combined_df)\n",
" procs = [Categorify, FillMissing, Normalize]\n",
"\n",
" to = TabularPandas(combined_df, procs, cat_names=cat_features, cont_names=cont_features, y_names=target_attr, splits=splits)\n",
"\n",
" if cache:\n",
" with open(to_fpath, \"wb\") as file:\n",
" pickle.dump(to, file)\n",
"\n",
" return to\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 41.6 ms, sys: 2.11 s, total: 2.15 s\n",
"Wall time: 2.87 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"to = build_fold_to(df, cat_features, cont_features, target_attr, forecast_horizon=forecast_horizon, fold= 2, data_fpath=data_path)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>snap_TX</th>\n",
" <th>event_name_1</th>\n",
" <th>event_type_1</th>\n",
" <th>event_name_2</th>\n",
" <th>event_type_2</th>\n",
" <th>Month</th>\n",
" <th>Day</th>\n",
" <th>Dayofweek</th>\n",
" <th>Is_month_end</th>\n",
" <th>Is_month_start</th>\n",
" <th>is_holiday</th>\n",
" <th>is_big_holiday</th>\n",
" <th>snap_TX_bw</th>\n",
" <th>snap_TX_fw</th>\n",
" <th>lag_1_28_na</th>\n",
" <th>lag_2_28_na</th>\n",
" <th>lag_3_28_na</th>\n",
" <th>lag_7_28_na</th>\n",
" <th>lag_14_28_na</th>\n",
" <th>lag_21_28_na</th>\n",
" <th>lag_30_28_na</th>\n",
" <th>lag_90_28_na</th>\n",
" <th>lag_365_28_na</th>\n",
" <th>seasonal_lag_1_28_na</th>\n",
" <th>seasonal_lag_2_28_na</th>\n",
" <th>seasonal_lag_4_28_na</th>\n",
" <th>seasonal_lag_12_28_na</th>\n",
" <th>seasonal_lag_26_28_na</th>\n",
" <th>seasonal_lag_52_28_na</th>\n",
" <th>rolling_mean_7_28_na</th>\n",
" <th>rolling_mean_14_28_na</th>\n",
" <th>rolling_std_7_28_na</th>\n",
" <th>rolling_std_14_28_na</th>\n",
" <th>seasonal_rolling_mean_1_28_na</th>\n",
" <th>seasonal_rolling_mean_2_28_na</th>\n",
" <th>seasonal_rolling_mean_4_28_na</th>\n",
" <th>seasonal_rolling_mean_12_28_na</th>\n",
" <th>seasonal_rolling_mean_26_28_na</th>\n",
" <th>seasonal_rolling_mean_52_28_na</th>\n",
" <th>seasonal_rolling_std_2_28_na</th>\n",
" <th>seasonal_rolling_std_4_28_na</th>\n",
" <th>seasonal_rolling_std_12_28_na</th>\n",
" <th>seasonal_rolling_std_26_28_na</th>\n",
" <th>seasonal_rolling_std_52_28_na</th>\n",
" <th>lag_1_28</th>\n",
" <th>lag_2_28</th>\n",
" <th>lag_3_28</th>\n",
" <th>lag_7_28</th>\n",
" <th>lag_14_28</th>\n",
" <th>lag_21_28</th>\n",
" <th>lag_30_28</th>\n",
" <th>lag_90_28</th>\n",
" <th>lag_365_28</th>\n",
" <th>seasonal_lag_1_28</th>\n",
" <th>seasonal_lag_2_28</th>\n",
" <th>seasonal_lag_4_28</th>\n",
" <th>seasonal_lag_12_28</th>\n",
" <th>seasonal_lag_26_28</th>\n",
" <th>seasonal_lag_52_28</th>\n",
" <th>rolling_mean_7_28</th>\n",
" <th>rolling_mean_14_28</th>\n",
" <th>rolling_std_7_28</th>\n",
" <th>rolling_std_14_28</th>\n",
" <th>seasonal_rolling_mean_1_28</th>\n",
" <th>seasonal_rolling_mean_2_28</th>\n",
" <th>seasonal_rolling_mean_4_28</th>\n",
" <th>seasonal_rolling_mean_12_28</th>\n",
" <th>seasonal_rolling_mean_26_28</th>\n",
" <th>seasonal_rolling_mean_52_28</th>\n",
" <th>seasonal_rolling_std_2_28</th>\n",
" <th>seasonal_rolling_std_4_28</th>\n",
" <th>seasonal_rolling_std_12_28</th>\n",
" <th>seasonal_rolling_std_26_28</th>\n",
" <th>seasonal_rolling_std_52_28</th>\n",
" <th>Aftersnap_TX</th>\n",
" <th>Afteris_holiday</th>\n",
" <th>Afteris_big_holiday</th>\n",
" <th>Beforesnap_TX</th>\n",
" <th>Beforeis_holiday</th>\n",
" <th>Beforeis_big_holiday</th>\n",
" <th>max_price_id</th>\n",
" <th>median_price_id</th>\n",
" <th>max_price_item_id</th>\n",
" <th>median_price_item_id</th>\n",
" <th>max_price_dept_id</th>\n",
" <th>median_price_dept_id</th>\n",
" <th>max_price_cat_id</th>\n",
" <th>median_price_cat_id</th>\n",
" <th>max_price_store_id</th>\n",
" <th>median_price_store_id</th>\n",
" <th>sales</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>FOODS_1_004_TX_1_evaluation</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_1</td>\n",
" <td>True</td>\n",
" <td>NewYear</td>\n",
" <td>National</td>\n",
" <td>#na#</td>\n",
" <td>#na#</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>1.0</td>\n",
" <td>5.0</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.428571</td>\n",
" <td>0.428571</td>\n",
" <td>0.690066</td>\n",
" <td>0.699293</td>\n",
" <td>0.0</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.416667</td>\n",
" <td>0.466667</td>\n",
" <td>0.5</td>\n",
" <td>0.0</td>\n",
" <td>0.5</td>\n",
" <td>0.6742</td>\n",
" <td>0.761577</td>\n",
" <td>0.816497</td>\n",
" <td>0.0</td>\n",
" <td>618.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-124.0</td>\n",
" <td>0.0</td>\n",
" <td>1.96</td>\n",
" <td>1.96</td>\n",
" <td>1.96</td>\n",
" <td>1.96</td>\n",
" <td>12.98</td>\n",
" <td>2.48</td>\n",
" <td>18.98</td>\n",
" <td>2.68</td>\n",
" <td>48.779999</td>\n",
" <td>3.42</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>FOODS_1_004_TX_2_evaluation</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>True</td>\n",
" <td>NewYear</td>\n",
" <td>National</td>\n",
" <td>#na#</td>\n",
" <td>#na#</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>1.0</td>\n",
" <td>5.0</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.428571</td>\n",
" <td>0.428571</td>\n",
" <td>0.690066</td>\n",
" <td>0.699293</td>\n",
" <td>0.0</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.416667</td>\n",
" <td>0.466667</td>\n",
" <td>0.5</td>\n",
" <td>0.0</td>\n",
" <td>0.5</td>\n",
" <td>0.6742</td>\n",
" <td>0.761577</td>\n",
" <td>0.816497</td>\n",
" <td>0.0</td>\n",
" <td>618.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-124.0</td>\n",
" <td>0.0</td>\n",
" <td>1.96</td>\n",
" <td>1.78</td>\n",
" <td>1.96</td>\n",
" <td>1.96</td>\n",
" <td>12.98</td>\n",
" <td>2.48</td>\n",
" <td>18.98</td>\n",
" <td>2.68</td>\n",
" <td>29.969999</td>\n",
" <td>3.42</td>\n",
" <td>20</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"to.show(2) # display raw categorical labels\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>date</th>\n",
" <th>state_id</th>\n",
" <th>sales</th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>sell_price</th>\n",
" <th>snap_TX</th>\n",
" <th>...</th>\n",
" <th>seasonal_rolling_mean_2_28_na</th>\n",
" <th>seasonal_rolling_mean_4_28_na</th>\n",
" <th>seasonal_rolling_mean_12_28_na</th>\n",
" <th>seasonal_rolling_mean_26_28_na</th>\n",
" <th>seasonal_rolling_mean_52_28_na</th>\n",
" <th>seasonal_rolling_std_2_28_na</th>\n",
" <th>seasonal_rolling_std_4_28_na</th>\n",
" <th>seasonal_rolling_std_12_28_na</th>\n",
" <th>seasonal_rolling_std_26_28_na</th>\n",
" <th>seasonal_rolling_std_52_28_na</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1.78</td>\n",
" <td>2</td>\n",
" <td>...</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>11</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1.78</td>\n",
" <td>2</td>\n",
" <td>...</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>12</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1.78</td>\n",
" <td>2</td>\n",
" <td>...</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3 rows × 112 columns</p>\n",
"</div>"
],
"text/plain": [
" id date state_id sales item_id dept_id cat_id store_id \\\n",
"0 10 2013-01-01 TX 20 4 1 1 1 \n",
"1 11 2013-01-01 TX 20 4 1 1 2 \n",
"2 12 2013-01-01 TX 4 4 1 1 3 \n",
"\n",
" sell_price snap_TX ... seasonal_rolling_mean_2_28_na \\\n",
"0 1.78 2 ... 2 \n",
"1 1.78 2 ... 2 \n",
"2 1.78 2 ... 2 \n",
"\n",
" seasonal_rolling_mean_4_28_na seasonal_rolling_mean_12_28_na \\\n",
"0 2 2 \n",
"1 2 2 \n",
"2 2 2 \n",
"\n",
" seasonal_rolling_mean_26_28_na seasonal_rolling_mean_52_28_na \\\n",
"0 2 2 \n",
"1 2 2 \n",
"2 2 2 \n",
"\n",
" seasonal_rolling_std_2_28_na seasonal_rolling_std_4_28_na \\\n",
"0 2 2 \n",
"1 2 2 \n",
"2 2 2 \n",
"\n",
" seasonal_rolling_std_12_28_na seasonal_rolling_std_26_28_na \\\n",
"0 2 2 \n",
"1 2 2 \n",
"2 2 2 \n",
"\n",
" seasonal_rolling_std_52_28_na \n",
"0 2 \n",
"1 2 \n",
"2 2 \n",
"\n",
"[3 rows x 112 columns]"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to.items.head(3) # display numeric representations\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['#na#', False, True]"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to.classes[\"is_big_holiday\"] # display categorical levels\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 3: Train\n"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training Features:\n",
"['lag_1_28', 'lag_2_28', 'lag_3_28', 'lag_7_28', 'lag_14_28', 'lag_21_28', 'lag_30_28', 'lag_90_28', 'lag_365_28', 'seasonal_lag_1_28', 'seasonal_lag_2_28', 'seasonal_lag_4_28', 'seasonal_lag_12_28', 'seasonal_lag_26_28', 'seasonal_lag_52_28', 'rolling_mean_7_28', 'rolling_mean_14_28', 'rolling_std_7_28', 'rolling_std_14_28', 'seasonal_rolling_mean_1_28', 'seasonal_rolling_mean_2_28', 'seasonal_rolling_mean_4_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_mean_52_28', 'seasonal_rolling_std_2_28', 'seasonal_rolling_std_4_28', 'seasonal_rolling_std_12_28', 'seasonal_rolling_std_26_28', 'seasonal_rolling_std_52_28', 'Aftersnap_TX', 'Afteris_holiday', 'Afteris_big_holiday', 'Beforesnap_TX', 'Beforeis_holiday', 'Beforeis_big_holiday', 'max_price_id', 'median_price_id', 'max_price_item_id', 'median_price_item_id', 'max_price_dept_id', 'median_price_dept_id', 'max_price_cat_id', 'median_price_cat_id', 'max_price_store_id', 'median_price_store_id', 'id', 'item_id', 'dept_id', 'cat_id', 'store_id', 'snap_TX', 'event_name_1', 'event_type_1', 'event_name_2', 'event_type_2', 'Month', 'Day', 'Dayofweek', 'Is_month_end', 'Is_month_start', 'is_holiday', 'is_big_holiday', 'snap_TX_bw', 'snap_TX_fw']\n",
"\n",
"10298579\n"
]
}
],
"source": [
"# --- for full dataset ---\n",
"cont_features = [\n",
" \"lag_1_28\",\n",
" \"lag_2_28\",\n",
" \"lag_3_28\",\n",
" \"lag_7_28\",\n",
" \"lag_14_28\",\n",
" \"lag_21_28\",\n",
" \"lag_30_28\",\n",
" \"lag_90_28\",\n",
" \"lag_365_28\",\n",
" \"seasonal_lag_1_28\",\n",
" \"seasonal_lag_2_28\",\n",
" \"seasonal_lag_4_28\",\n",
" \"seasonal_lag_12_28\",\n",
" \"seasonal_lag_26_28\",\n",
" \"seasonal_lag_52_28\",\n",
" \"rolling_mean_7_28\",\n",
" \"rolling_mean_14_28\",\n",
" \"rolling_std_7_28\",\n",
" \"rolling_std_14_28\",\n",
" \"seasonal_rolling_mean_1_28\",\n",
" \"seasonal_rolling_mean_2_28\",\n",
" \"seasonal_rolling_mean_4_28\",\n",
" \"seasonal_rolling_mean_12_28\",\n",
" \"seasonal_rolling_mean_26_28\",\n",
" \"seasonal_rolling_mean_52_28\",\n",
" # \"seasonal_rolling_std_1_28\",\n",
" \"seasonal_rolling_std_2_28\",\n",
" \"seasonal_rolling_std_4_28\",\n",
" \"seasonal_rolling_std_12_28\",\n",
" \"seasonal_rolling_std_26_28\",\n",
" \"seasonal_rolling_std_52_28\",\n",
" \"Aftersnap_TX\",\n",
" \"Afteris_holiday\",\n",
" \"Afteris_big_holiday\",\n",
" \"Beforesnap_TX\",\n",
" \"Beforeis_holiday\",\n",
" \"Beforeis_big_holiday\",\n",
" \"max_price_id\",\n",
" \"median_price_id\",\n",
" \"max_price_item_id\",\n",
" \"median_price_item_id\",\n",
" \"max_price_dept_id\",\n",
" \"median_price_dept_id\",\n",
" \"max_price_cat_id\",\n",
" \"median_price_cat_id\",\n",
" \"max_price_store_id\",\n",
" \"median_price_store_id\",\n",
"]\n",
"\n",
"cat_features = [\n",
" \"id\",\n",
" \"item_id\",\n",
" \"dept_id\",\n",
" \"cat_id\",\n",
" \"store_id\",\n",
" \"snap_TX\",\n",
" \"event_name_1\",\n",
" \"event_type_1\",\n",
" \"event_name_2\",\n",
" \"event_type_2\",\n",
" \"Month\",\n",
" \"Day\",\n",
" \"Dayofweek\",\n",
" \"Is_month_end\",\n",
" \"Is_month_start\",\n",
" \"is_holiday\",\n",
" \"is_big_holiday\",\n",
" \"snap_TX_bw\",\n",
" \"snap_TX_fw\",\n",
"]\n",
"\n",
"features = cont_features + cat_features\n",
"target_attr = \"sales\"\n",
"\n",
"print(f\"Training Features:\\n{features}\\n\")\n",
"print(len(train_df) + len(test_df))\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10298579\n",
"CPU times: user 21.9 s, sys: 34 s, total: 55.8 s\n",
"Wall time: 17.4 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# load to from the file using pickle\n",
"lag_features = [1, 2, 3, 7, 14, 21, 30, 90, 365]\n",
"seasonal_lag_features = [1, 2, 4, 12, 26, 52]\n",
"\n",
"rolling_features = {\"mean\": [7, 14], \"std\": [7, 14]}\n",
"seasonal_rolling_features = {\"mean\": [1, 2, 4, 12, 26, 52], \"std\": [2, 4, 12, 26, 52]} # a std for 1 results in all NaNs (why???)\n",
"\n",
"df = build_dataset(\n",
" data_path,\n",
" level=\"id\",\n",
" forecast_horizon=28,\n",
" lag_features=lag_features,\n",
" seasonal_lag_features=seasonal_lag_features,\n",
" rolling_features=rolling_features,\n",
" seasonal_rolling_features=seasonal_rolling_features,\n",
")\n",
"\n",
"print(len(df))\n",
"df.head()\n",
"\n",
"to = build_fold_to(df, cat_features, cont_features, target_attr, forecast_horizon=forecast_horizon, fold= 1, data_fpath=data_path)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"# our core evaluation metric\n",
"def rmsse(train_df, val_df, y_pred):\n",
" train_scale_df = (\n",
" train_df.assign(\n",
" scale=train_df.groupby(\"id\").sales.diff() ** 2,\n",
" )\n",
" .groupby(\"id\")\n",
" .scale.mean()\n",
" )\n",
"\n",
" score_df = (\n",
" val_df.assign(squared_error=(val_df.sales - y_pred) ** 2)\n",
" .groupby(\"id\")\n",
" .squared_error.mean()\n",
" .to_frame()\n",
" .merge(train_scale_df, on=\"id\")\n",
" .assign(rmsse=lambda x: np.sqrt(x.squared_error / x.scale))\n",
" )\n",
" mean_score = score_df.rmsse.mean()\n",
"\n",
" return score_df, mean_score\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### Random Forest\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 13.2 s, sys: 24.2 s, total: 37.4 s\n",
"Wall time: 43.4 s\n"
]
},
{
"data": {
"text/plain": [
"((10042491, 95), (256088, 95), (10042491,), (256088,))"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"\n",
"X_train, y_train = to.train.xs, to.train.ys.values.ravel()\n",
"X_test, y_test = to.valid.xs, to.valid.ys.values.ravel()\n",
"\n",
"train_df = X_train.copy()\n",
"train_df[target_attr] = y_train\n",
"\n",
"val_df = X_test.copy()\n",
"val_df[target_attr] = y_test\n",
"\n",
"X_train.shape, X_test.shape, y_train.shape, y_test.shape\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2min 22s, sys: 11.2 s, total: 2min 33s\n",
"Wall time: 27.4 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"rf = RandomForestRegressor(n_estimators=40, max_samples=50_000, max_features=0.5, min_samples_leaf=100, n_jobs=-1, random_state=1)\n",
"\n",
"res = rf.fit(X_train, y_train)\n",
"preds = rf.predict(X_test)\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSSE: 0.7558756523129304\n"
]
}
],
"source": [
"score_df, rmsse_val = rmsse(train_df, val_df, preds)\n",
"\n",
"print(f\"RMSSE: {rmsse_val}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cols</th>\n",
" <th>imp</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>72</th>\n",
" <td>seasonal_rolling_mean_26_28</td>\n",
" <td>0.266666</td>\n",
" </tr>\n",
" <tr>\n",
" <th>71</th>\n",
" <td>seasonal_rolling_mean_12_28</td>\n",
" <td>0.250787</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73</th>\n",
" <td>seasonal_rolling_mean_52_28</td>\n",
" <td>0.175208</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>rolling_mean_14_28</td>\n",
" <td>0.121139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>seasonal_rolling_mean_4_28</td>\n",
" <td>0.084250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>rolling_mean_7_28</td>\n",
" <td>0.047834</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td>seasonal_rolling_std_52_28</td>\n",
" <td>0.014380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>67</th>\n",
" <td>rolling_std_14_28</td>\n",
" <td>0.007560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>lag_7_28</td>\n",
" <td>0.005341</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>seasonal_rolling_mean_2_28</td>\n",
" <td>0.004858</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cols imp\n",
"72 seasonal_rolling_mean_26_28 0.266666\n",
"71 seasonal_rolling_mean_12_28 0.250787\n",
"73 seasonal_rolling_mean_52_28 0.175208\n",
"65 rolling_mean_14_28 0.121139\n",
"70 seasonal_rolling_mean_4_28 0.084250\n",
"64 rolling_mean_7_28 0.047834\n",
"78 seasonal_rolling_std_52_28 0.014380\n",
"67 rolling_std_14_28 0.007560\n",
"52 lag_7_28 0.005341\n",
"69 seasonal_rolling_mean_2_28 0.004858"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"feat_importance_df = pd.DataFrame({\"cols\": X_train.columns.tolist(), \"imp\": rf.feature_importances_}).sort_values(\"imp\", ascending=False)\n",
"\n",
"feat_importance_df.head(10)\n"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: ylabel='cols'>"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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bVP/sLAwlStXTk5OTqpQoYIiIiJ0/fp1q3bx8fFq2LChChcurCJFiqhJkyZKTEzM1bUAAAAAAJAXSERBkm5JhuREyZIl5ejomAvRPJy8vb115swZq2vMmDFycXGxKQG3b98+ZWVlac6cOdqzZ4+mTJmi2bNn6+233zbbXL58WaGhoSpbtqy2bNmin3/+We7u7goNDdWNGzce5PIAAAAAAHjgSET9Q4WEhKhfv34aNGiQihUrpsaNG+uHH37QU089JUdHR5UqVUojRoxQRkaGzWP+dWvezbeHli5dqgYNGsjZ2VnVq1fXpk2brPrMnTtX3t7ecnZ21osvvqjJkyfb/CbTzp071aBBA7m5ucnd3V21atXStm3btHHjRvXo0UPJycnmG0uRkZGSpHPnzqlly5ZycnJSuXLlNH/+fJvXly9fPpUsWdLqWrZsmV566SW5urres3/Tpk0VHR2tJk2aqHz58mrVqpWGDBmipUuXmm3279+vixcv6t1335W/v78CAwMVERGhc+fO6cSJEzbHCgAAAADAw4hE1D9YbGys8ufPr7i4OEVFRal58+aqU6eOdu7cqVmzZmnevHl677337muOUaNGaciQIUpMTJSfn586depkJrfi4uL06quv6q233lJiYqIaN26scePG2Tx2586dVaZMGcXHxyshIUEjRoxQgQIF9Oyzz2rq1Klyd3c331waMmSIJKl79+46duyYvv/+ey1evFgzZ87UuXPncrS2hIQEJSYmKiwsLEf9JSk5OVmenp7mvb+/v4oVK6Z58+bp+vXrSk9P17x58xQYGCgfH587jnPt2jWlpKRYXQAAAAAAPGzy53UAyDsVK1bUBx98IEn67LPP5O3trY8++kgWi0UBAQE6ffq0hg8frnfeeUcODjnLWQ4ZMkQtWrSQJI0ZM0aBgYE6dOiQAgICNGPGDDVr1sxMEvn5+emXX37RypUrbRr7xIkTGjp0qAICAiRJlSpVMus8PDxksVhUsmRJs+zAgQNavXq1Nm/erKefflqSNG/ePFWuXDlHa7vZ99lnn81R/8OHD2vGjBmaNGmSWebm5qaNGzeqdevWGjt2rKQ/n8vatWuVP/+d/3MdP368xowZk6M4AAAAAACwF96I+gerXbu2+XdSUpKCg4NlsVjMsrp16+rKlSv63//+l+M5qlWrZv5dqlQpSTLfQNq/f7+e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io2NVf78+RUXF6eoqCg1b95cderU0c6dOzVr1izNmzdP77333n3NMWrUKA0ZMkSJiYny8/NTp06dzORWXFycXn31Vb311ltKTExU48aNNW7cOJvH7ty5s8qUKaP4+HglJCRoxIgRKlCggJ599llNnTpV7u7uOnPmjM6cOaMhQ4ZIkrp3765jx47p+++/1+LFizVz5kydO3fuvtb4d7/99pt69+6tzz//XM7Ozvc9XnJysjw9Pc372rVrK1++fIqOjlZmZqaSk5P1+eefq0mTJipQoMAdxxk/frw8PDzMy9vb+75jAwAAAAAgt+XP6wDwYFSsWFEffPCBJOmzzz6Tt7e3PvroI1ksFgUEBOj06dMaPny43nnnHTk45CwfOWTIELVo0UKSNGbMGAUGBurQoUMKCAjQjBkz1KxZMzNJ5Ofnp19++UUrV660aewTJ05o6NChCggIkCRVqlTJrPPw8JDFYlHJkiXNsgMHDmj16tXavHmznn76aUnSvHnzVLly5Ryt7XYMw1D37t316quvqnbt2jp27Nh9jbdp0yYtWrRI//nPf8wyX19frVu3Tu3bt1ffvn2VmZmp4OBgrVq16q5jjRw5UoMGDTLvU1JSSEYBAAAAAB46vBH1mKpdu7b5d1JSkoKDg2WxWMyyunXr6sqVK/rf//6X4zmqVatm/l2qVClJMt9A2r9/v5566imr9n+/v5tBgwapV69eatSokSZMmKDDhw/ftX1SUpLy589vte6AgIBcPdR8xowZSklJ0ciRI+97rD179qh169Z655131LhxY7P87Nmz6tWrl7p166b4+Hj98MMPKliwoNq1ayfDMO44nqOjo9zd3a0uAAAAAAAeNiSiHlMuLi7m34ZhWCWhbpZJuqU8O/66VezmOFlZWfec0xaRkZHas2ePWrRooe+//15VqlTRsmXL7tg+N9ZzL99//702b94sR0dH5c+fXxUrVpT0Z9KvW7duNo+zd+9evfDCC+rdu7dGjx5tVffvf/9b7u7u+uCDD1SzZk09//zz+uKLL/Tdd99py5YtuboeAAAAAADsjUTUP0CVKlX0yy+/WCWCfvnlF7m5ual06dIPZM6AgABt3brVqmzbtm3ZGsPPz08DBw7UunXr1LZtW0VHR0uSChYsqMzMTKu2lStXVkZGhtUc+/fv16VLl3K2gNuYPn26du7cqcTERCUm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h1OnTiE3NxcJCQkYMWIE2rZti1GjRgF4PRJq2LBhKCkpwY4dO1BcXIz8/Hzk5+fLJMWqcvfuXVhZWUFfXx+rVq1CQUGBcH45W1tbPHz4EP/617+QlZWFzMxMeHh4oGnTpsLbAomIiIiIiIg+VB98IkpTUxO//fYbhg8fDolEgoCAAISFhcHBwQFeXl7Yvn07IiIiYGpqisGDByMiIkIYEeXk5ISZM2fCx8cHffr0QXJysrDwOPB62t+DBw8wYcIESCQSjB07Fg4ODsKi0GZmZtizZw+ioqLQs2dPLFiwAIsWLZJZqPxd3hVDXVBVVUV8fDwKCwthYWEBZ2dnDBkyBBs3bqzTdt7UuXNnREdHIyYmBr169cLmzZuFt+ZVtvD320pLS/Gvf/0LxsbGsLe3h5GRETZt2gQA0NPTQ3BwMObNmwdtbW3h7X8rV67E559/ji+++AJDhw7FZ599BnNzc7niVVJSQkZGBpycnCCRSODm5gaJRIJTp05BQ0MDwOu3JKakpCAjIwOGhobQ1dUVNnnWZDp69CiuXbuGEydOoGPHjjLnl+vevTt+/vlnXLhwAQMHDsSgQYNw9+5dxMXFyZQjIiIiIiIi+hCJpPWxuA5RJUJCQrBlyxYupK0AxcXFaNmyJfR996CJsmpDh1NjucscGzoEIiIiIiIiqoHy36FFRUXVrltc9fvgiWpp06ZNsLCwQJs2bZCUlISVK1cKo5dIMS4G23HhciIiIiIiImo0Pvipef806urqVW6JiYkNHZ6M7OxsODk5wcTEBIsXL8bs2bMRFBQEAHBwcKjyOkJDQ+s8lsTExGrvXV0IDQ2tsn4HB4c6aYOIiIiIiIjoQ8apeR+Ya9euVXlMT08PKioqCozm/d25cwfPnj2r9JiWlha0tLTqtL1nz57hzp07VR43NDSsdRuFhYUoLCys9JiKigr09PRq3Ya85B0SSURERERERFQX5P0dykQU0UeIiSgiIiIiIiJSJHl/h3JqHhERERERERERKQQTUUREREREREREpBBMRBERERERERERkUIwEUVERERERERERArBRBQRERERERERESkEE1FERERERERERKQQTEQREREREREREZFCMBFFREREREREREQKwUQUEREREREREREpRNOGDoCI6k/PhfFooqza0GHQP0juMseGDoGIiIiIiBoxjogiIiIiIiIiIiKFYCLqH8DKygq+vr7CZ7FYjLVr1wqfRSIRDhw4oPC4iIiIiIiIiOifhYkowr179+Dg4NDQYTR6CQkJEIlElW6pqanvPP/8+fNwcXGBvr4+VFRUYGxsjHXr1lUoFx8fjwEDBkBDQwPt2rXDl19+iRs3btTHJREREREREREpFBNRH7gXL17Uug4dHR0oKyvXQTQft08//RT37t2T2by8vCAWi9GvX793np+WloZ27drhhx9+QGZmJvz9/TF//nxs3LhRKHP9+nU4OTnBxsYG6enpiI+Px19//YXRo0fX56URERERERERKQQTUR8YKysr+Pj4YNasWWjbti1sbW1x8uRJ9O/fH8rKytDV1cW8efPw6tUruet8c2pebm4uRCIRYmJiYG1tDVVVVfTu3RunTp2SOWfbtm3Q19eHqqoqRo0ahdWrV6NVq1ZytRcUFIQ+ffrg+++/R6dOnaCuro6pU6eitLQUK1asgI6ODtq3b4+QkBCZ84qKijB58mS0b98empqasLGxwfnz54XjOTk5cHJygra2NtTV1WFhYYFffvlFpg6xWIzQ0FB4enpCQ0MDnTp1wtatW+WKu3nz5tDR0RG2Nm3a4ODBg/D09IRIJHrn+Z6enli/fj0GDx6MLl264Ouvv4aHhwdiYmKEMmfPnkVpaSmWLFmCrl27wszMDH5+fjh//jxevnwpV5xEREREREREjRUTUR+gyMhING3aFElJSQgNDcXw4cNhYWGB8+fPY/PmzdixYweWLFlSqzb8/f3h5+eH9PR0SCQSuLi4CMmtpKQkeHt745tvvkF6ejpsbW0rJI3eJScnB0eOHEFcXBx2796N77//Ho6Ojrh9+zZOnjyJ5cuXIyAgAKdPnwYASKVSODo6Ij8/H7GxsUhLS4OZmRmGDBmCwsJCAMCTJ08wfPhw/PLLLzh37hzs7OwwYsQI5OXlybQdFhaGfv364dy5c5g2bRqmTp2Ky5cv1/geHTx4EH/99Rfc3d1rfG65oqIiaGlpCZ/79esHJSUlhIeHo7S0FEVFRdi5cyeGDRuGZs2aVVnP8+fPUVxcLLMRERERERERNTZMRH2ADA0NsWLFChgZGSE2Nhb6+vrYuHEjunfvjpEjRyI4OBhhYWEoKyt77zb8/Pzg6OgIiUSC4OBg3Lx5E9euXQMAbNiwAQ4ODvDz84NEIsG0adNqvMZUWVkZvv/+e5iYmGDEiBGwtrbGlStXsHbtWhgZGcHDwwNGRkZISEgAAPz666/IyMjA3r170a9fP3Tr1g2rVq1Cq1atEB0dDQDo3bs3pkyZAlNTU3Tr1g1LlixBly5dcPDgQZm2hw8fjmnTpsHQ0BBz585F27ZthXZqYseOHbCzs4O+vn6NzwWAU6dOYc+ePZgyZYqwTywW4+jRo/j222+hrKyMVq1a4fbt24iKiqq2rqVLl6Jly5bC9r4xEREREREREdUnJqI+QG+uR5SVlYWBAwfKTA2ztLTEkydPcPv27fduo1evXsLfurq6AID79+8DAK5cuYL+/fvLlH/787uIxWJoaGgIn7W1tWFiYoImTZrI7CtvMy0tDU+ePEGbNm2grq4ubDdu3EBOTg4AoKSkBHPmzIGJiQlatWoFdXV1XL58ucKIqDevTSQSQUdHR2hHXrdv30Z8fDwmTpxYo/PKZWZmwsnJCQsWLICtra2wPz8/H15eXnBzc0NqaipOnjyJ5s2bw9nZGVKptMr65s+fj6KiImG7devWe8VFREREREREVJ+aNnQAVHNqamrC31KptML6ROUJC3nWLarKm9PAyuspH2FVXZvvU395G5XtK2+zrKwMurq6lY5cKl+b6t///jfi4+OxatUqGBoaQkVFBc7OzhUWdK+uHXmFh4ejTZs2+OKLL2p0HgBcunQJNjY2mDRpEgICAmSOfffdd9DU1MSKFSuEfT/88AP09fWRkpKCAQMGVFqnsrIyF5wnIiIiIiKiRo+JqA+ciYkJ9u3bJ5McSk5OhoaGBvT09Oqlze7du+OPP/6Q2XfmzJl6aaucmZkZ8vPz0bRpU4jF4krLJCYmwt3dHaNGjQLwes2o3NzcOo9FKpUiPDwcEyZMqHbdpspkZmbCxsYGbm5ula6r9fTpUygpKcnsK/9cm6mWRERERERERI0Bp+Z94KZNm4Zbt25h+vTpuHz5Mv773/9i4cKFmDVrlsw0t7o0ffp0xMbGYvXq1cjOzsZ//vMfHDlypFYjsN5l6NChGDhwIEaOHIn4+Hjk5uYiOTkZAQEBQhLM0NAQMTExSE9Px/nz5/HVV1/VS/LmxIkTuHHjRo2n5WVmZsLa2hq2traYNWsW8vPzkZ+fj4KCAqGMo6MjUlNTsWjRImRnZ+Ps2bPw8PCAgYEB+vbtW9eXQkRERERERKRQTER94PT09BAbG4s//vgDvXv3hre3NyZOnFhhylddsrS0xJYtW7B69Wr07t0bcXFxmDlzJlq0aFFvbYpEIsTGxuLzzz+Hp6cnJBIJxo0bh9zcXGhrawMA1qxZg9atW+PTTz/FiBEjYGdnBzMzszqPZceOHfj0009hbGxco/P27t2LgoIC7Nq1C7q6usJmYWEhlLGxscGPP/6IAwcOoG/fvrC3t4eysjLi4uKgoqJS15dCREREREREpFAiaU0X9yGqxKRJk3D58mUkJiY2dCgEoLi4+PXb83z3oImyakOHQ/8gucscGzoEIiIiIiJqAOW/Q4uKiqCpqVllOa4RRe9l1apVsLW1hZqaGo4cOYLIyEhs2rSpocOit1wMtqv2AUBERERERESkSJyaR+/ljz/+gK2tLUxNTbFlyxasX78eXl5eAIAePXpAXV290m3Xrl0NHHnVQkNDq4zbwcHhned7e3tXeb63t7cCroCIiIiIiIiocePUPKpzN2/exMuXLys9pq2tDQ0NDQVHJJ/CwkIUFhZWekxFReWdbyG8f/8+iouLKz2mqamJ9u3b1zpGeck7JJKIiIiIiIioLnBqHjUYAwODhg7hvWhpaUFLS+u9z2/fvr1Ck01EREREREREHxpOzSMiIiIiIiIiIoVgIoqIiIiIiIiIiBSCiSgiIiIiIiIiIlIIJqKIiIiIiIiIiEghmIgiIiIiIiIiIiKFYCKKiIiIiIiIiIgUgokoIiIiIiIiIiJSCCaiiIiIiIiIiIhIIZiIIiIiIiIiIiIihWja0AEQUf3puTAeTZRVGzoMIvqI5C5zbOgQiIiIiOgDxhFRRERERERERESkEExENbCgoCD06dOnXttwd3fHyJEjhc9WVlbw9fUVPovFYqxdu7ZeYyAiIiIiIiIiYiKKkJqaismTJzd0GB8UqVQKBwcHiEQiHDhwQK5zcnNzMXHiRHTu3BkqKiro2rUrFi5ciBcvXsiUS01NxZAhQ9CqVSu0bt0aw4YNQ3p6et1fBBEREREREZGCMRH1AXs7gfG+2rVrB1VVriNUE2vXroVIJKrROZcvX0ZZWRn+85//IDMzE2vWrMGWLVvw7bffCmUeP34MOzs7dOrUCSkpKfj999+hqakJOzs7vHz5sq4vg4iIiIiIiEihGn0iKjo6GqamplBRUUGbNm0wdOhQlJSUAADCw8NhbGyMFi1aoHv37ti0aZPMuXPnzoVEIoGqqiq6dOmCwMBAmR/z58+fh7W1NTQ0NKCpqQlzc3OcOXNGOL5v3z706NEDysrKEIvFCAsLk6lfLBYjNDQUnp6e0NDQQKdOnbB169YaxVAT5VPsli5dig4dOkAikQAAMjIyYGNjI9yjyZMn48mTJ3LX+/bUPJFIhO3bt2PUqFFQVVVFt27dcPDgQZlzDh48iG7dukFFRQXW1taIjIyESCTCo0eP3tleREQEWrVqhUOHDsHIyAiqqqpwdnZGSUkJIiMjIRaL0bp1a0yfPh2lpaXCeS9evMCcOXOgp6cHNTU1fPLJJ0hISBCOP3jwAC4uLujYsSNUVVVhamqK3bt3y7RtZWWFGTNmYM6cOdDS0oKOjg6CgoLkvlfA636zevVqfP/99zU6z97eHuHh4Rg2bBi6dOmCL774An5+foiJiRHKXLlyBQ8fPsSiRYtgZGSEHj16YOHChbh//z7y8vJq1B4RERERERFRY9OoE1H37t2Di4sLPD09kZWVhYSEBIwePRpSqRTbtm2Dv78/QkJCkJWVhdDQUAQGBiIyMlI4X0NDAxEREbh06RLWrVuHbdu2Yc2aNcJxV1dXdOzYEampqUhLS8O8efPQrFkzAEBaWhrGjh2LcePGISMjA0FBQQgMDERERIRMjGFhYejXrx/OnTuHadOmYerUqbh8+bLcMdTU8ePHkZWVhWPHjuHQoUN4+vQp7O3t0bp1a6SmpmLv3r345Zdf4OPj895tAEBwcDDGjh2LCxcuYPjw4XB1dUVhYSGA11PMnJ2dMXLkSKSnp2PKlCnw9/evUf1Pnz7F+vXrERUVhbi4OOG7jY2NRWxsLHbu3ImtW7ciOjpaOMfDwwNJSUmIiorChQsXMGbMGNjb2yM7OxsA8Pfff8Pc3ByHDh3CxYsXMXnyZIwfPx4pKSkybUdGRkJNTQ0pKSlYsWIFFi1ahGPHjskdt4uLCzZu3AgdHZ0aXXNlioqKoKWlJXw2MjJC27ZtsWPHDrx48QLPnj3Djh070KNHDxgYGFRZz/Pnz1FcXCyzERERERERETU2IqlUKm3oIKpy9uxZmJubIzc3t8KP8E6dOmH58uVwcXER9i1ZsgSxsbFITk6utL6VK1fip59+EkY9aWpqYsOGDXBzc6tQ1tXVFQUFBTh69Kiwb86cOTh8+DAyMzMBvB5JNGjQIOzcuRPA63WDdHR0EBwcDG9vb7liCAoKwoEDB+RaA8jd3R1xcXHIy8tD8+bNAQDbtm3D3LlzcevWLaipqQEAYmNjMWLECNy9exfa2tpwd3fHo0ePhLWMrKys0KdPH2EUlFgshq+vr7CAuUgkQkBAABYvXgwAKCkpgYaGBmJjY2Fvb4958+bh8OHDyMjIEGILCAhASEgIHj58iFatWlV7HREREfDw8MC1a9fQtWtXAIC3tzd27tyJP//8E+rq6gBejyASi8XYsmULcnJy0K1bN9y+fRsdOnQQ6ho6dCj69++P0NDQSttydHSEsbExVq1aJVx7aWkpEhMThTL9+/eHjY0Nli1b9q6vAFOmTEFpaSm2b98u3Kv9+/fLLAYvr5ycHJiZmSEsLAxeXl7C/szMTDg5OeHGjRsAAIlEgvj4eHTq1KnKuoKCghAcHFxhv77vHjRR5rRLIqo7ucscGzoEIiIiImqEiouL0bJlSxQVFUFTU7PKck0VGFON9e7dG0OGDIGpqSns7OwwbNgwODs749WrV7h16xYmTpyISZMmCeVfvXqFli1bCp+jo6Oxdu1aXLt2DU+ePMGrV69kbsasWbPg5eWFnTt3YujQoRgzZoyQGMnKyoKTk5NMPJaWlli7di1KS0uhpKQEAOjVq5dwXCQSQUdHB/fv35c7hpoyNTUVklDlcfbu3VtIQpXHWVZWhitXrkBbW/u92nnzutTU1KChoSFc15UrV2BhYSFTvn///jWqX1VVVbjXAKCtrQ2xWCwkocr3lbd59uxZSKVSYTpiuefPn6NNmzYAgNLSUixbtgw//fQT7ty5g+fPn+P58+cy9+btawMAXV1dme+sKgcPHsSJEydw7ty5Gl1rZe7evQt7e3uMGTNGJgn17NkzeHp6wtLSErt370ZpaSlWrVqF4cOHIzU1FSoqKpXWN3/+fMyaNUv4XFxcDH19/VrHSURERERERFSXGnUiSklJCceOHUNycjKOHj2KDRs2wN/fHz///DOA16OBPvnkkwrnAMDp06cxbtw4BAcHw87ODi1btkRUVJTMOk9BQUH46quvcPjwYRw5cgQLFy5EVFQURo0aBalUWmEx6soGj5VP5SsnEolQVlYmdww19XZSpbI434zlfVV3XfLem5rWX12bZWVlUFJSQlpamvAdlytPXoWFhWHNmjVYu3YtTE1NoaamBl9f3wqLulfXTnVOnDiBnJycCiO+vvzySwwaNEhmvarq3L17F9bW1hg4cGCFNcV+/PFH5Obm4tSpU2jSpImwr3Xr1vjvf/+LcePGVVqnsrIylJWV5WqfiIiIiIiIqKE06kQU8DpJYGlpCUtLSyxYsAAGBgZISkqCnp4erl+/DldX10rPS0pKgoGBgczaRTdv3qxQTiKRQCKRYObMmXBxcUF4eDhGjRoFExMT/P777zJlk5OTIZFIKiRCqiJvDLVhYmKCyMhIlJSUCEmqpKQkNGnSpMLoobrSvXt3xMbGyux7c5H3+tC3b1+Ulpbi/v37GDRoUKVlEhMT4eTkhK+//hrA6+RVdnY2jI2N6ySGefPmyYxeAl6PUFuzZg1GjBghVx137tyBtbU1zM3NER4eLiSbyj19+hRNmjSRSfSVf5YnWUZERERERETUmDXqxcpTUlIQGhqKM2fOIC8vDzExMSgoKICxsTGCgoKwdOlSrFu3DlevXkVGRgbCw8OxevVqAIChoSHy8vIQFRWFnJwcrF+/Hvv37xfqfvbsGXx8fJCQkICbN28iKSkJqampQtJi9uzZOH78OBYvXoyrV68iMjISGzduhJ+fn9zxvyuGuuDq6ooWLVrAzc0NFy9exK+//orp06dj/Pjx7z0t712mTJmCy5cvY+7cubh69Sr27NkjLOJem1FY1ZFIJHB1dcWECRMQExODGzduIDU1FcuXLxeSYoaGhsIIuqysLEyZMgX5+fl1FoOOjg569uwpswGv1yvr3LnzO8+/e/curKysoK+vj1WrVqGgoAD5+fkyMdra2uLhw4f417/+haysLGRmZsLDwwNNmzaFtbV1nV0LERERERERUUNo1IkoTU1N/Pbbbxg+fDgkEgkCAgIQFhYGBwcHeHl5Yfv27YiIiICpqSkGDx6MiIgIISHg5OSEmTNnwsfHB3369EFycjICAwOFupWUlPDgwQNMmDABEokEY8eOhYODg7Dgs5mZGfbs2YOoqCj07NkTCxYswKJFi+Du7i53/O+KoS6oqqoiPj4ehYWFsLCwgLOzM4YMGYKNGzfWaTtv6ty5M6KjoxETE4NevXph8+bNwqiv+pweFh4ejgkTJmD27NkwMjLCF198gZSUFGEtpMDAQJiZmcHOzg5WVlbQ0dF5r0XE68vRo0dx7do1nDhxAh07doSurq6wlevevTt+/vlnXLhwAQMHDsSgQYNw9+5dxMXFyZQjIiIiIiIi+hA16rfm0YcjJCQEW7Zswa1btxo6FML//7YCvjWPiOoa35pHRERERJX5KN6aR43Xpk2bYGFhgTZt2iApKQkrV66Ej49PQ4dFb7kYbFertzQSERERERER1aVGPTXvn0ZdXb3KLTExsaHDk5GdnQ0nJyeYmJhg8eLFmD17NoKCggAADg4OVV5HaGhowwZejV27dlUZd48ePd55fmhoaJXnOzg4KOAKiIiIiIiIiBo3Ts1rRK5du1blMT09PaioqCgwmvd3584dPHv2rNJjWlpa0NLSUnBE8nn8+DH+/PPPSo81a9YMBgYG1Z5fWFiIwsLCSo+pqKhAT0+v1jHKS94hkURERERERER1Qd7foUxEEX2EmIgiIiIiIiIiRZL3dyin5hERERERERERkUIwEUVERERERERERArBRBQRERERERERESkEE1FERERERERERKQQTEQREREREREREZFCMBFFREREREREREQKwUQUEREREREREREpBBNRRERERERERESkEExEERERERERERGRQjRt6ACIqP70XBiPJsqqDR0GERF9gHKXOTZ0CERERPQR4ogoIiIiIiIiIiJSCCaiPnBWVlbw9fUVPovFYqxdu1b4LBKJcODAAYXHRURERERERET0NiaiPnL37t2Dg4NDQ4fxQQgJCcGnn34KVVVVtGrVqtqyDx48QMeOHSESifDo0SO56k9ISICTkxN0dXWhpqaGPn36YNeuXRXK7dq1C71794aqqip0dXXh4eGBBw8evMcVERERERERETUuTEQ1Yi9evKh1HTo6OlBWVq6DaD5+L168wJgxYzB16tR3lp04cSJ69epVo/qTk5PRq1cv7Nu3DxcuXICnpycmTJiAn3/+WSjz+++/Y8KECZg4cSIyMzOxd+9epKamwsvLq8bXQ0RERERERNTYMBHViFhZWcHHxwezZs1C27ZtYWtri5MnT6J///5QVlaGrq4u5s2bh1evXsld55tT83JzcyESiRATEwNra2uoqqqid+/eOHXqlMw527Ztg76+PlRVVTFq1CisXr36nSOEygUFBaFPnz74/vvv0alTJ6irq2Pq1KkoLS3FihUroKOjg/bt2yMkJETmvKKiIkyePBnt27eHpqYmbGxscP78eeF4Tk4OnJycoK2tDXV1dVhYWOCXX36R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ddKGg4NDlW2EhobWSRtEREREREREHzJOzaMauXnzJl6+fFnpMW1tbWhoaCg4IvkUFhaisLCw0mMqKip18hbCO3fuyLxV701aWlrCguSKIO+QSCIiIiIiIqK6wKl5VC8MDAwaOoT3oohEUF0ks4iIiIiIiIg+ZpyaR0RERERERERECsFEFBERERERERERKQQTUUREREREREREpBBMRBERERERERERkUIwEUVERERERERERArBRBQRERERERERESkEE1FERERERERERKQQTEQREREREREREZFCMBFFREREREREREQK0bShAyCi+tNzYTyaKKs2dBhEREREDSZ3mWNDh0BERG/giCgiIiIiIiIiIlIIJqLqUVBQEPr06VOvbbi7u2PkyJHCZysrK/j6+gqfxWIx1q5dW68xEBERERERERHJg4moj1xqaiomT57c0GF8EKysrCASiWS2cePGCcdzc3MxceJEdO7cGSoqKujatSsWLlyIFy9eyFX/+fPn4eLiAn19faioqMDY2Bjr1q2rUC4+Ph4DBgyAhoYG2rVrhy+//BI3btyos+skIiIiIiIiaihcI6qRevHiBZo3b17retq1a1cH0fxzTJo0CYsWLRI+q6ioCH9fvnwZZWVl+M9//gNDQ0NcvHgRkyZNQklJCVatWvXOutPS0tCuXTv88MMP0NfXR3JyMiZPngwlJSX4+PgAAK5fvw4nJyfMmjULu3btQlFREWbOnInRo0fj3LlzdX/BRERERERERArUoCOioqOjYWpqChUVFbRp0wZDhw5FSUkJACA8PBzGxsZo0aIFunfvjk2bNsmcO3fuXEgkEqiqqqJLly4IDAzEy5cvhePnz5+HtbU1NDQ0oKmpCXNzc5w5c0Y4vm/fPvTo0QPKysoQi8UICwuTqV8sFiM0NBSenp7Q0NBAp06dsHXr1hrFUBPlU+yWLl2KDh06QCKRAAAyMjJgY2Mj3KPJkyfjyZMnctf79tQ8kUiE7du3Y9SoUVBVVUW3bt1w8OBBmXMOHjyIbt26QUVFBdbW1oiMjIRIJMKjR4/e2V5ERARatWqFQ4cOwcjICKqqqnB2dkZJSQkiIyMhFovRunVrTJ8+HaWlpcJ5L168wJw5c6Cnpwc1NTV88sknSEhIEI4/ePAALi4u6NixI1RVVWFqaordu3fLtG1lZYUZM2Zgzpw50NLSgo6O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pk0bJCUlYeXKlfDx8WnosOg9XAy2q/YBQERERERERKRIDTY1759GXV29yi0xMbGhw5ORnZ0NJycnmJiYYPHixZg9ezaCgoIAAA4ODlVeR2hoaMMGXo1du3ZVGXePHj3qpA1vb+8q2/D29q6TNoiIiIiIiIg+ZJyapyDXrl2r8pient4Hs/7PnTt38OzZs0qPaWlpQUtLS8ERyefx48f4888/Kz3WrFkzud96V5379++juLi40mOamppo3759rduQl7xDIomIiIiIiIjqgry/Q5mIIvoIMRFFREREREREiiTv71BOzSMiIiIiIiIiIoXgYuVEH6HygY5VTRUkIiIiIiIiqkvlvz/fNfGOiSiij9CDBw8AAPr6+g0cCREREREREf2TPH78GC1btqzyOBNRRB+h8kXj8/Lyqn0AEClScXEx9PX1cevWLa5dRo0G+yU1RuyX1BixX1JjxH7ZuEilUjx+/BgdOnSothwTUUQfoSZNXi//1rJlSz6QqdHR1NRkv6RGh/2SGiP2S2qM2C+pMWK/bDzkGQjBxcqJiIiIiIiIiEghmIgiIiIiIiIiIiKFYCKK6COkrKyMhQsXQllZuaFDIRKwX1JjxH5JjRH7JTVG7JfUGLFffphE0ne9V4+IiIiIiIiIiKgOcEQUEREREREREREpBBNRRERERERERESkEExEERERERERERGRQjARRURERERERERECsFEFBERERERERERKQQTUUQfgE2bNqFz585o0aIFzM3NkZiYWG35kydPwtzcHC1atECXLl2wZcuWCmX27dsHExMTKCsrw8TEBPv376+v8OkjVdf9MiIiAiKRqML2999/1+dl0EemJv3y3r17+Oqrr2BkZIQmTZrA19e30nJ8XlJt1XW/5POS6kJN+mVMTAxsbW3Rrl07aGpqYuDAgYiPj69Qjs9Lqq267pd8XjZOTEQRNXI//fQTfH194e/vj3PnzmHQoEFwcHBAXl5epeVv3LiB4cOHY9CgQTh37hy+/fZbzJgxA/v27RPKnDp1Cv/7v/+L8ePH4/z58xg/fjzGjh2LlJQURV0WfeDqo18CgKamJu7duyeztWjRQhGXRB+BmvbL58+fo127dvD390fv3r0rLcPnJdVWffRLgM9Lqp2a9svffvsNtra2iI2NRVpaGqytrTFixAicO3dOKMPnJdVWffRLgM/LRklKRI1a//79pd7e3jL7unfvLp03b16l5efMmSPt3r27zL4pU6ZIBwwYIHweO3as1N7eXqaMnZ2ddNy4cXUUNX3s6qNfhoeHS1u2bFnnsdI/R0375ZsGDx4s/eabbyrs5/OSaqs++iWfl1RbtemX5UxMTKTBwcHCZz4vqbbqo1/yedk4cUQUUSP24sULpKWlYdiwYTL7hw0bhuTk5ErPOXXqVIXydnZ2OHPmDF6+fFltmarqJHpTffVLAHjy5AkMDAzQsWNH/M///E+F/9Eiqsr79Et58HlJtVFf/RLg85LeX130y7KyMjx+/BhaWlrCPj4vqTbqq18CfF42RkxEETVif/31F0pLS6GtrS2zX1tbG/n5+ZWek5+fX2n5V69e4a+//qq2TFV1Er2pvvpl9+7dERERgYMHD2L37t1o0aIFLC0tkZ2dXT8XQh+V9+mX8uDzkmqjvvoln5dUG3XRL8PCwlBSUoKxY8cK+/i8pNqor37J52Xj1LShAyCidxOJRDKfpVJphX3vKv/2/prWSfS2uu6XAwYMwIABA4TjlpaWMDMzw4YNG7B+/fq6Cps+cvXxbOPzkmqrrvsQn5dUF963X+7evRtBQUH473//i/bt29dJnUTl6rpf8nnZODERRdSItW3bFkpKShX+F+D+/fsV/regnI6OTqXlmzZtijZt2lRbpqo6id5UX/3ybU2aNIGFhQX/x4rk8j79Uh58XlJt1Fe/fBufl1QTtemXP/30EyZOnIi9e/di6NChMsf4vKTaqK9++TY+LxsHTs0jasSaN28Oc3NzHDt2TGb/sWPH8Omnn1Z6zsCBAyuUP3r0KPr164dmzZpVW6aqOoneVF/98m1SqRTp6enQ1dWtm8Dpo/Y+/VIefF5SbdRXv3wbn5dUE+/bL3fv3g13d3f8+OOPcHR0rHCcz0uqjfrql2/j87KRaIgV0olIflFRUdJmzZpJd+zYIb106ZLU19dXqqamJs3NzZVKpVLpvHnzpOPHjxfKX79+XaqqqiqdOXOm9NKlS9IdO3ZImzVrJo2OjhbKJCUlSZWUlKTLli2TZmVlSZctWyZt2rSp9PTp0wq/Pvow1Ue/DAoKksbFxUlzcnKk586dk3p4eEibNm0qTUlJUfj10Yeppv1SKpVKz507Jz137pzU3Nxc+tVXX0nPnTsnzczMFI7zeUm1VR/9ks9Lqq2a9ssff/xR2rRpU+l3330nvXfvnrA9evRIKMPnJdVWffRLPi8bJyaiiD4A3333ndTAwEDavHlzqZmZmfTkyZPCMTc3N+ngwYNlyickJEj79u0rbd68uVQsFks3b95coc69e/dKjYyMpM2aNZN2795dum/fvvq+DPrI1HW/9PX1lXbq1EnavHlzabt27aTDhg2TJicnK+JS6CNS034JoMJmYGAgU4bPS6qtuu6XfF5SXahJvxw8eHCl/dLNzU2mTj4vqbbqul/yedk4iaTS/2+1WCIiIiIiIiIionrENaKIiIiIiIiIiEghmIgiIiIiIiIiIiKFYCKKiIiIiIiIiIgUgokoIiIiIiIiIiJSCCaiiIiIiIiIiIhIIZiIIiIiIiIiIiIihWAiioiIiIiIiIiIFIKJKCIiIiIiIiIiUggmooiIiIiIiIiISCGYiCIiIiIiIiIiIoVgIoqIiIiIiIiIiBTi/wF5JHvkdALqvQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1200x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"feat_importance_df.head(20).plot(\"cols\", \"imp\", \"barh\", figsize=(12, 7), legend=False)\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((10042491, 10), (256088, 10))"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"col_keep = list(feat_importance_df[feat_importance_df.imp > 0.005].cols)\n",
"col_keep = list(set(col_keep + [\"id\"]))\n",
"\n",
"X_train = X_train[col_keep]\n",
"X_test = X_test[col_keep]\n",
"\n",
"X_train.shape, X_test.shape\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### fast.ai\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"to.xs.iloc[:2]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dls = to.dataloaders(bs=64)\n",
"dls.show_batch()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"if torch.cuda.is_available():\n",
" learn = tabular_learner(dls, metrics=[mse, rmse, mae, msle, exp_rmspe])\n",
" learn.fit(1, lr=3e-5)\n",
" learn.show_results()\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### lightgbm\n",
"\n",
"Metrics: https://lightgbm.readthedocs.io/en/latest/Parameters.html#metric-parameters\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 11.2 s, sys: 18.1 s, total: 29.2 s\n",
"Wall time: 35.6 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"X_train, y_train = to.train.xs, to.train.ys.values.ravel()\n",
"X_test, y_test = to.valid.xs, to.valid.ys.values.ravel()\n",
"\n",
"train_df = X_train.copy()\n",
"train_df[target_attr] = y_train\n",
"\n",
"val_df = X_test.copy()\n",
"val_df[target_attr] = y_test\n"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.889496 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 7157\n",
"[LightGBM] [Info] Number of data points in the train set: 10042491, number of used features: 94\n",
"[LightGBM] [Info] Start training from score 0.224990\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5331\tvalid_0's tweedie: 12.9396\n",
"[100]\ttraining's tweedie: 12.5095\tvalid_0's tweedie: 12.93\n",
"[150]\ttraining's tweedie: 12.5016\tvalid_0's tweedie: 12.9292\n",
"[200]\ttraining's tweedie: 12.4969\tvalid_0's tweedie: 12.9288\n",
"[250]\ttraining's tweedie: 12.4933\tvalid_0's tweedie: 12.9288\n",
"[300]\ttraining's tweedie: 12.4901\tvalid_0's tweedie: 12.9284\n",
"[350]\ttraining's tweedie: 12.4873\tvalid_0's tweedie: 12.9282\n",
"[400]\ttraining's tweedie: 12.4847\tvalid_0's tweedie: 12.9282\n",
"[450]\ttraining's tweedie: 12.4825\tvalid_0's tweedie: 12.9283\n",
"[500]\ttraining's tweedie: 12.4802\tvalid_0's tweedie: 12.9282\n",
"Early stopping, best iteration is:\n",
"[445]\ttraining's tweedie: 12.4828\tvalid_0's tweedie: 12.9281\n",
"CPU times: user 1h 5min 3s, sys: 1min 35s, total: 1h 6min 38s\n",
"Wall time: 4min 59s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# define hyperparameters\n",
"params = dict(\n",
" objective=\"tweedie\",\n",
" tweedie_variance_power=1.1,\n",
" # metric={'tweedie','rmse', 'mape'},\n",
" learning_rate=0.05, # 0.05 ... 1e-1, 1e-2, 1e-3 (default=0.1)\n",
" min_samples_leaf=150,\n",
" feature_fraction=0.3, # 0.3 ... 0.5, 0.8 (default = 1.0)\n",
" subsample=0.3, # 0.3 ... 0.5, 0.8 (default = 1.0; alias for 'subsample')\n",
" deterministic=True,\n",
")\n",
"\n",
"train_dset = lgbm.Dataset(X_train, y_train)\n",
"val_dset = lgbm.Dataset(X_test, y_test, reference=train_dset)\n",
"\n",
"eval_results = {}\n",
"callbacks = [lgbm.early_stopping(100), lgbm.log_evaluation(50), lgbm.record_evaluation(eval_results)]\n",
"\n",
"model = lgbm.train(\n",
" params,\n",
" train_dset,\n",
" valid_sets=[val_dset, train_dset],\n",
" num_boost_round=1000,\n",
" callbacks=callbacks,\n",
")\n",
"\n",
"preds = model.predict(X_test)\n"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSSE: 0.75242902668365\n"
]
}
],
"source": [
"score_df, rmsse_mean = rmsse(train_df, val_df, preds)\n",
"print(f\"RMSSE: {rmsse_mean}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Tx/hwIEDAfUeP2fOHOHll18WLr30UsFoNAq33nqrsHXrVod5hwwZItSsWdPtckwmk/Dpp58K11xzjRAbGyvUqlVLaN++vTB8+HDh8OHDDtvr9ddfFxo1aiTExsYKN954o7Bx40ahRYsWPnuPFwRB2Lhxo9C/f3+hbt26gtFoFNq0aePSS/qoUaOEhIQEQavVuixj0aJFQq9evYQ6deoIRqNRaNGihfDggw8Ky5cvd1jGd999J7Rt21aIiYkRrrjiCuH77793qd+e+LuO/u5HguC57ufn5wtDhw4VGjVqJMTFxQm33HKLsG7dOrf7PRFRJNEIgl17KCIiIqIItXr1avTq1Qu//vqry0gKREREasV32omIiIiIiIhUikk7ERERERERkUqxeTwRERERERGRSvFJOxEREREREZFKMWknIiIiIiIiUikm7UREREREREQqpVc6ADWwWq04ffo0ateuDY1Go3Q4REREREREFOEEQcD58+eRkJAArdbz83Qm7QBOnz6NZs2aKR0GERERERERRZkTJ06gadOmHj9n0g6gdu3aAKo2Vp06dRSOxjOTyYTk5GT07dsXBoNB6XCIWCdJdVgnSW1YJ0ltWCdJjaK1XhYVFaFZs2a2fNQTJu2ArUl8nTp1VJ+0x8XFoU6dOlFVmUm9WCdJbVgnSW1YJ0ltWCdJjaK9Xvp6RZsd0RERERERERGpFJN2IiIiIiIiIpVi0k5ERERERESkUnynnYiIiIiISGUEQYDJZILZbFY6FMmZTCYYDAaUlpZG1Dvter0eBoMh5GHFmbQTERERERGpSEVFBdLT01FcXKx0KLJp3Lgxjhw5onQYoqtVqxZatmwJo9EY9DKYtBMREREREamE1WrFvn37oNfr0apVKxiNxpCf1JL8BEFARUUFTp06hb1796Jjx46IiYkJallM2omIiIiIiFSivLwcVqsVrVq1Qq1atZQOh0JQs2ZNxMTE4ODBg/j7779xxx13BDXEODuiIyIiIiIiUhmtlqlaJKj+HU+dOoXFixejtLQ08GWIHRQRERERERERXXTppZciMzMT586dC/i7TNqJiIiIiIiIJGQwGGC1WlFWVhbwd5m0ExERERERkSKSkpJw7bXXBvSdnj174tVXX1U8DrmwIzoiIiIiIiJSxBtvvIGXXnopoO8sWLAgosZz94VJOxEREREREclKEARYLBbUqlUr4F7y69evL1FU6sTm8URERERERColCAJKK82K/CcIQkCxVlRU4OWXX0ajRo0QGxuLW265BampqQCA1atXQ6PRYOnSpejSpQuMRiPWrVvn0izdbDbj5ZdfxiWXXIIGDRrgrbfewpAhQ3Dvvffa5nFuHt+yZUuMGzcOTz31FGrXro3mzZvjm2++cYjtrbfewhVXXIG4uDi0bt0aY8aMgclkCvj3UAKftBMREREREalUmcmCK99bqkjZ+z7oh7gY/1PGkSNH4vfff8fs2bPRokULTJgwAf369cORI0cc5vn000/RunVrXHLJJVizZo3DMj755BP89NNPmDlzJjp06IAvvvgCixYtQq9evbyW/dlnn+HDDz/EO++8g99++w3PPfccbrvtNrRv3x4AULt2bcyaNQsJCQnYvXs3nn76adSuXRsjR44MYIsog0/aiYiIiIiIKCQlJSWYPn06Jk6ciP79++PKK6/Et99+ixo1amDGjBm2+T744AP06dMHbdq0QYMGDVyWM3XqVIwaNQr33Xcf2rdvj2nTpuGSSy7xWX5iYiKef/55XH755XjrrbfQsGFDrF692vb5u+++i+7du6Nly5YYOHAgXn/9dfzyyy9irLrk+KSdiIhIZFargJ0nC9ChSR3EGnRKh0NERGGshkGHfR/0U6xsfx09ehQmkwk333yzbZrBYEDXrl2xf/9+3HDDDQCALl26eFxGYWEhzp49i65du9qm6XQ6XH/99bBarV7L79Spk+3fGo0G8fHxyM7Otk377bffMHnyZBw5cgTFxcUwm82oU6eO3+unJCbtREREIvt+w3F89M9+3Nq2IeYM7aZ0OEREFMY0Gk1ATdSVUv3+u0ajcZluP61mzZo+l+VuGb449yav0Whsif6mTZvw8MMPY+zYsejXrx/q1q2L+fPn47PPPvO5XDVg83giIiKR/bAxAwCw7vA5hSMhIiKSx+WXX46YmBisX7/eNs1kMmHr1q3o0KGDX8uoW7cuGjdujC1bttimWSwW7NixI6TYNmzYgBYtWmD06NHo0qUL2rZti4yMjJCWKSf137IhIiIiIiIiVatZsyaee+45vPnmm6hfvz6aN2+OCRMmoLS0FEOHDsXOnTv9Ws5LL72E8ePH4/LLL0f79u0xdepU5Ofnuzx9D8Tll1+OzMxMzJ8/HzfccAP++ecfLFy4MOjlyY1JOxEREREREYXs448/htVqxWOPPYbz58+jS5cuWLp0KerVq+f3Mt566y1kZWXh8ccfh06nwzPPPIN+/fpBpwu+j5h77rkHr732Gl588UVUVFTgrrvuwpgxY5CUlBT0MuXEpJ2IiIiIiIhCFhsbiylTpmDKlCkun/Xs2dPtu+lJSUkOybNer8fUqVMxdepUAIDVakWHDh0waNAg2zz2vcIDQHp6usty09LSHP6eMGECJkyY4DDNfqx35zjUhEk7ERERERERqUJGRgaSk5PRo0cPVFRUYNq0aTh+/DgGDx6sdGiKYUd0REREREREpAparRazZs3CDTfcgJtvvhm7d+/G8uXL/e7MLhLxSTsRERERERGpQrNmzbBhwwalw1AVPmknIiIiIiIiUikm7UREREREREQqxaSdiIiIiIiISKWYtBMRERERERGpFJN2IiIiIiIiIpVi0k5ERERERESkUoom7WvXrsXAgQORkJAAjUaDRYsWeZx3+PDh0Gg0mDx5ssP0iooKvPTSS2jYsCFq1qyJu+++GydPnpQ2cCIiIiIiIlJMy5YtHXJDX/mkVJKSknDttddKWoaiSXtJSQmuueYaTJs2zet8ixYtwubNm5GQkODy2auvvoqFCxdi/vz5WL9+PYqLizFgwABYLBapwiYiIiIiIiIVOXPmDPr37+/XvHIk2mLSK1l4//79fW7YU6dO4cUXX8TSpUtx1113OXxWWFiIGTNmYM6cObjjjjsAAD/++COaNWuG5cuXo1+/fpLFTkRERERERMGrrKxETEyMKMuKj48XZTlqpGjS7ovVasVjjz2GN998E1dddZXL59u2bYPJZELfvn1t0xISEtCxY0ekpKR4TNorKipQUVFh+7uoqAgAYDKZYDKZRF4L8VTHpuYYKbqwTpLaqKVOCoJg+7fSsZCy1FIniaqxTqqfy28jCICpVJlgDHGARuP37D179kTHjh0BVD1M1el0eO655/Dhhx9Co9GgZcuWGDZsGI4cOYKFCxfi3nvvxezZs5GSkoK3334bqampaNiwIe677z6MHz8eNWvWBABkZ2dj6NChWL58OeLj4/HRRx+5lK3RaGzLBICTJ0/ijTfeQHJyMioqKtChQwd8+eWX2L9/P8aOHWv7DgDMnDkTTzzxBAoLC/Hmm29i0aJFKC8vR5cuXfD555/jmmuusZXz8ccf4/PP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uDQKHZ+0ExEREREREakUk3YiIiIiIiKVsVqtSodAIhDjd2TSTkREREREpBIxMTEAgOLiYoUjITFU/44mkynoZfCddiIiIiIiIpXQ6/Vo2LAhTp06BQCoVasWtFo+aw03VqsVxcXFOHXqFAoKCmCxWIJeFpN2IiIiIiIiFWnevDkEQbAl7hS+CgoKcPbsWVRWVkKr1aJGjRoBL4NJOxERERERkYpoNBq0bNkSWVlZ2L59O4xGI2JjY6HRaJQOTRJWqxWnT59GQkJCxLQqEAQBJpMJFosFJpMJubm5uOKKK3DppZcGvCwm7URERERERCrUtWtXWK1WpKWl4fz580qHIxmr1YqsrCzo9fqISdrt6XQ6tGvXDv379+eTdiIiIiIiokih1WrRvXt3XH/99SgtLYUgCEqHJAmz2YwVK1agd+/e0OsjL0WNiYlBXFxc0DckIm+LEBERKSwyGy8SEZFSjEYjjEaj0mFIxmQyIS4uDvXq1YPBYFA6HNWJvLYHRERERERERBGCSTsRERERERGRSjFpJyIiIiIiIlIpJu1EREREREREKsWknYiIiIiIiEilmLQTERERERERqRSTdiIiIiIiIiKVYtJOREREREREpFJM2omIiIiIiIhUikk7ERERERERkUoxaSciIiIiIiJSKSbtRERERERERCrFpJ2IiIiIiIhIpZi0ExEREREREakUk3YiIiIiIiIilWLSTkRERERERKRSTNqJiIiIiIiIVIpJOxERkcg0Go3SIRAREVGEYNJOREREREREpFJM2omIiIiIiIhUikk7ERERERERkUoxaSciIiIiIiJSKSbtRERERERERCrFpJ2IiIiIiIhIpZi0ExEREREREakUk3YiIiIiIiIilWLSTkRERERERKRSTNqJiIiIiIiIVIpJOxEREREREZFKMWknIiIiIiIiUikm7UREREREREQqxaSdiIiIiIiISKWYtBMRERERERGpFJN2IiIiIiIiIpVSNGlfu3YtBg4ciISEBGg0GixatMj2mclkwltvvYWrr74aNWvWREJCAh5//HGcPn3aYRkVFRV46aWX0LBhQ9SsWRN33303Tp48KfOaEBEREREREYlP0aS9pKQE11xzDaZNm+byWWlpKbZv344xY8Zg+/btWLBgAQ4dOoS7777bYb5XX30VCxcuxPz587F+/XoUFxdjwIABsFgscq0GERGRA43SARAREVHE0CtZeP/+/dG/f3+3n9WtWxfLli1zmDZ16lR07doVmZmZaN68OQoLCzFjxgzMmTMHd9xxBwDgxx9/RLNmzbB8+XL069dP8nUgIiIiIiIikoqiSXugCgsLodFocMkllwAAtm3bBpPJhL59+9rmSUhIQMeOHZGSkuIxaa+oqEBFRYXt76KiIgBVTfJNJpN0KxCi6tjUHCNFF9ZJUhu11ElBEGz/VjoWUpZa6iRRNdZJUqNorZf+rm/YJO3l5eV4++23MXjwYNSpUwcAkJWVhZiYGNSrV89h3saNGyMrK8vjssaPH4+xY8e6TE9OTkZcXJy4gUvAuQUCkdJYJ0ltlK6TJSU6VDeSX7x4saKxkDooXSeJnLFOkhpFW70sLS31a76wSNpNJhMefvhhWK1W/N///Z/P+QVBgEbj+Y3CUaNGYcSIEba/i4qK0KxZM/Tt29d2Q0CNTCYTli1bhj59+sBgMCgdDkWwr9ceR6uGceh7ZWOv87FOktqopU5OPrQeKK86EScmJioWBylPLXWSqBrrJKlRtNbL6hbfvqg+aTeZTBg0aBCOHz+OlStXOiTV8fHxqKysRH5+vsPT9uzsbHTv3t3jMo1GI4xGo8t0g8EQFpUkXOKk8LQ1PQ+fLjsMAEj/+C6/vsM6SWqjdJ20v3HMfYMA5eskkTPWSVKjaKuX/q6rqsdpr07YDx8+jOXLl6NBgwYOn19//fUwGAwOzSjOnDmDPXv2eE3aiciznPMVvmciIiIiIiJZKPqkvbi4GEeOHLH9ffz4caSlpaF+/fpISEjAgw8+iO3bt+Pvv/+GxWKxvadev359xMTEoG7duhg6dChef/11NGjQAPXr18cbb7yBq6++2tabPBEREREREVG4UjRp37p1K3r16mX7u/o98yFDhiApKQl//vknAODaa691+N6qVavQs2dPAMDnn38OvV6PQYMGoaysDL1798asWbOg0+lkWQciIiIiIiIiqSiatPfs2dNhWBxn3j6rFhsbi6lTp2Lq1KlihkZERERERESkOFW/005ERBTuHpyegsKy6Bp3loiIyNmXq45g8LebUGG2KB1K2GHSTkREJDL7dmJbM/Lx9ZqjisVCRESkBhOXHkTK0Vws2nFK6VDCDpN2IiIiiZWZ+FSBiIiil/1rz+Umq4KRhCcm7URERERERCSJDUfO4fqPlisdRlhTtCM6IiIiIiIiilyPfrdZ6RDCHp+0ExEREREREakUk3YiIiIiIiIilWLSTkRERERERKRSTNqJyIHgexYi8kGjdABEREQUMZi0ExEREREREakUk3YiIiIiIiIilWLSTkRERERERKRSTNqJiIiIiIiIVIpJOxEREREREZFKMWknIiIiIiIiUikm7URERBLTcBA4IiIiChKTdiIiIiIiIiKVYtJOREREREREpFJM2omIiCSmYet4IiIiChKTdiIiIiIiIiKVYtJOREREREREpFJM2onIgSAoHQEREREREVVj0k5ERERERESkUkzaiYiIiIiIiFSKSTsRERERERGRSjFpJyIiIiIiIlIpJu1ERERi47jsREREJBIm7UREREREREQqxaSdiIiIiIiISKWYtBMREUmMreWJiIgoWEzaiYiIiIiIiFSKSTsRERERERGRSjFpJyIiIiIiIlIpJu1EREREREREKsWknYgcCBCUDoEo4mjYEx0REREFiUk7ERERERERkUoxaSciIiIiIiJSKSbtRERERERERCrFpJ2IiIiIiIhIpZi0ExEREREREakUk3YiIiIiIjesVgFfrjqClKPnlA6FiKKYXukAiIiIiIjU6J/dZzBx6UEAQPrHdykcDRFFKz5pJyJ1EThOPEUeDQdqJwpLmXmlSodARMSknYguSt6bhbd+26VcAD//F/jqVsBiVi4GIhEwRSciIiKxMGknIptn5mxDSaVFuQD2/wWc3Q2cTFUuBiIiIiIiFWHSTkTqw6bEREREREQAFE7a165di4EDByIhIQEajQaLFi1y+FwQBCQlJSEhIQE1atRAz549sXfvXod5Kioq8NJLL6Fhw4aoWbMm7r77bpw8eVLGtSAiIiIiIiKShqJJe0lJCa655hpMmzbN7ecTJkzApEmTMG3aNKSmpiI+Ph59+vTB+fPnbfO8+uqrWLhwIebPn4/169ejuLgYAwYMgMWiYBNfIiIiIiIiIhEoOuRb//790b9/f7efCYKAyZMnY/To0bj//vsBALNnz0bjxo0xd+5cDB8+HIWFhZgxYwbmzJmDO+64AwDw448/olmzZli+fDn69esn27oQERERERGRdwJHCgqYasdpP378OLKystC3b1/bNKPRiB49eiAlJQXDhw/Htm3bYDKZHOZJSEhAx44dkZKS4jFpr6ioQEVF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Iec4efKk6N+/vzjllFNEvXr1RM+ePcWePXtCjjl69Kjo1auXSE9PF+np6aJXr17i2LFjIcfs3r1bXH/99aJevXrilFNOEf379w/ZmoNqpwULFggAEf/17t1bCOG+Mrh+/Xpx+eWXC6/XK5o1ayaGDBlSY7eLIX2xyuSJEydE9+7dxWmnnSY0TROnn3666N27d0R5Y5kkM+mVRwBiwoQJgWN4rSQ7xSuTvFZaTxKialU+EREREREREbkK17QTERERERERuRQb7UREREREREQuxUY7ERERERERkUux0U5ERERERETkUmy0ExEREREREbkUG+1ERERERERELsVGOxEREREREZFLsdFORERERERE5FJstBMRERERERG5FBvtRERElJCKigp06dIFN998c8jjBQUFaNWqFZ566imHckZERFT7SEII4XQmiIiIqGbZtm0bzj//fIwdOxa9evUCANx5551Yt24dVq5cCY/H43AOiYiIagc22omIiCgpI0aMwJAhQ7BhwwasXLkSf//737FixQqcf/75TmeNiIio1mCjnYiIiJIihEC3bt2gKApycnIwYMAATo0nIiIyGRvtRERElLQff/wRZ599Ntq3b4/Vq1dDVVWns0RERFSrMBAdERERJe39999H/fr1sXPnTuzbt8/p7BAREdU6HGknIiKipGRnZ+OKK67AzJkz8fLLL6OiogJz586FJElOZ42IiKjW4Eg7ERERJezkyZPo3bs37rvvPvzxj3/Ee++9h5UrV2LMmDFOZ42IiKhWYaOdiIiIEjZo0CD4fD689NJLAIDTTz8dr732Gh599FHs2rXL2cwRERHVIpweT0RERAlZtGgRrr76aixcuBCXXXZZyHM9evRAeXk5p8kTERGZhI12IiIiIiIiIpfi9HgiIiIiIiIil2KjnYiIiIiIiMil2GgnIiIiIiIicik22omIiIiIiIhcio12IiIiIiIiIpdio52IiIiIiIjIpdhoJyIiIiIiInIpNtqJiIiIiIiIXIqNdiIiIiIiIiKXYqOdiIiIiIiIyKXYaCciIiIiIiJyqf8HIvtvUobEjQUAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# visualizing in a plot\n",
"x_ax = range(len(y_test))\n",
"plt.figure(figsize=(12, 6))\n",
"plt.plot(x_ax, y_test, label=\"original\")\n",
"plt.plot(x_ax, preds, label=\"predicted\")\n",
"plt.title(\"Boston dataset test and predicted data\")\n",
"plt.xlabel(\"X\")\n",
"plt.ylabel(\"Price\")\n",
"plt.legend(loc=\"best\", fancybox=True, shadow=True)\n",
"plt.grid(True)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: title={'center': 'Metric during training'}, xlabel='Iterations', ylabel='tweedie'>"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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qFJXIlSte69Mv11/DsZtFBc7yeW24uJiXLx4Uf85KysLGRkZCAgIQHh4OEaPHo1jx45h27ZtUKvV+tmfgIAAuLq6AgAmTZqEpk2b6r+VNm/ePMTFxaF169YoLCzE8uXLkZGRgQ8//FB/nBkzZmDixIno1q0bevXqhU8++QTZ2dmYOnWqHc+eiOpLIhHg6qT/N65SqbB9+58YNqyzXQJp1RCl1twLiur7ApXmvu26QKYRq4a0KuW6OlX2vVcX9+13rx8ag2PdmwVVi6L20nblNlHU9buaOvp+mjqe9rwq1Grk3LiBoOAmECGY6Gdl32rqZ2Vb1Y/BfXUq+1jr70UENGoRQGMKqFJ8f+WCoztRLY3SSS63HTlyBAMGDNB/1l3Omjx5MpKTk/HDDz8AADp16mSwX2pqKuLj4wEA2dnZkEju3aDwzp07eOGFF5CbmwtfX1907twZ+/btQ48ePfR1xo0bh4KCAsyfPx85OTno0KEDtm/fjubNm9voTImIHEsiESCBgAfxRvnaQLodw4Z1sesMqWgygFUJpFUDWNWZRLEyHGpMB1Rd+b0AWXu5QegTDft2fz81VX+uEnjF+8Kv7jhV26hQa3D16jWEhTcFBKGyHgyC5f37ae7rS9VgLur7ca+urm9i1T5q7u1bW/1ytfk3NXZoSIqPj4dYQ9SuaZtOWlqaweelS5di6dKlte43bdo0TJs2rdZ6REREdSEI2m94Pki0gTQbw4bFNNhL9oWFhfB937y6fEYEERERkQkMSUREREQmMCQRERERmcCQRERERGQCQxIRERGRCQxJRERERCYwJBERERGZwJBEREREZAJDEhEREZEJDElEREREJjAkEREREZnAkERERERkAkMSERERkQkMSUREREQmMCQRERERmcCQRERERGQCQxIRERGRCQxJRERERCYwJBERERGZwJBEREREZAJDEhEREZEJDElEREREJjAkEREREZnAkERERERkAkMSERERkQkMSUREREQmMCQRERERmcCQRERERGQCQxIRERGRCQxJRERERCYwJBERERGZwJBEREREZAJDEhEREZEJDElEREREJjAkEREREZnAkERERERkAkMSERERkQkMSUREREQmMCQRERERmeDQkLRv3z4kJiYiPDwcgiBg69at+m0qlQpvvPEGYmJi4OnpifDwcEyaNAnXr1+vsc01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2LBhA0pKStCrVy+Os428/PLLGD58OAYNGmRQzvG2rszMTISHh6NFixYYP348Ll26BKDxjzMfcGuh/Px8qNVqhISEGJSHhIQgNzfXQb1qXHTjaGqMr1y5oq/j6uoKf39/ozr8PVRPFEXMmDEDjzzyCDp06ACA421tp06dQq9evVBWVgYvLy9s2bIF7dq10//HgONsPRs2bMCxY8dw+PBho238u7aenj174osvvkB0dDRu3LiBBQsWoHfv3jhz5kyjH2eGpDoSBMHgsyiKRmVUP3UZY/4eavbKK6/g5MmTOHDggNE2jrd1tGnTBhkZGbhz5w42bdqEyZMnY+/evfrtHGfruHr1Kl599VXs2rULbm5u1dbjeNdfQkKC/ueYmBj06tULrVq1wueff464uDgAjXecebnNQkFBQZBKpUbpNy8vzyhJU93ovjVR0xiHhoaivLwct2/frrYOGfrb3/6GH374AampqXjooYf05Rxv63J1dUVUVBS6deuGRYsWITY2Fh988AHH2cqOHj2KvLw8dO3aFS4uLnBxccHevXuxfPlyuLi46MeL4219np6eiImJQWZmZqP/u2ZIspCrqyu6du2KlJQUg/KUlBT07t3bQb1qXFq0aIHQ0FCDMS4vL8fevXv1Y9y1a1fIZDKDOjk5OTh9+jR/D/cRRRGvvPIKNm/ejD179qBFixYG2znetiWKIpRKJcfZygYOHIhTp04hIyND/+rWrRueeuopZGRkoGXLlhxvG1EqlTh37hzCwsIa/9+1I1aLOzvdLQDWrl0rnj17Vpw+fbro6ekpXr582dFdcxpFRUXi8ePHxePHj4sAxCVLlojHjx/X30Zh8eLFoq+vr7h582bx1KlT4oQJE0x+pfShhx4Sd+/eLR47dkz8y1/+4hRfKbW3l156SfT19RXT0tIMvsKrUCj0dTje1jF79mxx3759YlZWlnjy5EnxX//6lyiRSMRdu3aJoshxtrWq324TRY63tbz22mtiWlqaeOnSJfG3334TH3vsMdHb21v/37zGPM4MSXX04Ycfis2bNxddXV3FLl266L9OTeZJTU0VARi9Jk+eLIqi9mulb731lhgaGirK5XKxX79+4qlTpwzaKC0tFV955RUxICBAdHd3Fx977DExOzvbAWfTsJkaZwDiZ599pq/D8baOZ599Vv/vheDgYHHgwIH6gCSKHGdb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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lgbm.plot_metric(eval_results, metric=\"tweedie\")\n"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: title={'center': 'Feature importance'}, xlabel='Feature importance', ylabel='Features'>"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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Yz+a/6ecPXuWb775BltbW/T19TE0NKRjx44kJiZy+fJlrbr29vZUqVJFq6xs2bJaue3cuRNXV1fq1av3wWNu376dPHny0KhRI633pHz58tjb22v9DAmRE8lFrEIIIbKEm5tbihex/vPPPwBUrlw5xf3e7Wi2bduW/fv3M3r0aCpXroyVlRUqlQo/P7/PNk0iaWrI+/EmTSNJyZMnTzA3N0/zsWxsbLSeGxkZYWZmhomJSbLymJiYZPvb29unWPbnn38C8PjxYyB5TvB2RSC1Ws3Tp0+1LlRNqe6H3Lp1i1q1alGyZEm+//57nJycMDEx4eTJk/Tu3TvZe2Rra5usDWNjY616Dx8+pEiRIh897j///MOzZ88wMjJKcXvS9CohcirpwAshhMhW8uXLB8CmTZsoWrToB+s9f/6c7du3M3bsWL777julPC4ujidPnqT6eCYmJsTFxSUrf/TokRLLu94d0X433vnz539wNZkCBQqkOp6M9ODBgxTLkjrKSV+T5o6/6969e+jp6ZE3b16t8vfz/5gtW7bw8uVLNm/erPVenjt3LtVtvC9//vzcuXPno3Xy5cuHra0tu3btSnG7paVluo8vRHYgHXghhBDZire3NwYGBly7du2j0zVUKhUajQZjY2Ot8uXLl5OYmKhVllQnpVF5Jycn/vrrL62yy5cvc+nSpRQ78O+rWbMmefLk4cKFC/Tp0+eT9TPTTz/9xMCBA5VO982bNzl69CgdO3YEoGTJkhQqVIgff/yRwYMHK/VevnxJWFiYsjLNp7z7+pqamirlSe29+x5pNBqWLVuW7px8fX0ZM2YMBw4c4Kuvvkqxztdff8369etJTEykatWq6T6WENmVdOCFEEJkK05OTowfP56RI0dy/fp1fHx8yJs3L//88w8nT57E3NyccePGYWVlRe3atZkxYwb58uXDycmJ3377jRUrVpAnTx6tNt3d3QFYunQplpaWmJiY4OzsjK2tLR06dKB9+/b06tWL5s2bc/PmTaZPn07+/PlTFa+FhQXz58+nU6dOPHnyhBYtWmBnZ8fDhw/5888/efjwIYsXL87olylVoqOjadq0KYGBgTx//pyxY8diYmLC8OHDgbfTkaZPn067du34+uuv6d69O3FxccyYMYNnz54xderUVB2nTJkyAEybNg1fX1/09fUpW7Ys9evXx8jIiDZt2jB0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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lgbm.plot_importance(model, max_num_features=20)\n"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('seasonal_rolling_mean_12_28', 0.1939),\n",
" ('rolling_mean_14_28', 0.1933),\n",
" ('seasonal_rolling_mean_52_28', 0.1596),\n",
" ('seasonal_rolling_mean_26_28', 0.1525),\n",
" ('seasonal_rolling_mean_4_28', 0.0635),\n",
" ('seasonal_rolling_std_52_28', 0.0568),\n",
" ('rolling_std_14_28', 0.0484),\n",
" ('rolling_mean_7_28', 0.0336),\n",
" ('seasonal_rolling_std_26_28', 0.0126),\n",
" ('rolling_std_7_28', 0.0076),\n",
" ('seasonal_rolling_std_12_28', 0.0067),\n",
" ('lag_1_28', 0.0059),\n",
" ('median_price_item_id', 0.0051),\n",
" ('median_price_id', 0.0042),\n",
" ('seasonal_rolling_mean_1_28', 0.0038),\n",
" ('max_price_id', 0.0038),\n",
" ('Afteris_holiday', 0.0033),\n",
" ('Month', 0.0032),\n",
" ('max_price_item_id', 0.003),\n",
" ('item_id', 0.0026),\n",
" ('max_price_dept_id', 0.0026),\n",
" ('id', 0.0022),\n",
" ('Beforeis_holiday', 0.0021),\n",
" ('median_price_dept_id', 0.0019),\n",
" ('Dayofweek', 0.0016),\n",
" ('rolling_mean_7_28_na', 0.0015),\n",
" ('lag_90_28', 0.0015),\n",
" ('seasonal_lag_2_28', 0.0012),\n",
" ('lag_30_28', 0.0011),\n",
" ('rolling_mean_14_28_na', 0.001),\n",
" ('seasonal_lag_26_28', 0.001),\n",
" ('seasonal_lag_4_28', 0.0009),\n",
" ('seasonal_lag_52_28', 0.0009),\n",
" ('lag_2_28', 0.0008),\n",
" ('lag_365_28', 0.0008),\n",
" ('seasonal_rolling_mean_2_28', 0.0008),\n",
" ('Afteris_big_holiday', 0.0008),\n",
" ('cat_id', 0.0007),\n",
" ('event_name_1', 0.0007),\n",
" ('Beforeis_big_holiday', 0.0007),\n",
" ('lag_1_28_na', 0.0006),\n",
" ('lag_14_28_na', 0.0006),\n",
" ('lag_21_28_na', 0.0006),\n",
" ('lag_3_28', 0.0006),\n",
" ('dept_id', 0.0005),\n",
" ('Day', 0.0005),\n",
" ('lag_14_28', 0.0005),\n",
" ('seasonal_lag_12_28', 0.0005),\n",
" ('Aftersnap_TX', 0.0005),\n",
" ('snap_TX', 0.0004),\n",
" ('lag_2_28_na', 0.0004),\n",
" ('lag_3_28_na', 0.0004),\n",
" ('seasonal_rolling_mean_2_28_na', 0.0004),\n",
" ('lag_7_28', 0.0004),\n",
" ('lag_21_28', 0.0004),\n",
" ('lag_30_28_na', 0.0003),\n",
" ('seasonal_lag_1_28', 0.0003),\n",
" ('seasonal_rolling_std_4_28', 0.0003),\n",
" ('Beforesnap_TX', 0.0003),\n",
" ('snap_TX_fw', 0.0002),\n",
" ('lag_7_28_na', 0.0002),\n",
" ('lag_90_28_na', 0.0002),\n",
" ('lag_365_28_na', 0.0002),\n",
" ('seasonal_lag_1_28_na', 0.0002),\n",
" ('seasonal_lag_12_28_na', 0.0002),\n",
" ('rolling_std_14_28_na', 0.0002),\n",
" ('seasonal_rolling_mean_12_28_na', 0.0002),\n",
" ('max_price_cat_id', 0.0002),\n",
" ('max_price_store_id', 0.0002),\n",
" ('store_id', 0.0001),\n",
" ('event_type_1', 0.0001),\n",
" ('is_big_holiday', 0.0001),\n",
" ('snap_TX_bw', 0.0001),\n",
" ('seasonal_lag_2_28_na', 0.0001),\n",
" ('seasonal_lag_4_28_na', 0.0001),\n",
" ('seasonal_lag_26_28_na', 0.0001),\n",
" ('seasonal_lag_52_28_na', 0.0001),\n",
" ('rolling_std_7_28_na', 0.0001),\n",
" ('seasonal_rolling_mean_1_28_na', 0.0001),\n",
" ('seasonal_rolling_std_2_28', 0.0001),\n",
" ('median_price_cat_id', 0.0001),\n",
" ('event_name_2', 0.0),\n",
" ('event_type_2', 0.0),\n",
" ('Is_month_end', 0.0),\n",
" ('Is_month_start', 0.0),\n",
" ('is_holiday', 0.0),\n",
" ('seasonal_rolling_mean_4_28_na', 0.0),\n",
" ('seasonal_rolling_mean_26_28_na', 0.0),\n",
" ('seasonal_rolling_mean_52_28_na', 0.0),\n",
" ('seasonal_rolling_std_2_28_na', 0.0),\n",
" ('seasonal_rolling_std_4_28_na', 0.0),\n",
" ('seasonal_rolling_std_12_28_na', 0.0),\n",
" ('seasonal_rolling_std_26_28_na', 0.0),\n",
" ('seasonal_rolling_std_52_28_na', 0.0),\n",
" ('median_price_store_id', 0.0)]"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"importance = model.feature_importance(importance_type='gain')\n",
"importance_normalized = np.round(importance / np.sum(importance), 4)\n",
"\n",
"fe_imps = {fe_name: fe_imp for fe_name, fe_imp in zip(model.feature_name(), importance_normalized)}\n",
" \n",
"sorted(fe_imps.items(), key=lambda x: x[1], reverse=True)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((10042491, 14), (256088, 14))"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"col_keep = list(set([col for col, imp in fe_imps.items() if imp > 0.005] + [\"id\"]))\n",
"X_train = X_train[col_keep]\n",
"X_test = X_test[col_keep]\n",
"\n",
"train_df = X_train.copy()\n",
"train_df[target_attr] = y_train\n",
"\n",
"val_df = X_test.copy()\n",
"val_df[target_attr] = y_test\n",
"\n",
"X_train.shape, X_test.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 4: TSCV"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"n_folds = 3\n",
"forecast_horizon = 28\n",
"level = \"id\"\n",
"\n",
"data_path = \"./data\"\n",
"models_path = \"./models\"\n",
"results_path = \"./results\""
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10298579\n",
"CPU times: user 20.8 s, sys: 17.3 s, total: 38.2 s\n",
"Wall time: 10.7 s\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>date</th>\n",
" <th>state_id</th>\n",
" <th>sales</th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>sell_price</th>\n",
" <th>snap_TX</th>\n",
" <th>...</th>\n",
" <th>seasonal_rolling_mean_2_28</th>\n",
" <th>seasonal_rolling_mean_4_28</th>\n",
" <th>seasonal_rolling_mean_12_28</th>\n",
" <th>seasonal_rolling_mean_26_28</th>\n",
" <th>seasonal_rolling_mean_52_28</th>\n",
" <th>seasonal_rolling_std_2_28</th>\n",
" <th>seasonal_rolling_std_4_28</th>\n",
" <th>seasonal_rolling_std_12_28</th>\n",
" <th>seasonal_rolling_std_26_28</th>\n",
" <th>seasonal_rolling_std_52_28</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>FOODS_1_004_TX_1_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_1</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>FOODS_1_004_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>FOODS_1_004_TX_3_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>4</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_3</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>FOODS_1_005_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>1</td>\n",
" <td>FOODS_1_005</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>3.28</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>FOODS_1_009_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>3</td>\n",
" <td>FOODS_1_009</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>2.68</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 71 columns</p>\n",
"</div>"
],
"text/plain": [
" id date state_id sales item_id \\\n",
"0 FOODS_1_004_TX_1_evaluation 2013-01-01 TX 20 FOODS_1_004 \n",
"1 FOODS_1_004_TX_2_evaluation 2013-01-01 TX 20 FOODS_1_004 \n",
"2 FOODS_1_004_TX_3_evaluation 2013-01-01 TX 4 FOODS_1_004 \n",
"3 FOODS_1_005_TX_2_evaluation 2013-01-01 TX 1 FOODS_1_005 \n",
"4 FOODS_1_009_TX_2_evaluation 2013-01-01 TX 3 FOODS_1_009 \n",
"\n",
" dept_id cat_id store_id sell_price snap_TX ... \\\n",
"0 FOODS_1 FOODS TX_1 1.78 True ... \n",
"1 FOODS_1 FOODS TX_2 1.78 True ... \n",
"2 FOODS_1 FOODS TX_3 1.78 True ... \n",
"3 FOODS_1 FOODS TX_2 3.28 True ... \n",
"4 FOODS_1 FOODS TX_2 2.68 True ... \n",
"\n",
" seasonal_rolling_mean_2_28 seasonal_rolling_mean_4_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_mean_12_28 seasonal_rolling_mean_26_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_mean_52_28 seasonal_rolling_std_2_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_std_4_28 seasonal_rolling_std_12_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_std_26_28 seasonal_rolling_std_52_28 \n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
"[5 rows x 71 columns]"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"\n",
"lag_features = [1, 2, 3, 7, 14, 21, 30, 90, 365]\n",
"seasonal_lag_features = [1, 2, 4, 12, 26, 52]\n",
"\n",
"rolling_features = {\"mean\": [7, 14], \"std\": [7, 14]}\n",
"seasonal_rolling_features = {\"mean\": [1, 2, 4, 12, 26, 52], \"std\": [2, 4, 12, 26, 52]} # a std for 1 results in all NaNs (why???)\n",
"\n",
"df = build_dataset(\n",
" data_path,\n",
" level=\"id\",\n",
" forecast_horizon=28,\n",
" lag_features=lag_features,\n",
" seasonal_lag_features=seasonal_lag_features,\n",
" rolling_features=rolling_features,\n",
" seasonal_rolling_features=seasonal_rolling_features,\n",
")\n",
"\n",
"print(len(df))\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"# save the fold train/validation splits to make calculating RMSSE a bit faster and also if further EDA needed\n",
"max_yyyymmdd = df[\"date\"].max().strftime(\"%Y%m%d\")\n",
"\n",
"for i in range(n_folds):\n",
" fold = i + 1\n",
" train_df, val_df = build_train_test_splits(df, forecast_horizon=forecast_horizon, fold=fold)\n",
" \n",
" train_df.to_parquet(Path(f\"{data_path}/{max_yyyymmdd}_fold_{fold}_train.parquet\"))\n",
" val_df.to_parquet(Path(f\"{data_path}/{max_yyyymmdd}_fold_{fold}_val.parquet\"))"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['id', 'date', 'state_id', 'sales', 'item_id', 'dept_id', 'cat_id', 'store_id', 'sell_price', 'snap_TX', 'event_name_1', 'event_type_1', 'event_name_2', 'event_type_2', 'is_holiday', 'is_big_holiday', 'Aftersnap_TX', 'Afteris_holiday', 'Afteris_big_holiday', 'Beforesnap_TX', 'Beforeis_holiday', 'Beforeis_big_holiday', 'snap_TX_bw', 'is_holiday_bw', 'is_big_holiday_bw', 'snap_TX_fw', 'is_holiday_fw', 'is_big_holiday_fw', 'Year', 'Month', 'Week', 'Day', 'Dayofweek', 'Dayofyear', 'Is_month_end', 'Is_month_start', 'Is_quarter_end', 'Is_quarter_start', 'Is_year_end', 'Is_year_start', 'Elapsed', 'lag_1_28', 'lag_2_28', 'lag_3_28', 'lag_7_28', 'lag_14_28', 'lag_21_28', 'lag_30_28', 'lag_90_28', 'lag_365_28', 'seasonal_lag_1_28', 'seasonal_lag_2_28', 'seasonal_lag_4_28', 'seasonal_lag_12_28', 'seasonal_lag_26_28', 'seasonal_lag_52_28', 'rolling_mean_7_28', 'rolling_mean_14_28', 'rolling_std_7_28', 'rolling_std_14_28', 'seasonal_rolling_mean_1_28', 'seasonal_rolling_mean_2_28', 'seasonal_rolling_mean_4_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_mean_52_28', 'seasonal_rolling_std_2_28', 'seasonal_rolling_std_4_28', 'seasonal_rolling_std_12_28', 'seasonal_rolling_std_26_28', 'seasonal_rolling_std_52_28']\n"
]
}
],
"source": [
"print(df.columns.tolist())"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"cont_features = [\n",
" \"lag_1_28\",\n",
" \"lag_2_28\",\n",
" \"lag_3_28\",\n",
" \"lag_7_28\",\n",
" \"lag_14_28\",\n",
" \"lag_21_28\",\n",
" \"lag_30_28\",\n",
" \"lag_90_28\",\n",
" \"lag_365_28\",\n",
" \"seasonal_lag_1_28\",\n",
" \"seasonal_lag_2_28\",\n",
" \"seasonal_lag_4_28\",\n",
" \"seasonal_lag_12_28\",\n",
" \"seasonal_lag_26_28\",\n",
" \"seasonal_lag_52_28\",\n",
" \"rolling_mean_7_28\",\n",
" \"rolling_mean_14_28\",\n",
" \"rolling_std_7_28\",\n",
" \"rolling_std_14_28\",\n",
" \"seasonal_rolling_mean_1_28\",\n",
" \"seasonal_rolling_mean_2_28\",\n",
" \"seasonal_rolling_mean_4_28\",\n",
" \"seasonal_rolling_mean_12_28\",\n",
" \"seasonal_rolling_mean_26_28\",\n",
" \"seasonal_rolling_mean_52_28\",\n",
" # \"seasonal_rolling_std_1_28\",\n",
" \"seasonal_rolling_std_2_28\",\n",
" \"seasonal_rolling_std_4_28\",\n",
" \"seasonal_rolling_std_12_28\",\n",
" \"seasonal_rolling_std_26_28\",\n",
" \"seasonal_rolling_std_52_28\",\n",
" \"Aftersnap_TX\",\n",
" \"Afteris_holiday\",\n",
" \"Afteris_big_holiday\",\n",
" \"Beforesnap_TX\",\n",
" \"Beforeis_holiday\",\n",
" \"Beforeis_big_holiday\",\n",
" \"max_price_id\",\n",
" \"median_price_id\",\n",
" \"max_price_item_id\",\n",
" \"median_price_item_id\",\n",
" \"max_price_dept_id\",\n",
" \"median_price_dept_id\",\n",
" \"max_price_cat_id\",\n",
" \"median_price_cat_id\",\n",
" \"max_price_store_id\",\n",
" \"median_price_store_id\",\n",
"]\n",
"\n",
"cat_features = [\n",
" \"id\",\n",
" \"item_id\",\n",
" \"dept_id\",\n",
" \"cat_id\",\n",
" \"store_id\",\n",
" \"snap_TX\",\n",
" \"event_name_1\",\n",
" \"event_type_1\",\n",
" \"event_name_2\",\n",
" \"event_type_2\",\n",
" \"Month\",\n",
" \"Day\",\n",
" \"Dayofweek\",\n",
" \"Is_month_end\",\n",
" \"Is_month_start\",\n",
" \"is_holiday\",\n",
" \"is_big_holiday\",\n",
" \"snap_TX_bw\",\n",
" \"snap_TX_fw\",\n",
"]\n",
"\n",
"features = cont_features + cat_features\n",
"target_attr = \"sales\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Random Forest"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"BEGIN TRAINING :: RANDOM FOREST\n",
"=== Training Started: Fold 1 ===\n",
"Number of Train/Validation Examples: 10042491 | 256088\n",
"Train Date Range: 2013-01-01 00:00:00 | 2016-04-24 00:00:00\n",
"Validation Date Range: 2016-04-25 00:00:00 | 2016-05-22 00:00:00\n",
"RMSSE: 0.7557104300927474\n",
"RMSSE: 0.7546597446177328\n",
"=== Training Finished: Fold 1 ===\n",
"Final Features: ['seasonal_rolling_mean_2_28', 'rolling_mean_14_28', 'id', 'seasonal_rolling_mean_4_28', 'rolling_mean_7_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_mean_52_28']\n",
"Final RMSSE: 0.7546597446177328\n",
"=== Training Started: Fold 2 ===\n",
"Number of Train/Validation Examples: 9786427 | 256064\n",
"Train Date Range: 2013-01-01 00:00:00 | 2016-03-27 00:00:00\n",
"Validation Date Range: 2016-03-28 00:00:00 | 2016-04-24 00:00:00\n",
"RMSSE: 0.7338695879512891\n",
"RMSSE: 0.731481537792378\n",
"=== Training Finished: Fold 2 ===\n",
"Final Features: ['seasonal_rolling_mean_2_28', 'rolling_mean_14_28', 'id', 'seasonal_rolling_mean_4_28', 'rolling_mean_7_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_mean_52_28']\n",
"Final RMSSE: 0.731481537792378\n",
"=== Training Started: Fold 3 ===\n",
"Number of Train/Validation Examples: 9530367 | 256060\n",
"Train Date Range: 2013-01-01 00:00:00 | 2016-02-28 00:00:00\n",
"Validation Date Range: 2016-02-29 00:00:00 | 2016-03-27 00:00:00\n",
"RMSSE: 0.7429255771867385\n",
"RMSSE: 0.741228056471335\n",
"=== Training Finished: Fold 3 ===\n",
"Final Features: ['rolling_mean_14_28', 'id', 'seasonal_rolling_mean_4_28', 'rolling_mean_7_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_mean_52_28']\n",
"Final RMSSE: 0.741228056471335\n",
"CPU times: user 10min 1s, sys: 3min 13s, total: 13min 14s\n",
"Wall time: 6min 3s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"print(\"BEGIN TRAINING :: RANDOM FOREST\")\n",
"for fold_num in range(n_folds):\n",
" fold = fold_num + 1\n",
" print(f\"=== Training Started: Fold {fold} ===\")\n",
" \n",
" to = build_fold_to(df, cat_features, cont_features, target_attr, forecast_horizon=forecast_horizon, fold=fold, data_fpath=data_path)\n",
" \n",
" X_train, y_train = to.train.xs, to.train.ys.values.ravel()\n",
" X_test, y_test = to.valid.xs, to.valid.ys.values.ravel()\n",
"\n",
" train_df = to.train.items\n",
" train_df[target_attr] = y_train\n",
"\n",
" val_df = to.valid.items\n",
" val_df[target_attr] = y_test\n",
" \n",
" print(f\"Number of Train/Validation Examples: {len(X_train)} | {len(X_test)}\")\n",
" print(f\"Train Date Range: {train_df.date.min()} | {train_df.date.max()}\")\n",
" print(f\"Validation Date Range: {val_df.date.min()} | {val_df.date.max()}\")\n",
" \n",
" col_keep = []\n",
" rmsse_val = None\n",
" for run_num in range(2):\n",
" rf = RandomForestRegressor(n_estimators=40, max_samples=50_000, max_features=0.5, min_samples_leaf=100, n_jobs=-1, random_state=9)\n",
" res = rf.fit(X_train, y_train)\n",
" preds = rf.predict(X_test)\n",
" \n",
" score_df, rmsse_val = rmsse(train_df, val_df, preds)\n",
" print(f\"RMSSE: {rmsse_val}\")\n",
" \n",
" if run_num == 0:\n",
" # retrain on most important features\n",
" feat_importance_df = pd.DataFrame({\"cols\": X_train.columns.tolist(), \"imp\": rf.feature_importances_}).sort_values(\"imp\", ascending=False)\n",
" \n",
" col_keep = list(feat_importance_df[feat_importance_df.imp > 0.005].cols)\n",
" col_keep = list(set(col_keep + [\"id\"]))\n",
"\n",
" X_train = X_train[col_keep]\n",
" X_test = X_test[col_keep]\n",
" \n",
" # save model and features\n",
" joblib.dump(rf, Path(models_path)/f\"rf_fold_{fold}.pkl\")\n",
" \n",
" with open(Path(models_path)/f\"rf_fold_{fold}_features.json\", 'w') as json_file:\n",
" json.dump(col_keep, json_file)\n",
" \n",
" # save validation results\n",
" for cat_name in to.cat_names:\n",
" mapping_dict = {idx: value for idx, value in enumerate(to.classes[cat_name])}\n",
" val_df[f\"orig_{cat_name}\"] = val_df[cat_name].map(mapping_dict)\n",
" \n",
" val_df[target_attr] = y_test\n",
" val_df[f\"{target_attr}_preds\"] = preds\n",
" val_df = val_df.merge(score_df.reset_index()[[\"id\", \"rmsse\"]], on=\"id\")\n",
" val_df = val_df.rename(columns={\"rmsse\": \"rmsse_id\"})\n",
" val_df[f\"rmsse_overall\"] = rmsse_val\n",
" \n",
" val_df = (val_df.drop(columns=\"id\").rename(columns={\"orig_id\": \"id\"}))\n",
" val_df[[\"id\", \"date\", target_attr, f\"{target_attr}_preds\", \"rmsse_id\", \"rmsse_overall\"]].to_parquet(Path(results_path)/f\"{max_yyyymmdd}_fold_{fold}_rf_results.parquet\")\n",
" \n",
" print(f\"=== Training Finished: Fold {fold} ===\")\n",
" print(\"Final Features: \", col_keep)\n",
" print(\"Final RMSSE: \", rmsse_val)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"# pd.read_parquet(\"./results/20160522_fold_3_rf_results.parquet\").tail(20)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### lightgbm"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"BEGIN TRAINING :: lightGBM\n",
"=== Training Started: Fold 1 ===\n",
"Number of Train/Validation Examples: 10042491 | 256088\n",
"Train Date Range: 2013-01-01 00:00:00 | 2016-04-24 00:00:00\n",
"Validation Date Range: 2016-04-25 00:00:00 | 2016-05-22 00:00:00\n",
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 1.023046 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 7157\n",
"[LightGBM] [Info] Number of data points in the train set: 10042491, number of used features: 94\n",
"[LightGBM] [Info] Start training from score 0.224990\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5331\tvalid_0's tweedie: 12.9396\n",
"[100]\ttraining's tweedie: 12.5095\tvalid_0's tweedie: 12.93\n",
"[150]\ttraining's tweedie: 12.5016\tvalid_0's tweedie: 12.9292\n",
"[200]\ttraining's tweedie: 12.4969\tvalid_0's tweedie: 12.9288\n",
"[250]\ttraining's tweedie: 12.4933\tvalid_0's tweedie: 12.9288\n",
"[300]\ttraining's tweedie: 12.4901\tvalid_0's tweedie: 12.9284\n",
"[350]\ttraining's tweedie: 12.4873\tvalid_0's tweedie: 12.9282\n",
"[400]\ttraining's tweedie: 12.4847\tvalid_0's tweedie: 12.9282\n",
"[450]\ttraining's tweedie: 12.4825\tvalid_0's tweedie: 12.9283\n",
"[500]\ttraining's tweedie: 12.4802\tvalid_0's tweedie: 12.9282\n",
"Early stopping, best iteration is:\n",
"[445]\ttraining's tweedie: 12.4828\tvalid_0's tweedie: 12.9281\n",
"RMSSE: 0.75242902668365\n",
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.026562 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 3398\n",
"[LightGBM] [Info] Number of data points in the train set: 10042491, number of used features: 14\n",
"[LightGBM] [Info] Start training from score 0.224990\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5427\tvalid_0's tweedie: 12.9467\n",
"[100]\ttraining's tweedie: 12.5233\tvalid_0's tweedie: 12.9381\n",
"[150]\ttraining's tweedie: 12.5184\tvalid_0's tweedie: 12.9363\n",
"[200]\ttraining's tweedie: 12.5159\tvalid_0's tweedie: 12.9351\n",
"[250]\ttraining's tweedie: 12.5143\tvalid_0's tweedie: 12.9349\n",
"[300]\ttraining's tweedie: 12.5125\tvalid_0's tweedie: 12.9346\n",
"[350]\ttraining's tweedie: 12.5113\tvalid_0's tweedie: 12.935\n",
"[400]\ttraining's tweedie: 12.5102\tvalid_0's tweedie: 12.935\n",
"Early stopping, best iteration is:\n",
"[311]\ttraining's tweedie: 12.5122\tvalid_0's tweedie: 12.9346\n",
"RMSSE: 0.7537823122937269\n",
"=== Training Finished: Fold 1 ===\n",
"Final Features: ['rolling_std_14_28', 'rolling_mean_14_28', 'id', 'seasonal_rolling_std_12_28', 'seasonal_rolling_mean_4_28', 'median_price_item_id', 'rolling_mean_7_28', 'lag_1_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_std_52_28', 'rolling_std_7_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_std_26_28', 'seasonal_rolling_mean_52_28']\n",
"Final RMSSE: 0.7537823122937269\n",
"=== Training Started: Fold 2 ===\n",
"Number of Train/Validation Examples: 9786427 | 256064\n",
"Train Date Range: 2013-01-01 00:00:00 | 2016-03-27 00:00:00\n",
"Validation Date Range: 2016-03-28 00:00:00 | 2016-04-24 00:00:00\n",
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 1.061464 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 7145\n",
"[LightGBM] [Info] Number of data points in the train set: 9786427, number of used features: 94\n",
"[LightGBM] [Info] Start training from score 0.225917\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5412\tvalid_0's tweedie: 12.218\n",
"[100]\ttraining's tweedie: 12.5175\tvalid_0's tweedie: 12.2064\n",
"[150]\ttraining's tweedie: 12.5096\tvalid_0's tweedie: 12.2056\n",
"[200]\ttraining's tweedie: 12.5048\tvalid_0's tweedie: 12.2048\n",
"[250]\ttraining's tweedie: 12.5009\tvalid_0's tweedie: 12.2036\n",
"[300]\ttraining's tweedie: 12.4975\tvalid_0's tweedie: 12.2027\n",
"[350]\ttraining's tweedie: 12.4947\tvalid_0's tweedie: 12.2023\n",
"[400]\ttraining's tweedie: 12.4923\tvalid_0's tweedie: 12.2017\n",
"[450]\ttraining's tweedie: 12.4896\tvalid_0's tweedie: 12.2015\n",
"[500]\ttraining's tweedie: 12.4874\tvalid_0's tweedie: 12.201\n",
"[550]\ttraining's tweedie: 12.4855\tvalid_0's tweedie: 12.2009\n",
"[600]\ttraining's tweedie: 12.4836\tvalid_0's tweedie: 12.2008\n",
"[650]\ttraining's tweedie: 12.4816\tvalid_0's tweedie: 12.2008\n",
"[700]\ttraining's tweedie: 12.48\tvalid_0's tweedie: 12.2004\n",
"[750]\ttraining's tweedie: 12.4783\tvalid_0's tweedie: 12.2001\n",
"[800]\ttraining's tweedie: 12.4768\tvalid_0's tweedie: 12.2001\n",
"[850]\ttraining's tweedie: 12.4754\tvalid_0's tweedie: 12.1998\n",
"[900]\ttraining's tweedie: 12.4741\tvalid_0's tweedie: 12.1996\n",
"[950]\ttraining's tweedie: 12.4726\tvalid_0's tweedie: 12.1992\n",
"[1000]\ttraining's tweedie: 12.4716\tvalid_0's tweedie: 12.1991\n",
"Did not meet early stopping. Best iteration is:\n",
"[1000]\ttraining's tweedie: 12.4716\tvalid_0's tweedie: 12.1991\n",
"RMSSE: 0.7304551937922373\n",
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.026671 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 3642\n",
"[LightGBM] [Info] Number of data points in the train set: 9786427, number of used features: 15\n",
"[LightGBM] [Info] Start training from score 0.225917\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5458\tvalid_0's tweedie: 12.2178\n",
"[100]\ttraining's tweedie: 12.5274\tvalid_0's tweedie: 12.2072\n",
"[150]\ttraining's tweedie: 12.5229\tvalid_0's tweedie: 12.2061\n",
"[200]\ttraining's tweedie: 12.5204\tvalid_0's tweedie: 12.2059\n",
"[250]\ttraining's tweedie: 12.5184\tvalid_0's tweedie: 12.2055\n",
"[300]\ttraining's tweedie: 12.5167\tvalid_0's tweedie: 12.2052\n",
"[350]\ttraining's tweedie: 12.5153\tvalid_0's tweedie: 12.2049\n",
"[400]\ttraining's tweedie: 12.5141\tvalid_0's tweedie: 12.2048\n",
"[450]\ttraining's tweedie: 12.513\tvalid_0's tweedie: 12.2046\n",
"[500]\ttraining's tweedie: 12.5118\tvalid_0's tweedie: 12.2044\n",
"[550]\ttraining's tweedie: 12.5108\tvalid_0's tweedie: 12.2043\n",
"[600]\ttraining's tweedie: 12.5098\tvalid_0's tweedie: 12.2042\n",
"[650]\ttraining's tweedie: 12.509\tvalid_0's tweedie: 12.2041\n",
"[700]\ttraining's tweedie: 12.5082\tvalid_0's tweedie: 12.204\n",
"[750]\ttraining's tweedie: 12.5074\tvalid_0's tweedie: 12.204\n",
"[800]\ttraining's tweedie: 12.5067\tvalid_0's tweedie: 12.204\n",
"Early stopping, best iteration is:\n",
"[717]\ttraining's tweedie: 12.508\tvalid_0's tweedie: 12.204\n",
"RMSSE: 0.7291672416445893\n",
"=== Training Finished: Fold 2 ===\n",
"Final Features: ['rolling_std_14_28', 'rolling_mean_14_28', 'id', 'seasonal_rolling_std_12_28', 'seasonal_rolling_mean_4_28', 'median_price_item_id', 'rolling_mean_7_28', 'lag_1_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_std_52_28', 'median_price_id', 'rolling_std_7_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_std_26_28', 'seasonal_rolling_mean_52_28']\n",
"Final RMSSE: 0.7291672416445893\n",
"=== Training Started: Fold 3 ===\n",
"Number of Train/Validation Examples: 9530367 | 256060\n",
"Train Date Range: 2013-01-01 00:00:00 | 2016-02-28 00:00:00\n",
"Validation Date Range: 2016-02-29 00:00:00 | 2016-03-27 00:00:00\n",
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 1.476439 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 7113\n",
"[LightGBM] [Info] Number of data points in the train set: 9530367, number of used features: 94\n",
"[LightGBM] [Info] Start training from score 0.226259\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5437\tvalid_0's tweedie: 12.4528\n",
"[100]\ttraining's tweedie: 12.5197\tvalid_0's tweedie: 12.4395\n",
"[150]\ttraining's tweedie: 12.5115\tvalid_0's tweedie: 12.4379\n",
"[200]\ttraining's tweedie: 12.5067\tvalid_0's tweedie: 12.4379\n",
"[250]\ttraining's tweedie: 12.5028\tvalid_0's tweedie: 12.4373\n",
"[300]\ttraining's tweedie: 12.4991\tvalid_0's tweedie: 12.4365\n",
"[350]\ttraining's tweedie: 12.4962\tvalid_0's tweedie: 12.4361\n",
"[400]\ttraining's tweedie: 12.4937\tvalid_0's tweedie: 12.4359\n",
"[450]\ttraining's tweedie: 12.4914\tvalid_0's tweedie: 12.436\n",
"[500]\ttraining's tweedie: 12.4893\tvalid_0's tweedie: 12.4359\n",
"[550]\ttraining's tweedie: 12.4873\tvalid_0's tweedie: 12.4356\n",
"[600]\ttraining's tweedie: 12.4854\tvalid_0's tweedie: 12.4356\n",
"[650]\ttraining's tweedie: 12.4836\tvalid_0's tweedie: 12.4355\n",
"[700]\ttraining's tweedie: 12.482\tvalid_0's tweedie: 12.4354\n",
"[750]\ttraining's tweedie: 12.4805\tvalid_0's tweedie: 12.4355\n",
"[800]\ttraining's tweedie: 12.479\tvalid_0's tweedie: 12.4356\n",
"Early stopping, best iteration is:\n",
"[721]\ttraining's tweedie: 12.4814\tvalid_0's tweedie: 12.4353\n",
"RMSSE: 0.740774215864624\n",
"[LightGBM] [Warning] Auto-choosing row-wise multi-threading, the overhead of testing was 0.039919 seconds.\n",
"You can set `force_row_wise=true` to remove the overhead.\n",
"And if memory is not enough, you can set `force_col_wise=true`.\n",
"[LightGBM] [Info] Total Bins 3400\n",
"[LightGBM] [Info] Number of data points in the train set: 9530367, number of used features: 14\n",
"[LightGBM] [Info] Start training from score 0.226259\n",
"Training until validation scores don't improve for 100 rounds\n",
"[50]\ttraining's tweedie: 12.5537\tvalid_0's tweedie: 12.4556\n",
"[100]\ttraining's tweedie: 12.5339\tvalid_0's tweedie: 12.444\n",
"[150]\ttraining's tweedie: 12.5287\tvalid_0's tweedie: 12.4429\n",
"[200]\ttraining's tweedie: 12.5262\tvalid_0's tweedie: 12.4417\n",
"[250]\ttraining's tweedie: 12.5246\tvalid_0's tweedie: 12.4413\n",
"[300]\ttraining's tweedie: 12.5227\tvalid_0's tweedie: 12.4412\n",
"[350]\ttraining's tweedie: 12.5215\tvalid_0's tweedie: 12.4412\n",
"Early stopping, best iteration is:\n",
"[279]\ttraining's tweedie: 12.5236\tvalid_0's tweedie: 12.4409\n",
"RMSSE: 0.739529952210638\n",
"=== Training Finished: Fold 3 ===\n",
"Final Features: ['rolling_std_14_28', 'rolling_mean_14_28', 'id', 'seasonal_rolling_std_12_28', 'seasonal_rolling_mean_4_28', 'median_price_item_id', 'rolling_mean_7_28', 'lag_1_28', 'seasonal_rolling_mean_12_28', 'seasonal_rolling_std_52_28', 'rolling_std_7_28', 'seasonal_rolling_mean_26_28', 'seasonal_rolling_std_26_28', 'seasonal_rolling_mean_52_28']\n",
"Final RMSSE: 0.739529952210638\n",
"CPU times: user 7h 19min 18s, sys: 23min 53s, total: 7h 43min 12s\n",
"Wall time: 50min 48s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"print(\"BEGIN TRAINING :: lightGBM\")\n",
"for fold_num in range(n_folds):\n",
" fold = fold_num + 1\n",
" print(f\"=== Training Started: Fold {fold} ===\")\n",
" \n",
" to = build_fold_to(df, cat_features, cont_features, target_attr, forecast_horizon=forecast_horizon, fold=fold, data_fpath=data_path)\n",
" \n",
" X_train, y_train = to.train.xs, to.train.ys.values.ravel()\n",
" X_test, y_test = to.valid.xs, to.valid.ys.values.ravel()\n",
"\n",
" train_df = to.train.items\n",
" train_df[target_attr] = y_train\n",
"\n",
" val_df = to.valid.items\n",
" val_df[target_attr] = y_test\n",
" \n",
" print(f\"Number of Train/Validation Examples: {len(X_train)} | {len(X_test)}\")\n",
" print(f\"Train Date Range: {train_df.date.min()} | {train_df.date.max()}\")\n",
" print(f\"Validation Date Range: {val_df.date.min()} | {val_df.date.max()}\")\n",
" \n",
" col_keep = []\n",
" rmsse_val = None\n",
" for run_num in range(2):\n",
" # define hyperparameters\n",
" params = dict(\n",
" objective=\"tweedie\",\n",
" tweedie_variance_power=1.1,\n",
" # metric={'tweedie','rmse', 'mape'},\n",
" learning_rate=0.05, # 0.05 ... 1e-1, 1e-2, 1e-3 (default=0.1)\n",
" min_samples_leaf=150,\n",
" feature_fraction=0.3, # 0.3 ... 0.5, 0.8 (default = 1.0)\n",
" subsample=0.3, # 0.3 ... 0.5, 0.8 (default = 1.0; alias for 'subsample')\n",
" deterministic=True,\n",
" )\n",
"\n",
" train_dset = lgbm.Dataset(X_train, y_train)\n",
" val_dset = lgbm.Dataset(X_test, y_test, reference=train_dset)\n",
"\n",
" eval_results = {}\n",
" callbacks = [lgbm.early_stopping(100), lgbm.log_evaluation(50), lgbm.record_evaluation(eval_results)]\n",
"\n",
" model = lgbm.train(\n",
" params,\n",
" train_dset,\n",
" valid_sets=[val_dset, train_dset],\n",
" num_boost_round=1000,\n",
" callbacks=callbacks,\n",
" )\n",
"\n",
" preds = model.predict(X_test)\n",
" \n",
" score_df, rmsse_val = rmsse(train_df, val_df, preds)\n",
" print(f\"RMSSE: {rmsse_val}\")\n",
" \n",
" if run_num == 0:\n",
" # retrain on most important features\n",
" importance = model.feature_importance(importance_type='gain')\n",
" importance_normalized = np.round(importance / np.sum(importance), 4)\n",
"\n",
" fe_imps = {fe_name: fe_imp for fe_name, fe_imp in zip(model.feature_name(), importance_normalized)} \n",
" sorted(fe_imps.items(), key=lambda x: x[1], reverse=True)\n",
" \n",
" col_keep = list(set([col for col, imp in fe_imps.items() if imp > 0.005] + [\"id\"]))\n",
" col_keep = list(set(col_keep + [\"id\"]))\n",
"\n",
" X_train = X_train[col_keep]\n",
" X_test = X_test[col_keep]\n",
" \n",
" # save model and features\n",
" model.save_model(Path(models_path)/f\"lightgbm_fold_{fold}.txt\")\n",
" \n",
" with open(Path(models_path)/f\"lightgbm_fold_{fold}_features.json\", 'w') as json_file:\n",
" json.dump(col_keep, json_file)\n",
" \n",
" # save validation results\n",
" for cat_name in to.cat_names:\n",
" mapping_dict = {idx: value for idx, value in enumerate(to.classes[cat_name])}\n",
" val_df[f\"orig_{cat_name}\"] = val_df[cat_name].map(mapping_dict)\n",
" \n",
" val_df[target_attr] = y_test\n",
" val_df[f\"{target_attr}_preds\"] = preds\n",
" val_df = val_df.merge(score_df.reset_index()[[\"id\", \"rmsse\"]], on=\"id\")\n",
" val_df = val_df.rename(columns={\"rmsse\": \"rmsse_id\"})\n",
" val_df[f\"rmsse_overall\"] = rmsse_val\n",
" \n",
" val_df = (val_df.drop(columns=\"id\").rename(columns={\"orig_id\": \"id\"}))\n",
" val_df[[\"id\", \"date\", target_attr, f\"{target_attr}_preds\", \"rmsse_id\", \"rmsse_overall\"]].to_parquet(Path(results_path)/f\"{max_yyyymmdd}_fold_{fold}_lightgbm_results.parquet\")\n",
" \n",
" \n",
" print(f\"=== Training Finished: Fold {fold} ===\")\n",
" print(\"Final Features: \", col_keep)\n",
" print(\"Final RMSSE: \", rmsse_val)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 5: Ensemble"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"models = [\"rf\", \"lightgbm\"]"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
"from functools import partial\n",
"\n",
"def ensemble_metric(weights, train_df, val_df):\n",
" y_hat_avg = np.average(val_df.filter(regex='^model_').values, axis=1, weights=weights)\n",
" # assert y_hat_avg.ndim == 2, 'y_hat_avg has {y_hat_avg.ndim} dimensions, but it must be 2D. Did you calculate a weighted average over the first dimension?'\n",
" # assert y_hat_avg.shape == y.shape, 'y_hat_avg and y must have the same shape. y_hat_avg has shape {y_hat_avg.shape}, but y has shape {y.shape}'\n",
" \n",
" _, rmsse_score = rmsse(train_df, val_df, y_hat_avg)\n",
" return rmsse_score"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fold 1 (rf): RMSSE: 0.7546597446177328\n",
"Fold 1 (lightgbm): RMSSE: 0.7537823122937269\n",
"Fold 1 Inital Blend RMSSE: 0.753705\n",
"Fold 1 Optimised Blend RMSSE: 0.753604\n",
"Fold 1 Optimised Weights: [0.19699333 0.50000008]\n",
"----------------------------------------------------------------------\n",
"rf Optimised Weights: 0.196993\n",
"lightgbm Optimised Weights: 0.500000\n",
"Fold 1 Normalized weights:[0.28263298 0.71736702]\n",
"======================================================================\n",
"Fold 2 (rf): RMSSE: 0.731481537792378\n",
"Fold 2 (lightgbm): RMSSE: 0.7291672416445893\n",
"Fold 2 Inital Blend RMSSE: 0.729646\n",
"Fold 2 Optimised Blend RMSSE: 0.729149\n",
"Fold 2 Optimised Weights: [0.0453946 0.50000091]\n",
"----------------------------------------------------------------------\n",
"rf Optimised Weights: 0.045395\n",
"lightgbm Optimised Weights: 0.500001\n",
"Fold 2 Normalized weights:[0.08323243 0.91676757]\n",
"======================================================================\n",
"Fold 3 (rf): RMSSE: 0.741228056471335\n",
"Fold 3 (lightgbm): RMSSE: 0.739529952210638\n",
"Fold 3 Inital Blend RMSSE: 0.739831\n",
"Fold 3 Optimised Blend RMSSE: 0.739495\n",
"Fold 3 Optimised Weights: [0.06852739 0.4999997 ]\n",
"----------------------------------------------------------------------\n",
"rf Optimised Weights: 0.068527\n",
"lightgbm Optimised Weights: 0.500000\n",
"Fold 3 Normalized weights:[0.12053495 0.87946505]\n",
"======================================================================\n"
]
}
],
"source": [
"for i in range(n_folds):\n",
" fold = i+1\n",
" fold_model_results = {}\n",
" \n",
" train_df = pd.read_parquet(Path(data_path)/f\"{max_yyyymmdd}_fold_{fold}_train.parquet\")\n",
"\n",
" combined_res_df = None\n",
" for m_name in models:\n",
" res_df = pd.read_parquet(Path(results_path)/f\"{max_yyyymmdd}_fold_{fold}_{m_name}_results.parquet\")\n",
" res_df = res_df.sort_values([\"id\", \"date\"])\n",
" \n",
" # score_df, rmsse_score = rmsse(train_df, res_df, res_df[\"sales_preds\"].values)\n",
" print(f\"Fold {fold} ({m_name}): RMSSE: {res_df.iloc[0]['rmsse_overall']}\")\n",
" \n",
" if combined_res_df is None:\n",
" combined_res_df = res_df.copy()\n",
" combined_res_df[f\"model_{m_name}_preds\"] = res_df[\"sales_preds\"]\n",
" combined_res_df = combined_res_df.drop(columns=[\"sales_preds\"])\n",
" else:\n",
" combined_res_df[f\"model_{m_name}_preds\"] = res_df[\"sales_preds\"]\n",
" \n",
" ensemble_metric = partial(ensemble_metric, train_df=train_df, val_df=combined_res_df)\n",
"\n",
" # Our first guess is setting all weights equal to each other, such that they sum up to 1\n",
" init_guess = [1 / len(models)] * len(models) # here will be [0.5, 0.5]\n",
"\n",
" print(f'Fold {fold} Inital Blend RMSSE: {ensemble_metric(init_guess):.6f}')\n",
" \n",
" bnds = [(0, 1) for _ in range(len(models))] # Weights must be between 0 and 1\n",
"\n",
" res_scipy = minimize(\n",
" fun=ensemble_metric, \n",
" x0=init_guess, \n",
" method='Powell', \n",
" bounds=bnds, \n",
" options=dict(maxiter=1_000_000),\n",
" tol=1e-8\n",
" )\n",
"\n",
" print(f'Fold {fold} Optimised Blend RMSSE: {res_scipy.fun:.6f}')\n",
" print(f'Fold {fold} Optimised Weights: {res_scipy.x}')\n",
" print('-' * 70)\n",
"\n",
" oof_names = models\n",
" for n, key in enumerate(oof_names):\n",
" print(f'{key} Optimised Weights: {res_scipy.x[n]:.6f}')\n",
"\n",
" ws = [ res_scipy.x[i] for i in range(len(oof_names))]\n",
"\n",
" # normalize the weights so they sum to 1\n",
" weights = ws / np.sum(ws)\n",
" print(f'Fold {fold} Normalized weights:{weights}')\n",
"\n",
" print('=' * 70)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 6: Inference"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Get latest dataset\n",
"\n",
"We simulate getting the latest dataset by simply grabbing \"enough\" of `sales_data` to calculate our lag, rolling, and grouped aggregations on the `target_attr` we want to predict `forecast_horizon` days out from the end.\n",
"\n",
"**Note:** Might be better to do such calculations in a SQL Database if possible so you can just grab the data you want to predict"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>state_id</th>\n",
" <th>sales</th>\n",
" </tr>\n",
" <tr>\n",
" <th>date</th>\n",
" <th>id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">2013-01-01</th>\n",
" <th>FOODS_1_004_TX_1_evaluation</th>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_1</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FOODS_1_004_TX_2_evaluation</th>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>TX</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FOODS_1_004_TX_3_evaluation</th>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_3</td>\n",
" <td>TX</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FOODS_1_005_TX_2_evaluation</th>\n",
" <td>FOODS_1_005</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>TX</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FOODS_1_009_TX_2_evaluation</th>\n",
" <td>FOODS_1_009</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>TX</td>\n",
" <td>3</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" item_id dept_id cat_id store_id \\\n",
"date id \n",
"2013-01-01 FOODS_1_004_TX_1_evaluation FOODS_1_004 FOODS_1 FOODS TX_1 \n",
" FOODS_1_004_TX_2_evaluation FOODS_1_004 FOODS_1 FOODS TX_2 \n",
" FOODS_1_004_TX_3_evaluation FOODS_1_004 FOODS_1 FOODS TX_3 \n",
" FOODS_1_005_TX_2_evaluation FOODS_1_005 FOODS_1 FOODS TX_2 \n",
" FOODS_1_009_TX_2_evaluation FOODS_1_009 FOODS_1 FOODS TX_2 \n",
"\n",
" state_id sales \n",
"date id \n",
"2013-01-01 FOODS_1_004_TX_1_evaluation TX 20 \n",
" FOODS_1_004_TX_2_evaluation TX 20 \n",
" FOODS_1_004_TX_3_evaluation TX 4 \n",
" FOODS_1_005_TX_2_evaluation TX 1 \n",
" FOODS_1_009_TX_2_evaluation TX 3 "
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_parquet(f\"{data_path}/sales_data.parquet\")\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Add in the future `forecast_horizon` dates"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"min_date = df.index.get_level_values(\"date\").min()\n",
"# Dates don't have to be exact since there will be 1 record per month!\n",
"max_date = df.index.get_level_values(\"date\").max() + pd.Timedelta(days=forecast_horizon)\n",
"\n",
"# MS ensures that we get the first date of the month\n",
"dates_to_select = pd.date_range(min_date, max_date, freq=\"1D\")\n",
"unique_ids = df.index.get_level_values(\"id\").unique()\n",
"\n",
"# Get all combinations of our new dates and topics\n",
"index_to_select = pd.MultiIndex.from_product([dates_to_select, unique_ids], names=[\"date\", \"id\"])\n",
"\n",
"df = df.reindex(index_to_select)\n"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>state_id</th>\n",
" <th>sales</th>\n",
" </tr>\n",
" <tr>\n",
" <th>date</th>\n",
" <th>id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [item_id, dept_id, cat_id, store_id, state_id, sales]\n",
"Index: []"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"split_ids = [v.split(\"_\") for v in df.loc[pd.isna(df.sales)].index.get_level_values(\"id\").tolist()]\n",
"# split_ids\n",
"\n",
"fill_cols = [(f\"{s[0]}_{s[1]}_{s[2]}\", f\"{s[0]}_{s[1]}\", f\"{s[0]}\", f\"{s[3]}_{s[4]}\", f\"{s[3]}\", 0) for s in split_ids]\n",
"# fill_cols[:5]\n",
"\n",
"df.loc[pd.isna(df.sales), [\"item_id\", \"dept_id\", \"cat_id\", \"store_id\", \"state_id\", \"sales\"]] = fill_cols\n",
"df.loc[pd.isna(df.sales)]"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2016-06-19 00:00:00\n"
]
}
],
"source": [
"print(df.reset_index().date.max())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Build our dataset\n",
"\n",
"Again, we need a dataset that is long enough to calculate the lag, rolling and grouped features to use for the future dates we want to predict"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10554667 2016-06-19 00:00:00\n",
"CPU times: user 6min 39s, sys: 56.8 s, total: 7min 35s\n",
"Wall time: 1min 36s\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>date</th>\n",
" <th>state_id</th>\n",
" <th>sales</th>\n",
" <th>item_id</th>\n",
" <th>dept_id</th>\n",
" <th>cat_id</th>\n",
" <th>store_id</th>\n",
" <th>sell_price</th>\n",
" <th>snap_TX</th>\n",
" <th>...</th>\n",
" <th>seasonal_rolling_mean_2_28</th>\n",
" <th>seasonal_rolling_mean_4_28</th>\n",
" <th>seasonal_rolling_mean_12_28</th>\n",
" <th>seasonal_rolling_mean_26_28</th>\n",
" <th>seasonal_rolling_mean_52_28</th>\n",
" <th>seasonal_rolling_std_2_28</th>\n",
" <th>seasonal_rolling_std_4_28</th>\n",
" <th>seasonal_rolling_std_12_28</th>\n",
" <th>seasonal_rolling_std_26_28</th>\n",
" <th>seasonal_rolling_std_52_28</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>FOODS_1_004_TX_1_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20.0</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_1</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>FOODS_1_004_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>20.0</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>FOODS_1_004_TX_3_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>4.0</td>\n",
" <td>FOODS_1_004</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_3</td>\n",
" <td>1.78</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>FOODS_1_005_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>1.0</td>\n",
" <td>FOODS_1_005</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>3.28</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>FOODS_1_009_TX_2_evaluation</td>\n",
" <td>2013-01-01</td>\n",
" <td>TX</td>\n",
" <td>3.0</td>\n",
" <td>FOODS_1_009</td>\n",
" <td>FOODS_1</td>\n",
" <td>FOODS</td>\n",
" <td>TX_2</td>\n",
" <td>2.68</td>\n",
" <td>True</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 71 columns</p>\n",
"</div>"
],
"text/plain": [
" id date state_id sales item_id \\\n",
"0 FOODS_1_004_TX_1_evaluation 2013-01-01 TX 20.0 FOODS_1_004 \n",
"1 FOODS_1_004_TX_2_evaluation 2013-01-01 TX 20.0 FOODS_1_004 \n",
"2 FOODS_1_004_TX_3_evaluation 2013-01-01 TX 4.0 FOODS_1_004 \n",
"3 FOODS_1_005_TX_2_evaluation 2013-01-01 TX 1.0 FOODS_1_005 \n",
"4 FOODS_1_009_TX_2_evaluation 2013-01-01 TX 3.0 FOODS_1_009 \n",
"\n",
" dept_id cat_id store_id sell_price snap_TX ... \\\n",
"0 FOODS_1 FOODS TX_1 1.78 True ... \n",
"1 FOODS_1 FOODS TX_2 1.78 True ... \n",
"2 FOODS_1 FOODS TX_3 1.78 True ... \n",
"3 FOODS_1 FOODS TX_2 3.28 True ... \n",
"4 FOODS_1 FOODS TX_2 2.68 True ... \n",
"\n",
" seasonal_rolling_mean_2_28 seasonal_rolling_mean_4_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_mean_12_28 seasonal_rolling_mean_26_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_mean_52_28 seasonal_rolling_std_2_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_std_4_28 seasonal_rolling_std_12_28 \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
" seasonal_rolling_std_26_28 seasonal_rolling_std_52_28 \n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 NaN NaN \n",
"3 NaN NaN \n",
"4 NaN NaN \n",
"\n",
"[5 rows x 71 columns]"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"\n",
"lag_features = [1, 2, 3, 7, 14, 21, 30, 90, 365]\n",
"seasonal_lag_features = [1, 2, 4, 12, 26, 52]\n",
"\n",
"rolling_features = {\"mean\": [7, 14], \"std\": [7, 14]}\n",
"seasonal_rolling_features = {\"mean\": [1, 2, 4, 12, 26, 52], \"std\": [2, 4, 12, 26, 52]} # a std for 1 results in all NaNs (why???)\n",
"\n",
"df = build_dataset(\n",
" data_path,\n",
" latest_sales_df = df.reset_index(),\n",
" level=\"id\",\n",
" forecast_horizon=forecast_horizon,\n",
" lag_features=lag_features,\n",
" seasonal_lag_features=seasonal_lag_features,\n",
" rolling_features=rolling_features,\n",
" seasonal_rolling_features=seasonal_rolling_features,\n",
" cache=False,\n",
" override=True\n",
")\n",
"\n",
"print(len(df), df.date.max())\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2016-06-19 00:00:00\n"
]
}
],
"source": [
"# during training `inf_df` represented our validation set, but we can use the same function to get our inference data\n",
"# since our dataset is prepared identically to that used in training with the last 28 days set to be predicted\n",
"train_df, inf_df = build_train_test_splits(df, forecast_horizon=forecast_horizon, fold=1)\n",
"train_df, inf_df = add_group_features(train_df, inf_df)\n",
"\n",
"inf_df = inf_df.fillna(0)\n",
"\n",
"# I print out the max date occassionaly to make sure I'm predicting on expected dates\n",
"print(inf_df.date.max())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Get predictions"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"models = ['rf', 'lightgbm']\n",
"weights = [\n",
" [0.74201649, 0.25798351],\n",
" [0.04333793, 0.95666207],\n",
" [0.14360396, 0.85639604]\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"256088\n",
"[array([2.03829893, 1.02116342, 2.65377985, ..., 0.35438653, 1.63700769,\n",
" 0.31277315]), array([2.91690379, 1.84358136, 3.23554852, ..., 0.3585518 , 1.57657679,\n",
" 0.32384546]), array([1.88160358, 1.22535588, 2.048757 , ..., 0.33898918, 1.61421308,\n",
" 0.31590147])]\n"
]
}
],
"source": [
"preds = []\n",
"for i, fold_weights in enumerate(weights):\n",
" fold, fold_preds = i + 1, []\n",
" \n",
" # grab out tabular object\n",
" to_fpath = Path(f\"{data_path}/{max_yyyymmdd}_to_fh_{forecast_horizon}_fold_1.pkl\")\n",
" with open(to_fpath, \"rb\") as file:\n",
" to = pickle.load(file)\n",
" \n",
" # prepare our dataset for inference\n",
" to_tst = to.new(inf_df)\n",
" to_tst.process()\n",
" to_tst.items.head()\n",
" \n",
" # get predictions for each model in the fold\n",
" for m in models:\n",
" with open(Path(models_path)/f\"{m}_fold_{fold}_features.json\", 'r') as json_file:\n",
" model_features = json.load(json_file)\n",
" \n",
" if m == 'rf':\n",
" X_test = to_tst.xs[model_features]\n",
" inf_model = joblib.load(Path(models_path)/f\"{m}_fold_{fold}.pkl\")\n",
" fold_preds.append(inf_model.predict(X_test))\n",
" elif m == 'lightgbm':\n",
" X_test = to_tst.xs[model_features]\n",
" inf_model = lgbm.Booster(model_file=Path(models_path)/f\"{m}_fold_{fold}.txt\")\n",
" fold_preds.append(inf_model.predict(X_test))\n",
" \n",
" # apply learned fold weights\n",
" preds.append(np.array(fold_weights) @ np.array(fold_preds))\n",
" \n",
"# average folds to get final predictions\n",
"final_preds = np.average(np.array(preds), axis=0)#, weights=weights)\n",
"\n",
"print(len(final_preds))\n",
"print(preds[:5])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
"import warnings\n",
"\n",
"def export(to:TabularPandas, fname='export.pkl', pickle_protocol=2):\n",
" \"Export the contents of `self` without the items\"\n",
" old_to = to\n",
" to = to.new_empty()\n",
" with warnings.catch_warnings():\n",
" warnings.simplefilter(\"ignore\")\n",
" pickle.dump(to, open(Path(fname), 'wb'), protocol=pickle_protocol)\n",
" to = old_to"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
"export(to, \"./data/aaaaaaaa.pkl\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "corise-forecasting",
"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.10.12"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment