{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from fastai2.tabular.all import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Rossmann"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data preparation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To create the feature-engineered train_clean and test_clean from the Kaggle competition data, run `rossman_data_clean.ipynb`. One important step that deals with time series is this:\n",
"\n",
"```python\n",
"add_datepart(train, \"Date\", drop=False)\n",
"add_datepart(test, \"Date\", drop=False)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"path = Config().data/'rossmann'\n",
"train_df = pd.read_pickle(path/'train_clean')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
"
\n",
" \n",
" \n",
" \n",
" | Store | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
"
\n",
" \n",
" | DayOfWeek | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
"
\n",
" \n",
" | Date | \n",
" 2015-07-31 00:00:00 | \n",
" 2015-07-31 00:00:00 | \n",
" 2015-07-31 00:00:00 | \n",
" 2015-07-31 00:00:00 | \n",
" 2015-07-31 00:00:00 | \n",
"
\n",
" \n",
" | Sales | \n",
" 5263 | \n",
" 6064 | \n",
" 8314 | \n",
" 13995 | \n",
" 4822 | \n",
"
\n",
" \n",
" | Customers | \n",
" 555 | \n",
" 625 | \n",
" 821 | \n",
" 1498 | \n",
" 559 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | StateHoliday_bw | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" | SchoolHoliday_bw | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
"
\n",
" \n",
" | Promo_fw | \n",
" 5 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | StateHoliday_fw | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" | SchoolHoliday_fw | \n",
" 7 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
69 rows × 5 columns
\n",
"
"
],
"text/plain": [
" 0 1 \\\n",
"Store 1 2 \n",
"DayOfWeek 5 5 \n",
"Date 2015-07-31 00:00:00 2015-07-31 00:00:00 \n",
"Sales 5263 6064 \n",
"Customers 555 625 \n",
"... ... ... \n",
"StateHoliday_bw 0 0 \n",
"SchoolHoliday_bw 5 5 \n",
"Promo_fw 5 1 \n",
"StateHoliday_fw 0 0 \n",
"SchoolHoliday_fw 7 1 \n",
"\n",
" 2 3 \\\n",
"Store 3 4 \n",
"DayOfWeek 5 5 \n",
"Date 2015-07-31 00:00:00 2015-07-31 00:00:00 \n",
"Sales 8314 13995 \n",
"Customers 821 1498 \n",
"... ... ... \n",
"StateHoliday_bw 0 0 \n",
"SchoolHoliday_bw 5 5 \n",
"Promo_fw 5 1 \n",
"StateHoliday_fw 0 0 \n",
"SchoolHoliday_fw 5 1 \n",
"\n",
" 4 \n",
"Store 5 \n",
"DayOfWeek 5 \n",
"Date 2015-07-31 00:00:00 \n",
"Sales 4822 \n",
"Customers 559 \n",
"... ... \n",
"StateHoliday_bw 0 \n",
"SchoolHoliday_bw 5 \n",
"Promo_fw 1 \n",
"StateHoliday_fw 0 \n",
"SchoolHoliday_fw 1 \n",
"\n",
"[69 rows x 5 columns]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df.head().T"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"844338"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n = len(train_df); n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Experimenting with a sample"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"idx = np.random.permutation(range(n))[:2000]\n",
"idx.sort()\n",
"small_df = train_df.iloc[idx]\n",
"small_cont_vars = ['CompetitionDistance', 'Mean_Humidity']\n",
"small_cat_vars = ['Store', 'DayOfWeek', 'PromoInterval']\n",
"small_df = small_df[small_cat_vars + small_cont_vars + ['Sales']].reset_index(drop=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Store | \n",
" DayOfWeek | \n",
" PromoInterval | \n",
" CompetitionDistance | \n",
" Mean_Humidity | \n",
" Sales | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 471 | \n",
" 5 | \n",
" Feb,May,Aug,Nov | \n",
" 5300.0 | \n",
" 50 | \n",
" 9116.0 | \n",
"
\n",
" \n",
" | 1 | \n",
" 656 | \n",
" 5 | \n",
" Jan,Apr,Jul,Oct | \n",
" 410.0 | \n",
" 54 | \n",
" 4576.0 | \n",
"
\n",
" \n",
" | 2 | \n",
" 1112 | \n",
" 5 | \n",
" NaN | \n",
" 1880.0 | \n",
" 61 | \n",
" 9626.0 | \n",
"
\n",
" \n",
" | 3 | \n",
" 459 | \n",
" 4 | \n",
" Feb,May,Aug,Nov | \n",
" 250.0 | \n",
" 86 | \n",
" 10847.0 | \n",
"
\n",
" \n",
" | 4 | \n",
" 1108 | \n",
" 4 | \n",
" NaN | \n",
" 540.0 | \n",
" 51 | \n",
" 7187.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"0 471 5 Feb,May,Aug,Nov 5300.0 50 \n",
"1 656 5 Jan,Apr,Jul,Oct 410.0 54 \n",
"2 1112 5 NaN 1880.0 61 \n",
"3 459 4 Feb,May,Aug,Nov 250.0 86 \n",
"4 1108 4 NaN 540.0 51 \n",
"\n",
" Sales \n",
"0 9116.0 \n",
"1 4576.0 \n",
"2 9626.0 \n",
"3 10847.0 \n",
"4 7187.0 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Store | \n",
" DayOfWeek | \n",
" PromoInterval | \n",
" CompetitionDistance | \n",
" Mean_Humidity | \n",
" Sales | \n",
"
\n",
" \n",
" \n",
" \n",
" | 1000 | \n",
" 75 | \n",
" 3 | \n",
" NaN | \n",
" 22440.0 | \n",
" 68 | \n",
" 4823.0 | \n",
"
\n",
" \n",
" | 1001 | \n",
" 79 | \n",
" 3 | \n",
" NaN | \n",
" 3320.0 | \n",
" 68 | \n",
" 3968.0 | \n",
"
\n",
" \n",
" | 1002 | \n",
" 390 | \n",
" 3 | \n",
" NaN | \n",
" 1600.0 | \n",
" 71 | \n",
" 9571.0 | \n",
"
\n",
" \n",
" | 1003 | \n",
" 400 | \n",
" 3 | \n",
" Jan,Apr,Jul,Oct | \n",
" 70.0 | \n",
" 73 | \n",
" 7629.0 | \n",
"
\n",
" \n",
" | 1004 | \n",
" 825 | \n",
" 3 | \n",
" Jan,Apr,Jul,Oct | \n",
" 380.0 | \n",
" 78 | \n",
" 3422.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"1000 75 3 NaN 22440.0 68 \n",
"1001 79 3 NaN 3320.0 68 \n",
"1002 390 3 NaN 1600.0 71 \n",
"1003 400 3 Jan,Apr,Jul,Oct 70.0 73 \n",
"1004 825 3 Jan,Apr,Jul,Oct 380.0 78 \n",
"\n",
" Sales \n",
"1000 4823.0 \n",
"1001 3968.0 \n",
"1002 9571.0 \n",
"1003 7629.0 \n",
"1004 3422.0 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_df.iloc[1000:].head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"splits = [list(range(1000)),list(range(1000,2000))]\n",
"to = TabularPandas(small_df.copy(), Categorify, cat_names=small_cat_vars, cont_names=small_cont_vars, splits=splits)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Store | \n",
" DayOfWeek | \n",
" PromoInterval | \n",
" CompetitionDistance | \n",
" Mean_Humidity | \n",
" Sales | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 283 | \n",
" 5 | \n",
" 1 | \n",
" 5300.0 | \n",
" 50 | \n",
" 9116.0 | \n",
"
\n",
" \n",
" | 1 | \n",
" 389 | \n",
" 5 | \n",
" 2 | \n",
" 410.0 | \n",
" 54 | \n",
" 4576.0 | \n",
"
\n",
" \n",
" | 2 | \n",
" 653 | \n",
" 5 | \n",
" 0 | \n",
" 1880.0 | \n",
" 61 | \n",
" 9626.0 | \n",
"
\n",
" \n",
" | 3 | \n",
" 272 | \n",
" 4 | \n",
" 1 | \n",
" 250.0 | \n",
" 86 | \n",
" 10847.0 | \n",
"
\n",
" \n",
" | 4 | \n",
" 649 | \n",
" 4 | \n",
" 0 | \n",
" 540.0 | \n",
" 51 | \n",
" 7187.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"0 283 5 1 5300.0 50 \n",
"1 389 5 2 410.0 54 \n",
"2 653 5 0 1880.0 61 \n",
"3 272 4 1 250.0 86 \n",
"4 649 4 0 540.0 51 \n",
"\n",
" Sales \n",
"0 9116.0 \n",
"1 4576.0 \n",
"2 9626.0 \n",
"3 10847.0 \n",
"4 7187.0 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to.train.items.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Store | \n",
" DayOfWeek | \n",
" PromoInterval | \n",
" CompetitionDistance | \n",
" Mean_Humidity | \n",
" Sales | \n",
"
\n",
" \n",
" \n",
" \n",
" | 1000 | \n",
" 46 | \n",
" 3 | \n",
" 0 | \n",
" 22440.0 | \n",
" 68 | \n",
" 4823.0 | \n",
"
\n",
" \n",
" | 1001 | \n",
" 49 | \n",
" 3 | \n",
" 0 | \n",
" 3320.0 | \n",
" 68 | \n",
" 3968.0 | \n",
"
\n",
" \n",
" | 1002 | \n",
" 0 | \n",
" 3 | \n",
" 0 | \n",
" 1600.0 | \n",
" 71 | \n",
" 9571.0 | \n",
"
\n",
" \n",
" | 1003 | \n",
" 236 | \n",
" 3 | \n",
" 2 | \n",
" 70.0 | \n",
" 73 | \n",
" 7629.0 | \n",
"
\n",
" \n",
" | 1004 | \n",
" 492 | \n",
" 3 | \n",
" 2 | \n",
" 380.0 | \n",
" 78 | \n",
" 3422.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"1000 46 3 0 22440.0 68 \n",
"1001 49 3 0 3320.0 68 \n",
"1002 0 3 0 1600.0 71 \n",
"1003 236 3 2 70.0 73 \n",
"1004 492 3 2 380.0 78 \n",
"\n",
" Sales \n",
"1000 4823.0 \n",
"1001 3968.0 \n",
"1002 9571.0 \n",
"1003 7629.0 \n",
"1004 3422.0 "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to.valid.items.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(#8) [#na#,1,2,3,4,5,6,7]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to.classes['DayOfWeek']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"splits = [list(range(1000)),list(range(1000,2000))]\n",
"to = TabularPandas(small_df.copy(), FillMissing, cat_names=small_cat_vars, cont_names=small_cont_vars, splits=splits)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Store | \n",
" DayOfWeek | \n",
" PromoInterval | \n",
" CompetitionDistance | \n",
" Mean_Humidity | \n",
" Sales | \n",
" CompetitionDistance_na | \n",
" Mean_Humidity_na | \n",
"
\n",
" \n",
" \n",
" \n",
" | 521 | \n",
" 291 | \n",
" 5 | \n",
" NaN | \n",
" 2380.0 | \n",
" 83 | \n",
" 7928.0 | \n",
" True | \n",
" False | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"521 291 5 NaN 2380.0 83 \n",
"\n",
" Sales CompetitionDistance_na Mean_Humidity_na \n",
"521 7928.0 True False "
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to.train.items[to.train.items['CompetitionDistance_na'] == True]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Preparing full data set"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_df = pd.read_pickle(path/'train_clean')\n",
"test_df = pd.read_pickle(path/'test_clean')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(844338, 41088)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(train_df),len(test_df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"procs=[FillMissing, Categorify, Normalize]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dep_var = 'Sales'\n",
"cat_names = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'StoreType', 'Assortment', \n",
" 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear', 'State', 'Week', 'Events', 'Promo_fw', \n",
" 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw', 'SchoolHoliday_fw', 'SchoolHoliday_bw']\n",
"\n",
"cont_names = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC', \n",
" 'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', 'Mean_Wind_SpeedKm_h', \n",
" 'CloudCover', 'trend', 'trend_DE', 'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dep_var = 'Sales'\n",
"df = train_df[cat_names + cont_names + [dep_var,'Date']].copy()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Timestamp('2015-08-01 00:00:00'), Timestamp('2015-09-17 00:00:00'))"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_df['Date'].min(), test_df['Date'].max()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"41254"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cut = train_df['Date'][(train_df['Date'] == train_df['Date'][len(test_df)])].index.max()\n",
"cut"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"splits = (list(range(cut, len(train_df))),list(range(cut)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 5263.0\n",
"1 6064.0\n",
"2 8314.0\n",
"3 13995.0\n",
"4 4822.0\n",
"Name: Sales, dtype: float64"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df[dep_var].head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_df[dep_var] = np.log(train_df[dep_var])\n",
"#train_df = train_df.iloc[:100000]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#cut = 20000"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"splits = (list(range(cut, len(train_df))),list(range(cut)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3min 57s, sys: 59.2 s, total: 4min 56s\n",
"Wall time: 44.8 s\n"
]
}
],
"source": [
"%time to = TabularPandas(train_df, procs, cat_names, cont_names, dep_var, y_block=TransformBlock(), splits=splits)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dls = to.dataloaders(bs=512, path=path)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" | \n",
" Store | \n",
" DayOfWeek | \n",
" Year | \n",
" Month | \n",
" Day | \n",
" StateHoliday | \n",
" StoreType | \n",
" Assortment | \n",
" PromoInterval | \n",
" CompetitionOpenSinceYear | \n",
" Promo2SinceYear | \n",
" State | \n",
" Week | \n",
" Events | \n",
" Promo_fw | \n",
" Promo_bw | \n",
" StateHoliday_fw | \n",
" StateHoliday_bw | \n",
" SchoolHoliday_fw | \n",
" SchoolHoliday_bw | \n",
" CompetitionDistance_na | \n",
" Max_TemperatureC_na | \n",
" Mean_TemperatureC_na | \n",
" Min_TemperatureC_na | \n",
" Max_Humidity_na | \n",
" Mean_Humidity_na | \n",
" Min_Humidity_na | \n",
" Max_Wind_SpeedKm_h_na | \n",
" Mean_Wind_SpeedKm_h_na | \n",
" CloudCover_na | \n",
" trend_na | \n",
" trend_DE_na | \n",
" AfterStateHoliday_na | \n",
" BeforeStateHoliday_na | \n",
" Promo_na | \n",
" SchoolHoliday_na | \n",
" CompetitionDistance | \n",
" Max_TemperatureC | \n",
" Mean_TemperatureC | \n",
" Min_TemperatureC | \n",
" Max_Humidity | \n",
" Mean_Humidity | \n",
" Min_Humidity | \n",
" Max_Wind_SpeedKm_h | \n",
" Mean_Wind_SpeedKm_h | \n",
" CloudCover | \n",
" trend | \n",
" trend_DE | \n",
" AfterStateHoliday | \n",
" BeforeStateHoliday | \n",
" Promo | \n",
" SchoolHoliday | \n",
" Sales | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 90 | \n",
" 6 | \n",
" 2013 | \n",
" 5 | \n",
" 11 | \n",
" False | \n",
" a | \n",
" a | \n",
" #na# | \n",
" 2007 | \n",
" #na# | \n",
" NW | \n",
" 19 | \n",
" Rain | \n",
" 5 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 329.999926 | \n",
" 16.0 | \n",
" 11.0 | \n",
" 7.000000e+00 | \n",
" 93.0 | \n",
" 77.0 | \n",
" 48.000000 | \n",
" 37.0 | \n",
" 16.0 | \n",
" 6.0 | \n",
" 62.000000 | \n",
" 60.0 | \n",
" 1.999998 | \n",
" -9.000000 | \n",
" 1.436922e-08 | \n",
" 1.656771e-09 | \n",
" 8.963928 | \n",
"
\n",
" \n",
" | 1 | \n",
" 852 | \n",
" 4 | \n",
" 2013 | \n",
" 3 | \n",
" 14 | \n",
" False | \n",
" c | \n",
" a | \n",
" Jan,Apr,Jul,Oct | \n",
" 2004 | \n",
" 2011 | \n",
" HE | \n",
" 11 | \n",
" Snow | \n",
" 3 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 940.000185 | \n",
" 2.0 | \n",
" -4.0 | \n",
" -1.100000e+01 | \n",
" 93.0 | \n",
" 78.0 | \n",
" 51.000000 | \n",
" 21.0 | \n",
" 5.0 | \n",
" 4.0 | \n",
" 70.000000 | \n",
" 62.0 | \n",
" 71.999998 | \n",
" -15.000000 | \n",
" 1.436922e-08 | \n",
" 1.656771e-09 | \n",
" 8.379310 | \n",
"
\n",
" \n",
" | 2 | \n",
" 189 | \n",
" 3 | \n",
" 2014 | \n",
" 9 | \n",
" 24 | \n",
" False | \n",
" d | \n",
" a | \n",
" #na# | \n",
" 2014 | \n",
" #na# | \n",
" RP | \n",
" 39 | \n",
" Rain | \n",
" 2 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 5760.000013 | \n",
" 16.0 | \n",
" 11.0 | \n",
" 6.000000e+00 | \n",
" 97.0 | \n",
" 77.0 | \n",
" 59.000000 | \n",
" 11.0 | \n",
" 5.0 | \n",
" 6.0 | \n",
" 63.000000 | \n",
" 72.0 | \n",
" 96.999998 | \n",
" -9.000000 | \n",
" 1.436922e-08 | \n",
" 1.656771e-09 | \n",
" 8.744328 | \n",
"
\n",
" \n",
" | 3 | \n",
" 615 | \n",
" 2 | \n",
" 2014 | \n",
" 3 | \n",
" 4 | \n",
" False | \n",
" d | \n",
" a | \n",
" #na# | \n",
" 2007 | \n",
" #na# | \n",
" HE | \n",
" 10 | \n",
" #na# | \n",
" 4 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 729.999814 | \n",
" 13.0 | \n",
" 7.0 | \n",
" 4.409999e-08 | \n",
" 100.0 | \n",
" 72.0 | \n",
" 28.999999 | \n",
" 13.0 | \n",
" 6.0 | \n",
" 3.0 | \n",
" 50.000000 | \n",
" 55.0 | \n",
" 62.000000 | \n",
" -45.000000 | \n",
" 1.000000e+00 | \n",
" 1.656771e-09 | \n",
" 9.527994 | \n",
"
\n",
" \n",
" | 4 | \n",
" 525 | \n",
" 3 | \n",
" 2013 | \n",
" 2 | \n",
" 6 | \n",
" False | \n",
" d | \n",
" c | \n",
" #na# | \n",
" 2013 | \n",
" #na# | \n",
" BE | \n",
" 6 | \n",
" #na# | \n",
" 3 | \n",
" 3 | \n",
" 0 | \n",
" 0 | \n",
" 3 | \n",
" 3 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 1869.999936 | \n",
" 4.0 | \n",
" 1.0 | \n",
" -3.000000e+00 | \n",
" 93.0 | \n",
" 73.0 | \n",
" 48.000000 | \n",
" 24.0 | \n",
" 14.0 | \n",
" 4.0 | \n",
" 55.000000 | \n",
" 51.0 | \n",
" 36.000000 | \n",
" -51.000000 | \n",
" 1.000000e+00 | \n",
" 1.000000e+00 | \n",
" 9.314791 | \n",
"
\n",
" \n",
" | 5 | \n",
" 671 | \n",
" 2 | \n",
" 2013 | \n",
" 10 | \n",
" 1 | \n",
" False | \n",
" a | \n",
" c | \n",
" Jan,Apr,Jul,Oct | \n",
" 2008 | \n",
" 2010 | \n",
" BY | \n",
" 40 | \n",
" #na# | \n",
" 1 | \n",
" 3 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 2070.000112 | \n",
" 11.0 | \n",
" 9.0 | \n",
" 8.000000e+00 | \n",
" 93.0 | \n",
" 84.0 | \n",
" 71.000000 | \n",
" 13.0 | \n",
" 8.0 | \n",
" 7.0 | \n",
" 57.000000 | \n",
" 62.0 | \n",
" 47.000000 | \n",
" -1.999999 | \n",
" 1.436922e-08 | \n",
" 1.656771e-09 | \n",
" 8.411611 | \n",
"
\n",
" \n",
" | 6 | \n",
" 243 | \n",
" 4 | \n",
" 2015 | \n",
" 3 | \n",
" 12 | \n",
" False | \n",
" a | \n",
" a | \n",
" Feb,May,Aug,Nov | \n",
" #na# | \n",
" 2013 | \n",
" BY | \n",
" 11 | \n",
" Snow | \n",
" 3 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 310.000001 | \n",
" 8.0 | \n",
" 4.0 | \n",
" 4.409999e-08 | \n",
" 87.0 | \n",
" 71.0 | \n",
" 49.000000 | \n",
" 14.0 | \n",
" 6.0 | \n",
" 6.0 | \n",
" 65.000000 | \n",
" 74.0 | \n",
" 65.000000 | \n",
" -21.999999 | \n",
" 1.436922e-08 | \n",
" 1.656771e-09 | \n",
" 8.549273 | \n",
"
\n",
" \n",
" | 7 | \n",
" 800 | \n",
" 2 | \n",
" 2013 | \n",
" 9 | \n",
" 10 | \n",
" False | \n",
" d | \n",
" a | \n",
" #na# | \n",
" 2014 | \n",
" #na# | \n",
" RP | \n",
" 37 | \n",
" Rain | \n",
" 4 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 2020.000068 | \n",
" 17.0 | \n",
" 14.0 | \n",
" 1.200000e+01 | \n",
" 89.0 | \n",
" 64.0 | \n",
" 41.000000 | \n",
" 24.0 | \n",
" 14.0 | \n",
" 5.0 | \n",
" 37.999999 | \n",
" 51.0 | \n",
" 103.000001 | \n",
" -23.000000 | \n",
" 1.000000e+00 | \n",
" 1.656771e-09 | \n",
" 8.782169 | \n",
"
\n",
" \n",
" | 8 | \n",
" 253 | \n",
" 1 | \n",
" 2013 | \n",
" 6 | \n",
" 10 | \n",
" False | \n",
" a | \n",
" c | \n",
" Feb,May,Aug,Nov | \n",
" #na# | \n",
" 2013 | \n",
" NW | \n",
" 24 | \n",
" #na# | \n",
" 0 | \n",
" 4 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 250.000227 | \n",
" 19.0 | \n",
" 14.0 | \n",
" 1.100000e+01 | \n",
" 82.0 | \n",
" 66.0 | \n",
" 39.000000 | \n",
" 19.0 | \n",
" 13.0 | \n",
" 4.0 | \n",
" 69.000000 | \n",
" 67.0 | \n",
" 11.000001 | \n",
" -115.000003 | \n",
" 1.436922e-08 | \n",
" 1.656771e-09 | \n",
" 8.610683 | \n",
"
\n",
" \n",
" | 9 | \n",
" 1053 | \n",
" 3 | \n",
" 2014 | \n",
" 8 | \n",
" 27 | \n",
" False | \n",
" a | \n",
" a | \n",
" #na# | \n",
" 2015 | \n",
" #na# | \n",
" HB,NI | \n",
" 35 | \n",
" Fog | \n",
" 2 | \n",
" 2 | \n",
" 0 | \n",
" 0 | \n",
" 7 | \n",
" 7 | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" 1710.000074 | \n",
" 21.0 | \n",
" 13.0 | \n",
" 6.000000e+00 | \n",
" 100.0 | \n",
" 80.0 | \n",
" 37.000000 | \n",
" 14.0 | \n",
" 5.0 | \n",
" 3.0 | \n",
" 75.000000 | \n",
" 77.0 | \n",
" 79.000001 | \n",
" -37.000000 | \n",
" 1.436922e-08 | \n",
" 1.000000e+00 | \n",
" 8.795733 | \n",
"
\n",
" \n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dls.show_batch()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"max_log_y = np.log(1.2) + np.max(train_df['Sales'])\n",
"y_range = (0, max_log_y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dls.c = 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = tabular_learner(dls, layers=[1000,500], loss_func=MSELossFlat(),\n",
" config=tabular_config(ps=[0.001,0.01], embed_p=0.04, y_range=y_range), \n",
" metrics=exp_rmspe)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"TabularModel(\n",
" (embeds): ModuleList(\n",
" (0): Embedding(1116, 81)\n",
" (1): Embedding(8, 5)\n",
" (2): Embedding(4, 3)\n",
" (3): Embedding(13, 7)\n",
" (4): Embedding(32, 11)\n",
" (5): Embedding(3, 3)\n",
" (6): Embedding(5, 4)\n",
" (7): Embedding(4, 3)\n",
" (8): Embedding(4, 3)\n",
" (9): Embedding(24, 9)\n",
" (10): Embedding(8, 5)\n",
" (11): Embedding(13, 7)\n",
" (12): Embedding(53, 15)\n",
" (13): Embedding(22, 9)\n",
" (14): Embedding(7, 5)\n",
" (15): Embedding(7, 5)\n",
" (16): Embedding(4, 3)\n",
" (17): Embedding(4, 3)\n",
" (18): Embedding(9, 5)\n",
" (19): Embedding(9, 5)\n",
" (20): Embedding(3, 3)\n",
" (21): Embedding(2, 2)\n",
" (22): Embedding(2, 2)\n",
" (23): Embedding(2, 2)\n",
" (24): Embedding(2, 2)\n",
" (25): Embedding(2, 2)\n",
" (26): Embedding(2, 2)\n",
" (27): Embedding(2, 2)\n",
" (28): Embedding(2, 2)\n",
" (29): Embedding(3, 3)\n",
" (30): Embedding(2, 2)\n",
" (31): Embedding(2, 2)\n",
" (32): Embedding(2, 2)\n",
" (33): Embedding(2, 2)\n",
" (34): Embedding(2, 2)\n",
" (35): Embedding(2, 2)\n",
" )\n",
" (emb_drop): Dropout(p=0.04, inplace=False)\n",
" (bn_cont): BatchNorm1d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers): Sequential(\n",
" (0): LinBnDrop(\n",
" (0): BatchNorm1d(241, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (1): Dropout(p=0.001, inplace=False)\n",
" (2): Linear(in_features=241, out_features=1000, bias=False)\n",
" (3): ReLU(inplace=True)\n",
" )\n",
" (1): LinBnDrop(\n",
" (0): BatchNorm1d(1000, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (1): Dropout(p=0.01, inplace=False)\n",
" (2): Linear(in_features=1000, out_features=500, bias=False)\n",
" (3): ReLU(inplace=True)\n",
" )\n",
" (2): LinBnDrop(\n",
" (0): Linear(in_features=500, out_features=1, bias=True)\n",
" )\n",
" )\n",
")"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"16"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(dls.train_ds.cont_names)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEKCAYAAAAVaT4rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXhU9b3H8fd3MtlXAkkgCRB2RFCQgIDF4u5tva61iktFrVS716e9bW+fLre91V5rb6u1LoiK91as1qXurdYrriCr7JvsYU3YspA9v/vHjBpjCEmYmTOT+byeZ57MnMzM+XCAzzlz5pzfMeccIiISP3xeBxARkchS8YuIxBkVv4hInFHxi4jEGRW/iEicUfGLiMQZv9cBOqNPnz6upKTE6xgiIjFlyZIlFc65vLbTY6L4S0pKWLx4sdcxRERiiplta2+6dvWIiMQZFb+ISJwJW/Gb2cNmts/MVrXzu++bmTOzPuGav4iItC+cW/xzgPPbTjSz/sA5wPYwzltERI4ibMXvnHsLONDOr34P/Bug0eFERDwQ0X38ZnYhsNM5tzyS8xURkU9ErPjNLA34CfCzTj5/ppktNrPF5eXlIc2yv7qeBZv3U9vQHNL3FRGJBZE8jn8IMAhYbmYAxcBSM5vonNvT9snOuVnALIDS0tJu7Rb6v3V7Wbb9EHWNzdQ1tnDwSAMryg6z/cARAPrnpnLbJWOYOuwz5zeIiPRYESt+59xKIP+jx2a2FSh1zlWEa57z1pfzvwu2keJPICXRR0aKn9GF2Vx96gD6Zqdw1z83cu1DC7l0XBE//sIJ5GUmhyuKiEjUsHBdgcvMHgemAX2AvcDPnXMPtfr9VjpZ/KWlpa47Z+42tzh8BsFPGJ9R19jMn974kPvmbcJnxgUn92PGlBJOKs7p8rxERKKNmS1xzpV+ZnosXHqxu8XfWZvLq5nz3laeXlJGTUMzxb1SyU1PIjPFT3ZqIn0yksnLSKZPZjLZqYlkpvjJSPaTm55EbnoSGcn+o65c2nLOUVHdwKbyag7XNpJghs8Hyf4EeqUl0Tsj8J6JCR1//bK/up4DNQ3kBTO1nb9zjvqmFmobmklLTiDZn9Dt5SMisUnF3wlVdY08vaSMJdsPUVXXSFVdE4eONFBR3cDh2sajvi7J7yM3LYmctERy0hJJT/JT19TMkYbAdwutl/GuQ7VU1jV1mMMMBvVOZ0TfTIYXZOL3GVX1TVTVNbLjQC3r9lRRUV3/mfk3tTgampppaG6hvqmFj2ZrBoXZqQzsnUZRTiq5GUn0Tk+iV1oSmSmBFVlmip/CnFR6pyd1eiUmItFNxX+c6pua2V/dQGVwhVBV18jBmkb219Szv7qBAzUNHKpt5PCRRmoamkhJTCAtKbCl7Qv2qAMKspIZkpfB4LwMeqcn4Rw0O0ddYzMHaxrYX9PA3so6NuytYv2eKrYdOIJzkOz3kZmSSL/sFEb0zWRk30zyMpOpqG5gX1UdB6ob8Cf4SPb7SEwwUhMTSElKIDUxgcO1jWzbf4St+2vYdaiWAzUNNDa3//eenpTAwN7pFOak0jc7mYLMFIp6pTKoTzqD+2SQnZYYuYUuIsflaMUfE6NzRoNkfwKFOakUkhrR+dY1NuMzI8kfuiNvnXNU1zdxsKaRqvpGquuaOFzbSNnBWrYfCKwgyg4eYfG2Axw68ulPOrnpScGVQDqD8zIYlp/B8IJMinul4vPpk4JILFDxR7mUxNDvmzez4C6eY2+91zU2U3awlq0VNWzdX8Om8ho2l1czb0M5f11S9vHzUhMTGN43kxMLsxjVL4sT+mUxvCCjU/MQkchS8UuHUhITGJqfwdD8jM/8rrKukY17q9m4t4r1e6tYu7uSF5fvYu77nwzDVJSTyqjCLP5ldF/OGVWgFYFIFFDxS7dlpSQyfmAvxg/s9fE05xxlB2tZvyewMtiwt4rFWw/y2pq9JPt9nDkyny+NL+bzw/PwH+PIJREJDxW/hJSZ0T83jf65aZw9qgCAlhbHsh2HeGH5Ll5csYtXVu2hb1YKl5cWM33iAApzIvu9iUi801E9ElGNzS28vnYfTyzazpsbyvGZcdHYIm7+/GCGFWR6HU+kR9HhnBJ1dhw4wkPvbOGJRTuobWzm7BPyuWXa0E/tOhKR7lPxS9Q6UNPAo+9t5dH5Wzl0pJFTB+XyjTOGMnVYH51MJnIcVPwS9Wrqm3h84XZmv72FPZV1nDool387f6Q+AYh0k4pfYkZ9UzNPLNrB3a9/SEV1PeeMKuBnF4yif26a19FEYsrRil/H00nUSfYn8JXJJbz5g2l8/9zhvPdhBef94S3mvLuFlpbo31ARiXYqfola6cl+vnnmMF699fNMKMnlFy+s4YpZ89m2v8braCIxTcUvUa8oJ5U510/gzstPZv2eKi64+x1eWbnb61giMUvFLzHBzPjS+GJe/s5UBudncMtjS/mPF1bT0NTidTSRmKPil5hS3CuNv35tMjOmlPDIu1u56sEFHKxp8DqWSExR8UvMSfL7+MWFJ3L39HGs2HmYy+5/jx0HjngdSyRmqPglZl14ciF/vvFU9lc3cMm977Gi7JDXkURigopfYtrEQbk8fctkkv0+ps9awJJtB72OJBL1VPwS84bmZ/L0LVPIy0xmxsMLteUvcgwqfukR+manMPemSeSkJ3LN7PdZveuw15FEopaKX3qMwpxU5n51EhnJfq6Z/T6by6u9jiQSlVT80qP0z01j7k2TMDNufHQxh47oUE+RtlT80uOU9EnngWvHs/NgLV9/bCmNzTrJS6Q1Fb/0SBNKcrn90jG8t2k/P3tuNbEwCq1IpOiau9JjXTa+mA/Lq7lv3iZG9cvk2sklXkcSiQra4pce7QfnjuCMEXn86sW1rCzTkT4ioOKXHs7nM3735bH0zkjiG3OXUlnX6HUkEc+p+KXHy01P4o/Tx7HzUC0/enqF9vdL3FPxS1woLcnlB+eN4OWVe/jfBdu8jiPiKRW/xI2ZUwfz+eF53P7yOrbv12ieEr9U/BI3fD7j9kvHkOAzfvSMdvlI/FLxS1wpzEnlx18YyXub9vOXRTu8jiPiCRW/xJ3pEwYwaXAut720lt2Ha72OIxJxKn6JOz6f8V+XnURjSws//dsqr+OIRJyKX+LSwN7p3HrOcP65dh9vrNvndRyRiApb8ZvZw2a2z8xWtZr2WzNbZ2YrzOxZM8sJ1/xFjmXGlEEM7pPOr15cQ0OTBnKT+BHOLf45wPltpr0GjHbOnQRsAH4cxvmLdCjJ7+OnF4xic0UNj7631es4IhETtuJ3zr0FHGgz7VXnXFPw4QKgOFzzF+mMM0bmc8aIPO5+fSPlVfVexxGJCC/38d8AvOLh/EUA+OkFo6htbObOf6z3OopIRHhS/Gb2E6AJeKyD58w0s8Vmtri8vDxy4STuDM7L4PrTSnhyyQ7W7Kr0Oo5I2EW8+M3sOuAC4GrXwamTzrlZzrlS51xpXl5e5AJKXPrmmcPITPZz56va6peeL6LFb2bnAz8ELnTOabAUiRrZqYncPG0I/7duH4u3Hjj2C0RiWDgP53wcmA+MMLMyM7sRuAfIBF4zsw/M7P5wzV+kq2ZMKSEvM5k7/rFe4/hIjxa2Sy8656a3M/mhcM1P5HilJfn51plD+dlzq3lzQznTRuR7HUkkLHTmrkgrV04YQHGvVH77j/W0tGirX3omFb9IK0l+H987ezird1Xyj9V7vI4jEhYqfpE2Lh5XxOA+6dzzxofa1y89kopfpI0En3HztCGs3lXJvPU6h0R6HhW/SDsuGVdEUU6qtvqlR1Lxi7QjMcHH1z4/mCXbDvL+Fh3XLz2Lil/kKL5c2p8+Gcn86Y0PvY4iElIqfpGjSElM4Kapg3h7YwXLdxzyOo5IyKj4RTpw9aSBZKcmcu88bfVLz6HiF+lARrKfaycN5NU1e9lSUeN1HJGQUPGLHMNXpgwk0efj4Xe2eB1FJCRU/CLHkJ+ZwsXjCvnrkh0cqGnwOo7IcVPxi3TCV6cOpq6xhT8v2OZ1FJHjpuIX6YThBZmcMSKP/5m/lbrGZq/jiBwXFb9IJ900dTAV1Q38bdlOr6OIHBcVv0gnTR7SmxMLs3jw7c0asllimopfpJPMjK9OHcSm8hre3KjB2yR2qfhFuuCLYwrJz0zWoZ0S01T8Il2Q5PfxlckDeXtjBRv2VnkdR6RbVPwiXXTVqQNJ9uuELoldKn6RLspNT+LSU4p5ZtlO9lfXex1HpMtU/CLdcMNpJTQ0tTD3/e1eRxHpMhW/SDcMK8jk9OF5/M+CbdQ36YQuiS0qfpFuuvFzgyivqufllbu9jiLSJSp+kW6aOrQPg/PSeeTdrbour8QUFb9IN/l8xvVTSlhRdpil23WFLokdKn6R43DpKcVkJvuZ895Wr6OIdJqKX+Q4pCf7+fKE/ryycjd7Dtd5HUekU1T8IsfpusklNDunsfolZqj4RY7TgN5pnDWygLkLt2usfokJKn6RELjhtBIO1DTw/Ae7vI4ickwqfpEQmDykNyMKMnn43S06tFOinopfJATMjBs+V8K6PVXM37zf6zgiHVLxi4TIRWOLyE1P4uF3tnodRaRDKn6REElJTODqUwfw+rq9bK2o8TqOyFGp+EVC6JpJA/H7TCd0SVRT8YuEUEFWChecVMhfF++gsq7R6zgi7VLxi4TYDacNoqahmScX7fA6iki7wlb8Zvawme0zs1WtpuWa2WtmtjH4s1e45i/ilTHF2UwsyeWRd7fS2NzidRyRzwjnFv8c4Pw2034EvO6cGwa8Hnws0uPMPH0wOw/Vaqx+iUphK37n3FvAgTaTLwIeDd5/FLg4XPMX8dKZI/MZkpfOA29u1gldEnU6VfxmNsTMkoP3p5nZt80spxvzK3DO7QYI/szvYJ4zzWyxmS0uLy/vxqxEvOPzGTNPH8ya3ZW8+6FO6JLo0tkt/qeBZjMbCjwEDALmhi0V4Jyb5Zwrdc6V5uXlhXNWImFx8bgi8jKTeeCtTV5HEfmUzhZ/i3OuCbgE+INz7ntAv27Mb6+Z9QMI/tzXjfcQiQnJ/gRmTCnh7Y0VrNlV6XUckY91tvgbzWw6cB3wYnBaYjfm93zwPQj+fK4b7yESM645dSBpSQnM0la/RJHOFv/1wGTg1865LWY2CPhzRy8ws8eB+cAIMyszsxuB3wDnmNlG4JzgY5EeKzstkasmDuCFFbs1jINEDevqEQfBY+/7O+dWhCfSZ5WWlrrFixdHanYiIbWvso6pd7zBRWMLueNLJ3sdR+KImS1xzpW2nd7Zo3rmmVmWmeUCy4FHzOy/Qx1SpCfKz0ph+sQBPLN0JzsOHPE6jkind/VkO+cqgUuBR5xz44GzwxdLpGe5+fND8Jlx7zzt6xfvdbb4/cGjcL7MJ1/uikgn9c1O4YoJ/XlqyQ52Hqr1Oo7Euc4W/y+BfwCbnHOLzGwwsDF8sUR6nlumDQHgvnkfepxE4l2nit8591fn3EnOuVuCjzc75y4LbzSRnqUwJ5XLS/vz5KIyyg5qX794p7Nf7hab2bPB0Tb3mtnTZlYc7nAiPc03zxgKBr9/TR+YxTud3dXzCIGTrwqBIuCF4DQR6YLCnFSun1LCM8vKWLdHZ/OKNzpb/HnOuUecc03B2xxAA+iIdMMt04aQmeznjr+v9zqKxKnOFn+FmV1jZgnB2zWAhhwU6YactCS+fsZQ/m/dPhZs1n8jibzOFv8NBA7l3APsBr5EYBgHEemGGVNK6JuVwm9eWafx+iXiOntUz3bn3IXOuTznXL5z7mICJ3OJSDekJCZw6znD+WDHIV5Yoat0SWQdzxW4bg1ZCpE4dNn4YkYXZfHrl9ZQXd/kdRyJI8dT/BayFCJxKMFn/Oqi0eyrqueuf27wOo7EkeMpfu2YFDlO4wb04soJ/Xn43a2s31PldRyJEx0Wv5lVmVllO7cqAsf0i8hx+rfzRpKZ4uenz63SF70SER0Wv3Mu0zmX1c4t0znnj1RIkZ6sV3oSPzx/JAu3HOCZpTu9jiNx4Hh29YhIiFxR2p/xA3vxyxfXsK+qzus40sOp+EWigM9n3PGlk6htbOYnz2qXj4SXil8kSgzJy+D75w7ntTV7eX75Lq/jSA+m4heJIjd+bjBj++fwi+dXU15V73Uc6aFU/CJRJMFn3Hn5SdQ0NPOTZ1dql4+EhYpfJMoMzc/kB+eO4NU1e/nzgm1ex5EeSMUvEoVu/Nwgpo3I41cvrWXNLo3bL6Gl4heJQj6f8bvLTyYnNZFvPr6UGo3lIyGk4heJUr0zkvnDlWPZUlHDz55b7XUc6UFU/CJRbMqQPnzrzGE8vbSMvyzc7nUc6SFU/CJR7jtnDWPqsD787PnVrCg75HUc6QFU/CJRLsFn3HXlOPIykrnlz0s5WNPgdSSJcSp+kRiQm57EvVefQnlVPd954gOaW3R8v3Sfil8kRpzcP4f/uOhE3tpQzm0vr/U6jsQwDa0sEkOmTxzA+j1VPPTOFgb2TuMrk0u8jiQxSMUvEmN+esEoyg7W8ovnV1OUk8pZJxR4HUlijHb1iMSYBJ9x9/SxnFiYzbceX8aqnYe9jiQxRsUvEoPSkvw8dF0pvdKSmPHIInYcOOJ1JIkhKn6RGJWflcKjN0ygsbmFrzy8kAM6zFM6ScUvEsOG5mfy0HWl7DpUyw1zFnGkQWP6yLGp+EViXGlJLndPH8eKskN847GlNDa3eB1JopwnxW9m3zOz1Wa2ysweN7MUL3KI9BTnndiXX108mjfWl/PDp1bQohO8pAMRL34zKwK+DZQ650YDCcCVkc4h0tNcfepAbj1nOM8s28ltL6/V1bvkqLw6jt8PpJpZI5AG6MrSIiHwrTOHsr+6ntnvbKF3RjK3TBvidSSJQhEvfufcTjO7E9gO1AKvOudebfs8M5sJzAQYMGBAZEOKxCgz4+f/eiIHjzTyX39fR05aItMn6v+PfJoXu3p6ARcBg4BCIN3Mrmn7POfcLOdcqXOuNC8vL9IxRWKWz2fcefnJTBuRx78/u5IXV+gDtXyaF1/ung1scc6VO+cagWeAKR7kEOmxkvw+7rt6PBMG5vK9Jz5g3vp9XkeSKOJF8W8HJplZmpkZcBagoQZFQiw1KYHZM0oZXpDJzX9ewvub93sdSaJExIvfOfc+8BSwFFgZzDAr0jlE4kFWSiKP3jCR4l5p3DBnEUu3H/Q6kkQBT47jd8793Dk30jk32jl3rXOu3oscIvGgT0Yyj331VPpkJnPdwws1qJvozF2ReFCQlcLcmyaRlZLINQ+9z9rdlV5HEg+p+EXiRFFOKo/fNIkUfwJXz36f9XuqvI4kHlHxi8SRAb3TeHzmJBITjKseXKDyj1MqfpE4M6hPOo/fNIkEX6D8N+xV+ccbFb9IHBqcl8FfZgbKf/osbfnHGxW/SJz6qPz9Ccb0BxewZpe+8I0XKn6RODY4L4MnZk4m2e/jqtkLdKhnnFDxi8S5kj7pPDFzMulJfq56cIFO8ooDKn4RYUDvNJ742iRy05O4Zvb7vLOxwutIEkYqfhEBoLhXGk/ePJn+weEdXl29x+tIEiYqfhH5WH5mCk98bRInFGZxy2NLeXZZmdeRJAxU/CLyKTlpSTz21VOZWJLLrU8u57H3t3kdSUJMxS8in5GR7OeR6ydwxoh8fvLsKh58a7PXkSSEVPwi0q6UxATuv2Y8XzypH79+eS2//cc6XcC9h/DqYusiEgOS/D7uvnIcWSmJ/OmNTeyrrOe2S8eQmKBtxlim4heRDiX4jNsuGU1BVjJ/+OdGKqrr+dPVp5CWpPqIVVpti8gxmRnfPXs4t10yhjc3lHPVg+9z6EiD17Gkm1T8ItJpV506gHuvHs+aXZVc8cAC9lXWeR1JukHFLyJdcv7ovjxy/QR2HDzCl+6fz/b9R7yOJF2k4heRLjttaB/m3jSJyrpGLrv/PQ3uFmNU/CLSLWP75/DXr00m0WdcOWsB736o8X1ihYpfRLptWEEmT399CkU5qcx4ZCHPfbDT60jSCSp+ETku/bJTefLmyZwyoBff+csH3Ddvk070inIqfhE5btmpifzPjRO58ORC/uvv6/j3Z1fS2NzidSw5Cp2BISIhkexP4A9XjGVAbhr3vPEhZQdruffqU8hMSfQ6mrShLX4RCRmfz/j+eSO447KTmL9pP1+6bz5lB3W4Z7RR8YtIyH15Qn/mXD+RXYdrufhP77F8xyGvI0krKn4RCYvPDevDM7dMISXRxxWz5vPSit1eR5IgFb+IhM2wgkye/fppjOqXxTfmLuWXL6yhoUlf+npNxS8iYZWXmcxfZk7m+tNKePjdLVw5az67D9d6HSuuqfhFJOyS/D5+/q8ncs9V41i/p4pz//stZr+9WYd8ekTFLyIRc8FJhbz07amcMrAX//nSWv7lrrd5e2O517HijopfRCKqpE86c66fwEPXldLY3MK1Dy3kq48uZmtFjdfR4oaKX0Qizsw464QCXv3e6fzw/JHM31TBOb9/k9tfWUtNfZPX8Xo8Fb+IeCbZn8At04bwxvencdHYIh54czPn/v4t3tyg3T/hpOIXEc/lZ6Vw5+Un89TNk0lJ9HHdwwu59YkPdHnHMFHxi0jUKC3J5aVvT+XbZw7l+eW7+MJdb7N46wGvY/U4nhS/meWY2VNmts7M1prZZC9yiEj0SUlM4NZzR/Ds108j0e/jilkLuHfeh7S0aKjnUPFqi/8u4O/OuZHAycBaj3KISJQaU5zNC9/6HOeP7ssdf1/P9XMWcaBGu35CIeLFb2ZZwOnAQwDOuQbnnEZwEpHPyEpJ5J7p4/jVxaOZv2k/X7z7bZZsO+h1rJjnxRb/YKAceMTMlpnZbDNLb/skM5tpZovNbHF5ub7hF4lXZsa1kwbyzNen4E8wrnhgPrPf3qxdP8fBi+L3A6cA9znnxgE1wI/aPsk5N8s5V+qcK83Ly4t0RhGJMqOLsnnxW1M5c2Q+//nSWmbMWcS+yjqvY8UkL4q/DChzzr0ffPwUgRWBiEiHslMTeeDa8fznxaNZuGU/5/3hLV5ZuVvX+O2iiF960Tm3x8x2mNkI59x64CxgTaRziEhsMjOumTSQSYN7890nlnHLY0sp7pXKeSf25fzRfTllQC8SfOZ1zKhmXqwpzWwsMBtIAjYD1zvnjvqNTWlpqVu8eHGk4olIjGhoauFvH+zk76v28M7GChqaW8hK8TN5SG8+N7QPk4f0ZkheBmbxuSIwsyXOudLPTI+Fj0gqfhE5lqq6Rt7cUM7bGyp458MKdh4KjPmfk5bI+AG9KC3JZdLgXEYXZZOYEB/nrh6t+CO+q0dEJBwyUxK54KRCLjipEOcc2/YfYeHWAyzZepDF2w7w+rp9AKQlJTB+YC8mlORSOrAXJ/fPIT05vqpQW/wiEhcqqutZuOUACzbvZ8Hm/WzYWw1Ags8YXpDJuAE5jO0fuA3Jy+gR3xNoV4+ISCuHjzSybMdBlmw7yAc7DvHB9kNUBYeETk9KYHRRNmP753BScQ4n98+mKCc15r4r0K4eEZFWstMSmTYin2kj8gFoaXFsrqhm+Y7DLC87xPKywzzy7lYagpeH7J2exEnF2YwpzuHk4mzGFGWTn5Xi5R+h21T8IiKAz2cMzc9kaH4ml40vBgJHDa3bU8nyssMs33GIFWWHeHNDOR+dNJyXmcyYomxGF2ZxYlE2o4uyKcxOifpPBtrVIyLSBTX1TazeVcnqXYdZtbOSVTsPs3Ff1ccrg15piYwOrgTGFGVzQr8sBuSmefKdgXb1iIiEQHqyn4mDcpk4KPfjabUNzazbE1gJrNpZycqdh3nwrc00BdcGqYkJDO+byah+mZzQL4sT+mUxvCCT7NRET/4MKn4RkeOUmpTAuAG9GDeg18fT6pua2bCnmrV7Klm7O3B7eeUeHl+44+Pn9M1KYVhBBkPzMxjUJ/3jW2F2Kr4wfkJQ8YuIhEGyP4ExxdmMKc7+eJpzjj2VdazdXcn6PdVs3FfFxr3VPLFoB0camj9+XmpiAoPz0hmSl8HM0wczuii7vVl0m4pfRCRCzIx+2an0y07lzJEFH093zrGvqp7N5TVsrqhmc3kNm8qrWbbjIPVNLSHPoeIXEfGYmVGQlUJBVgqTh/QO+/ziY8AKERH5mIpfRCTOqPhFROKMil9EJM6o+EVE4oyKX0Qkzqj4RUTijIpfRCTOxMTonGZWDmwLPswGDndwv+3PPkBFF2bX+j07+7ujZWovV3vTwp3xaJmOdj+a8rWXq71pWoZahuHM116uttMSu5gv1Bnbuz/QOZf3mXd2zsXUDZjV0f12fi7u7vt39ndHy9ReHi8yHi1TtCzDjvJpGWoZRkO+zizDruaLxDI82i0Wd/W8cIz7bX8ez/t39ndHy3S0PJHOeLRMR7sfTfmOlieaMmoZdu53Woady9HR77q6DNsVE7t6joeZLXbtXIggmkR7xmjPB9GfMdrzQfRnVL7QicUt/q6a5XWAToj2jNGeD6I/Y7Tng+jPqHwh0uO3+EVE5NPiYYtfRERaUfGLiMQZFb+ISJyJ6+I3s6lmdr+ZzTaz97zO05aZ+czs12b2RzO7zus87TGzaWb2dnA5TvM6T3vMLN3MlpjZBV5naY+ZnRBcfk+Z2S1e52nLzC42swfN7DkzO9frPO0xs8Fm9pCZPeV1lo8E/909Glx2V3udp7WYLX4ze9jM9pnZqjbTzzez9Wb2oZn9qKP3cM697Zy7GXgReDTa8gEXAUVAI1AWynwhzOiAaiAl1BlDlA/gh8CTocwWyozOubXBf4dfBkJ6OGCI8v3NOXcTMAO4IpT5Qphxs3PuxlBna6uLWS8FngouuwvDna1LunqmWbTcgNOBU4BVraYlAJuAwUASsBwYBYwhUO6tb/mtXvckkBVt+YAfAV8LvvapaFyGgC/4ugLgsSjMdzZwJYHSuiAal2HwNRcC7wFXRWO+4Ot+B5wSrcswXP9PjiPrj4GxwefMDWeurt5i9mLrzrm3zKykzeSJwIfOuc0AZvYX4CLn3O1Aux/zzWwAcNg5Vxlt+cysDGgIPmwOZb5QZWzlIJAcbfnM7AwgncB/xFoze9k51xJNGYPv8zzwvJm9BMyNpnxmZsBvgFecc6g4VA0AAASeSURBVEtDlS2UGSOlK1kJfAIuBj4gyvauxGzxH0URsKPV4zLg1GO85kbgkbAl+rSu5nsG+KOZTQXeCmewVrqU0cwuBc4DcoB7whsN6GI+59xPAMxsBlARytLvQFeX4TQCuwWSgZfDmiygq/8Ov0Xgk1O2mQ11zt0fznBBXV2GvYFfA+PM7MfBFUSkHC3r3cA9ZvZFuj+kQ1j0tOK3dqZ1eIaac+7nYcrSni7lc84dIbBiiqSuZnyGwAoqUrr8dwzgnJsT+ihH1dVlOA+YF64w7ehqvrsJlFgkdTXjfuDm8MXpULtZnXM1wPWRDtMZUfXxIwTKgP6tHhcDuzzK0p5ozwfRnzHa80H0Z4z2fBAbGT8SS1mBnlf8i4BhZjbIzJIIfKn3vMeZWov2fBD9GaM9H0R/xmjPB7GR8SOxlDXA62+Xj+Pb9ceB3XxyqOONwelfADYQ+Jb9J8oXuxmjPV8sZIz2fLGSMRazdnTTIG0iInGmp+3qERGRY1Dxi4jEGRW/iEicUfGLiMQZFb+ISJxR8YuIxBkVv8QkM6uO8Pxmm9moEL1Xs5l9YGarzOwFM8s5xvNzzOzroZi3COhi6xKjzKzaOZcRwvfzO+eaQvV+x5jXx9nN7FFgg3Pu1x08vwR40Tk3OhL5pOfTFr/0GGaWZ2ZPm9mi4O204PSJZvaemS0L/hwRnD7DzP5qZi8Ar1rgamLzLHAlrHVm9lhwSGKC00uD96stcGW05Wa2wMwKgtOHBB8vMrNfdvJTyXwCoztiZhlm9rqZLTWzlWZ2UfA5vwGGBD8l/Db43B8E57PCzP4jhItR4oCKX3qSu4DfO+cmAJcBs4PT1wGnO+fGAT8Dbmv1msnAdc65M4OPxwHfJTB+/2DgtHbmkw4scM6dTGC47Jtazf+u4PyPOUiXmSUAZ/HJuC51wCXOuVOAM4DfBVc8PwI2OefGOud+YIHLHw4jMA78WGC8mZ1+rPmJfKSnDcss8e1sYFRwIx0gy8wygWzgUTMbRmBo38RWr3nNOXeg1eOFzrkyADP7ACgB3mkznwYCV34CWAKcE7w/Gbg4eH8ucOdRcqa2eu8lwGvB6QbcFizxFgKfBAraef25wduy4OMMAiuCSF2zQWKcil96Eh8w2TlX23qimf0ReMM5d0lwf/m8Vr+uafMe9a3uN9P+/5FG98mXY0d7TkdqnXNjzSybwArkGwTGu78ayAPGO+cazWwrgWsZt2XA7c65B7o4XxFAu3qkZ3kV+OZHD8xsbPBuNrAzeH9GGOe/gMAuJggMzdsh59xh4NvA980skUDOfcHSPwMYGHxqFZDZ6qX/AG4ws4++IC4ys/wQ/RkkDqj4JValmVlZq9utBEq0NPiF5xo+uSLTHcDtZvYugQtjh8t3gVvNbCHQDzh8rBc455YRuDj3lcBjBPIvJrD1vy74nP3Au8HDP3/rnHuVwK6k+Wa2EniKT68YRDqkwzlFQsTM0gjsxnFmdiUw3Tl30bFeJxJp2scvEjrjCVxc24BDwA0e5xFpl7b4RUTijPbxi4jEGRW/iEicUfGLiMQZFb+ISJxR8YuIxBkVv4hInPl/uEQNNWTX6GoAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learn.lr_find()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" | epoch | \n",
" train_loss | \n",
" valid_loss | \n",
" _exp_rmspe | \n",
" time | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.027484 | \n",
" 0.028010 | \n",
" 0.159123 | \n",
" 01:16 | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.015487 | \n",
" 0.018240 | \n",
" 0.141216 | \n",
" 01:16 | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.011581 | \n",
" 0.015734 | \n",
" 0.123025 | \n",
" 01:16 | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.008431 | \n",
" 0.012607 | \n",
" 0.112609 | \n",
" 01:16 | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.007278 | \n",
" 0.011724 | \n",
" 0.108596 | \n",
" 01:16 | \n",
"
\n",
" \n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit_one_cycle(5, 3e-3, wd=0.2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(10th place in the competition was 0.108)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learn.recorder.plot_loss(skip_start=1000)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(10th place in the competition was 0.108)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Inference on the test set"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_to = to.new(test_df)\n",
"test_to.process()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_dls = test_to.dataloaders(bs=512, path=path, shuffle_train=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn.metrics=[]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tst_preds,_ = learn.get_preds(dl=test_dls.train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 41088)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.exp(tst_preds.numpy()).T.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_df[\"Sales\"]=np.exp(tst_preds.numpy()).T[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_df[[\"Id\",\"Sales\"]] = test_df[[\"Id\",\"Sales\"]].astype(\"int\")\n",
"test_df[[\"Id\",\"Sales\"]].to_csv(\"rossmann_submission.csv\",index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This submission scored 3rd on the private leaderboard."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"jupytext": {
"split_at_heading": true
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}