{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%reload_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from fastai.tabular 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": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[PosixPath('data/rossmann/joined'),\n",
" PosixPath('data/rossmann/state_names.csv'),\n",
" PosixPath('data/rossmann/test_clean'),\n",
" PosixPath('data/rossmann/train_clean'),\n",
" PosixPath('data/rossmann/googletrend.csv'),\n",
" PosixPath('data/rossmann/sample_submission.csv'),\n",
" PosixPath('data/rossmann/test.csv'),\n",
" PosixPath('data/rossmann/df'),\n",
" PosixPath('data/rossmann/store.csv'),\n",
" PosixPath('data/rossmann/train.csv'),\n",
" PosixPath('data/rossmann/joined_test'),\n",
" PosixPath('data/rossmann/weather.csv'),\n",
" PosixPath('data/rossmann/store_states.csv')]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = Path('data/rossmann/')\n",
"path.ls()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"train_df = pd.read_pickle(path / 'train_clean')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
"
\n",
" \n",
" \n",
" \n",
" index | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \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",
" Open | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" Promo | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" StateHoliday | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" SchoolHoliday | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" Year | \n",
" 2015 | \n",
" 2015 | \n",
" 2015 | \n",
" 2015 | \n",
" 2015 | \n",
"
\n",
" \n",
" Month | \n",
" 7 | \n",
" 7 | \n",
" 7 | \n",
" 7 | \n",
" 7 | \n",
"
\n",
" \n",
" Week | \n",
" 31 | \n",
" 31 | \n",
" 31 | \n",
" 31 | \n",
" 31 | \n",
"
\n",
" \n",
" Day | \n",
" 31 | \n",
" 31 | \n",
" 31 | \n",
" 31 | \n",
" 31 | \n",
"
\n",
" \n",
" Dayofweek | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
" 4 | \n",
"
\n",
" \n",
" Dayofyear | \n",
" 212 | \n",
" 212 | \n",
" 212 | \n",
" 212 | \n",
" 212 | \n",
"
\n",
" \n",
" Is_month_end | \n",
" True | \n",
" True | \n",
" True | \n",
" True | \n",
" True | \n",
"
\n",
" \n",
" Is_month_start | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" Is_quarter_end | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" Is_quarter_start | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" Is_year_end | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" Is_year_start | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" Elapsed | \n",
" 1438300800 | \n",
" 1438300800 | \n",
" 1438300800 | \n",
" 1438300800 | \n",
" 1438300800 | \n",
"
\n",
" \n",
" StoreType | \n",
" c | \n",
" a | \n",
" a | \n",
" c | \n",
" a | \n",
"
\n",
" \n",
" Assortment | \n",
" a | \n",
" a | \n",
" a | \n",
" c | \n",
" a | \n",
"
\n",
" \n",
" CompetitionDistance | \n",
" 1270 | \n",
" 570 | \n",
" 14130 | \n",
" 620 | \n",
" 29910 | \n",
"
\n",
" \n",
" CompetitionOpenSinceMonth | \n",
" 9 | \n",
" 11 | \n",
" 12 | \n",
" 9 | \n",
" 4 | \n",
"
\n",
" \n",
" CompetitionOpenSinceYear | \n",
" 2008 | \n",
" 2007 | \n",
" 2006 | \n",
" 2009 | \n",
" 2015 | \n",
"
\n",
" \n",
" Promo2 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Promo2SinceWeek | \n",
" 1 | \n",
" 13 | \n",
" 14 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" Min_Sea_Level_PressurehPa | \n",
" 1015 | \n",
" 1017 | \n",
" 1017 | \n",
" 1014 | \n",
" 1016 | \n",
"
\n",
" \n",
" Max_VisibilityKm | \n",
" 31 | \n",
" 10 | \n",
" 31 | \n",
" 10 | \n",
" 10 | \n",
"
\n",
" \n",
" Mean_VisibilityKm | \n",
" 15 | \n",
" 10 | \n",
" 14 | \n",
" 10 | \n",
" 10 | \n",
"
\n",
" \n",
" Min_VisibilitykM | \n",
" 10 | \n",
" 10 | \n",
" 10 | \n",
" 10 | \n",
" 10 | \n",
"
\n",
" \n",
" Max_Wind_SpeedKm_h | \n",
" 24 | \n",
" 14 | \n",
" 14 | \n",
" 23 | \n",
" 14 | \n",
"
\n",
" \n",
" Mean_Wind_SpeedKm_h | \n",
" 11 | \n",
" 11 | \n",
" 5 | \n",
" 16 | \n",
" 11 | \n",
"
\n",
" \n",
" Max_Gust_SpeedKm_h | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" Precipitationmm | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" CloudCover | \n",
" 1 | \n",
" 4 | \n",
" 2 | \n",
" 6 | \n",
" 4 | \n",
"
\n",
" \n",
" Events | \n",
" Fog | \n",
" Fog | \n",
" Fog | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" WindDirDegrees | \n",
" 13 | \n",
" 309 | \n",
" 354 | \n",
" 282 | \n",
" 290 | \n",
"
\n",
" \n",
" StateName | \n",
" Hessen | \n",
" Thueringen | \n",
" NordrheinWestfalen | \n",
" Berlin | \n",
" Sachsen | \n",
"
\n",
" \n",
" CompetitionOpenSince | \n",
" 2008-09-15 00:00:00 | \n",
" 2007-11-15 00:00:00 | \n",
" 2006-12-15 00:00:00 | \n",
" 2009-09-15 00:00:00 | \n",
" 2015-04-15 00:00:00 | \n",
"
\n",
" \n",
" CompetitionDaysOpen | \n",
" 2510 | \n",
" 2815 | \n",
" 3150 | \n",
" 2145 | \n",
" 107 | \n",
"
\n",
" \n",
" CompetitionMonthsOpen | \n",
" 24 | \n",
" 24 | \n",
" 24 | \n",
" 24 | \n",
" 3 | \n",
"
\n",
" \n",
" Promo2Since | \n",
" 1900-01-01 00:00:00 | \n",
" 2010-03-29 00:00:00 | \n",
" 2011-04-04 00:00:00 | \n",
" 1900-01-01 00:00:00 | \n",
" 1900-01-01 00:00:00 | \n",
"
\n",
" \n",
" Promo2Days | \n",
" 0 | \n",
" 1950 | \n",
" 1579 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Promo2Weeks | \n",
" 0 | \n",
" 25 | \n",
" 25 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" AfterSchoolHoliday | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" BeforeSchoolHoliday | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" AfterStateHoliday | \n",
" 57 | \n",
" 67 | \n",
" 57 | \n",
" 67 | \n",
" 57 | \n",
"
\n",
" \n",
" BeforeStateHoliday | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" AfterPromo | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" BeforePromo | \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",
" StateHoliday_bw | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" Promo_bw | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
" 5 | \n",
"
\n",
" \n",
" SchoolHoliday_fw | \n",
" 7 | \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",
" Promo_fw | \n",
" 5 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
93 rows × 5 columns
\n",
"
"
],
"text/plain": [
" 0 1 \\\n",
"index 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",
"Open 1 1 \n",
"Promo 1 1 \n",
"StateHoliday False False \n",
"SchoolHoliday 1 1 \n",
"Year 2015 2015 \n",
"Month 7 7 \n",
"Week 31 31 \n",
"Day 31 31 \n",
"Dayofweek 4 4 \n",
"Dayofyear 212 212 \n",
"Is_month_end True True \n",
"Is_month_start False False \n",
"Is_quarter_end False False \n",
"Is_quarter_start False False \n",
"Is_year_end False False \n",
"Is_year_start False False \n",
"Elapsed 1438300800 1438300800 \n",
"StoreType c a \n",
"Assortment a a \n",
"CompetitionDistance 1270 570 \n",
"CompetitionOpenSinceMonth 9 11 \n",
"CompetitionOpenSinceYear 2008 2007 \n",
"Promo2 0 1 \n",
"Promo2SinceWeek 1 13 \n",
"... ... ... \n",
"Min_Sea_Level_PressurehPa 1015 1017 \n",
"Max_VisibilityKm 31 10 \n",
"Mean_VisibilityKm 15 10 \n",
"Min_VisibilitykM 10 10 \n",
"Max_Wind_SpeedKm_h 24 14 \n",
"Mean_Wind_SpeedKm_h 11 11 \n",
"Max_Gust_SpeedKm_h NaN NaN \n",
"Precipitationmm 0 0 \n",
"CloudCover 1 4 \n",
"Events Fog Fog \n",
"WindDirDegrees 13 309 \n",
"StateName Hessen Thueringen \n",
"CompetitionOpenSince 2008-09-15 00:00:00 2007-11-15 00:00:00 \n",
"CompetitionDaysOpen 2510 2815 \n",
"CompetitionMonthsOpen 24 24 \n",
"Promo2Since 1900-01-01 00:00:00 2010-03-29 00:00:00 \n",
"Promo2Days 0 1950 \n",
"Promo2Weeks 0 25 \n",
"AfterSchoolHoliday 0 0 \n",
"BeforeSchoolHoliday 0 0 \n",
"AfterStateHoliday 57 67 \n",
"BeforeStateHoliday 0 0 \n",
"AfterPromo 0 0 \n",
"BeforePromo 0 0 \n",
"SchoolHoliday_bw 5 5 \n",
"StateHoliday_bw 0 0 \n",
"Promo_bw 5 5 \n",
"SchoolHoliday_fw 7 1 \n",
"StateHoliday_fw 0 0 \n",
"Promo_fw 5 1 \n",
"\n",
" 2 3 \\\n",
"index 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",
"Open 1 1 \n",
"Promo 1 1 \n",
"StateHoliday False False \n",
"SchoolHoliday 1 1 \n",
"Year 2015 2015 \n",
"Month 7 7 \n",
"Week 31 31 \n",
"Day 31 31 \n",
"Dayofweek 4 4 \n",
"Dayofyear 212 212 \n",
"Is_month_end True True \n",
"Is_month_start False False \n",
"Is_quarter_end False False \n",
"Is_quarter_start False False \n",
"Is_year_end False False \n",
"Is_year_start False False \n",
"Elapsed 1438300800 1438300800 \n",
"StoreType a c \n",
"Assortment a c \n",
"CompetitionDistance 14130 620 \n",
"CompetitionOpenSinceMonth 12 9 \n",
"CompetitionOpenSinceYear 2006 2009 \n",
"Promo2 1 0 \n",
"Promo2SinceWeek 14 1 \n",
"... ... ... \n",
"Min_Sea_Level_PressurehPa 1017 1014 \n",
"Max_VisibilityKm 31 10 \n",
"Mean_VisibilityKm 14 10 \n",
"Min_VisibilitykM 10 10 \n",
"Max_Wind_SpeedKm_h 14 23 \n",
"Mean_Wind_SpeedKm_h 5 16 \n",
"Max_Gust_SpeedKm_h NaN NaN \n",
"Precipitationmm 0 0 \n",
"CloudCover 2 6 \n",
"Events Fog NaN \n",
"WindDirDegrees 354 282 \n",
"StateName NordrheinWestfalen Berlin \n",
"CompetitionOpenSince 2006-12-15 00:00:00 2009-09-15 00:00:00 \n",
"CompetitionDaysOpen 3150 2145 \n",
"CompetitionMonthsOpen 24 24 \n",
"Promo2Since 2011-04-04 00:00:00 1900-01-01 00:00:00 \n",
"Promo2Days 1579 0 \n",
"Promo2Weeks 25 0 \n",
"AfterSchoolHoliday 0 0 \n",
"BeforeSchoolHoliday 0 0 \n",
"AfterStateHoliday 57 67 \n",
"BeforeStateHoliday 0 0 \n",
"AfterPromo 0 0 \n",
"BeforePromo 0 0 \n",
"SchoolHoliday_bw 5 5 \n",
"StateHoliday_bw 0 0 \n",
"Promo_bw 5 5 \n",
"SchoolHoliday_fw 5 1 \n",
"StateHoliday_fw 0 0 \n",
"Promo_fw 5 1 \n",
"\n",
" 4 \n",
"index 4 \n",
"Store 5 \n",
"DayOfWeek 5 \n",
"Date 2015-07-31 00:00:00 \n",
"Sales 4822 \n",
"Customers 559 \n",
"Open 1 \n",
"Promo 1 \n",
"StateHoliday False \n",
"SchoolHoliday 1 \n",
"Year 2015 \n",
"Month 7 \n",
"Week 31 \n",
"Day 31 \n",
"Dayofweek 4 \n",
"Dayofyear 212 \n",
"Is_month_end True \n",
"Is_month_start False \n",
"Is_quarter_end False \n",
"Is_quarter_start False \n",
"Is_year_end False \n",
"Is_year_start False \n",
"Elapsed 1438300800 \n",
"StoreType a \n",
"Assortment a \n",
"CompetitionDistance 29910 \n",
"CompetitionOpenSinceMonth 4 \n",
"CompetitionOpenSinceYear 2015 \n",
"Promo2 0 \n",
"Promo2SinceWeek 1 \n",
"... ... \n",
"Min_Sea_Level_PressurehPa 1016 \n",
"Max_VisibilityKm 10 \n",
"Mean_VisibilityKm 10 \n",
"Min_VisibilitykM 10 \n",
"Max_Wind_SpeedKm_h 14 \n",
"Mean_Wind_SpeedKm_h 11 \n",
"Max_Gust_SpeedKm_h NaN \n",
"Precipitationmm 0 \n",
"CloudCover 4 \n",
"Events NaN \n",
"WindDirDegrees 290 \n",
"StateName Sachsen \n",
"CompetitionOpenSince 2015-04-15 00:00:00 \n",
"CompetitionDaysOpen 107 \n",
"CompetitionMonthsOpen 3 \n",
"Promo2Since 1900-01-01 00:00:00 \n",
"Promo2Days 0 \n",
"Promo2Weeks 0 \n",
"AfterSchoolHoliday 0 \n",
"BeforeSchoolHoliday 0 \n",
"AfterStateHoliday 57 \n",
"BeforeStateHoliday 0 \n",
"AfterPromo 0 \n",
"BeforePromo 0 \n",
"SchoolHoliday_bw 5 \n",
"StateHoliday_bw 0 \n",
"Promo_bw 5 \n",
"SchoolHoliday_fw 1 \n",
"StateHoliday_fw 0 \n",
"Promo_fw 1 \n",
"\n",
"[93 rows x 5 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_df.head().T"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"844338"
]
},
"execution_count": 7,
"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": 11,
"metadata": {},
"outputs": [],
"source": [
"idx = np.random.permutation(range(n))[:2000]\n",
"idx.sort()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"small_train_df = train_df.iloc[idx[:1000]]\n",
"small_test_df = train_df.iloc[idx[1000:]]\n",
"small_cont_vars = ['CompetitionDistance', 'Mean_Humidity']\n",
"small_cat_vars = ['Store', 'DayOfWeek', 'PromoInterval']\n",
"small_train_df = small_train_df[small_cat_vars + small_cont_vars + ['Sales']]\n",
"small_test_df = small_test_df[small_cat_vars + small_cont_vars + ['Sales']]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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",
" 245 | \n",
" 246 | \n",
" 5 | \n",
" NaN | \n",
" 4660.0 | \n",
" 70 | \n",
" 10031 | \n",
"
\n",
" \n",
" 523 | \n",
" 525 | \n",
" 5 | \n",
" NaN | \n",
" 1870.0 | \n",
" 61 | \n",
" 10461 | \n",
"
\n",
" \n",
" 2403 | \n",
" 178 | \n",
" 3 | \n",
" NaN | \n",
" 1710.0 | \n",
" 55 | \n",
" 10766 | \n",
"
\n",
" \n",
" 2501 | \n",
" 276 | \n",
" 3 | \n",
" Mar,Jun,Sept,Dec | \n",
" 2960.0 | \n",
" 55 | \n",
" 3944 | \n",
"
\n",
" \n",
" 3547 | \n",
" 209 | \n",
" 2 | \n",
" Jan,Apr,Jul,Oct | \n",
" 11680.0 | \n",
" 90 | \n",
" 7521 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"245 246 5 NaN 4660.0 70 \n",
"523 525 5 NaN 1870.0 61 \n",
"2403 178 3 NaN 1710.0 55 \n",
"2501 276 3 Mar,Jun,Sept,Dec 2960.0 55 \n",
"3547 209 2 Jan,Apr,Jul,Oct 11680.0 90 \n",
"\n",
" Sales \n",
"245 10031 \n",
"523 10461 \n",
"2403 10766 \n",
"2501 3944 \n",
"3547 7521 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_train_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"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",
" 407390 | \n",
" 27 | \n",
" 2 | \n",
" Jan,Apr,Jul,Oct | \n",
" 60.0 | \n",
" 63 | \n",
" 15278 | \n",
"
\n",
" \n",
" 407789 | \n",
" 426 | \n",
" 2 | \n",
" NaN | \n",
" 250.0 | \n",
" 63 | \n",
" 7667 | \n",
"
\n",
" \n",
" 408380 | \n",
" 1017 | \n",
" 2 | \n",
" NaN | \n",
" 110.0 | \n",
" 80 | \n",
" 11214 | \n",
"
\n",
" \n",
" 409325 | \n",
" 847 | \n",
" 1 | \n",
" Feb,May,Aug,Nov | \n",
" 190.0 | \n",
" 64 | \n",
" 10440 | \n",
"
\n",
" \n",
" 410122 | \n",
" 498 | \n",
" 6 | \n",
" Jan,Apr,Jul,Oct | \n",
" 990.0 | \n",
" 75 | \n",
" 8645 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"407390 27 2 Jan,Apr,Jul,Oct 60.0 63 \n",
"407789 426 2 NaN 250.0 63 \n",
"408380 1017 2 NaN 110.0 80 \n",
"409325 847 1 Feb,May,Aug,Nov 190.0 64 \n",
"410122 498 6 Jan,Apr,Jul,Oct 990.0 75 \n",
"\n",
" Sales \n",
"407390 15278 \n",
"407789 7667 \n",
"408380 11214 \n",
"409325 10440 \n",
"410122 8645 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_test_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"categorify = Categorify(small_cat_vars, small_cont_vars)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"categorify(small_train_df)\n",
"categorify(small_test_df, test=True)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"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",
" 407390 | \n",
" 27.0 | \n",
" 2 | \n",
" Jan,Apr,Jul,Oct | \n",
" 60.0 | \n",
" 63 | \n",
" 15278 | \n",
"
\n",
" \n",
" 407789 | \n",
" 426.0 | \n",
" 2 | \n",
" NaN | \n",
" 250.0 | \n",
" 63 | \n",
" 7667 | \n",
"
\n",
" \n",
" 408380 | \n",
" NaN | \n",
" 2 | \n",
" NaN | \n",
" 110.0 | \n",
" 80 | \n",
" 11214 | \n",
"
\n",
" \n",
" 409325 | \n",
" 847.0 | \n",
" 1 | \n",
" Feb,May,Aug,Nov | \n",
" 190.0 | \n",
" 64 | \n",
" 10440 | \n",
"
\n",
" \n",
" 410122 | \n",
" 498.0 | \n",
" 6 | \n",
" Jan,Apr,Jul,Oct | \n",
" 990.0 | \n",
" 75 | \n",
" 8645 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"407390 27.0 2 Jan,Apr,Jul,Oct 60.0 63 \n",
"407789 426.0 2 NaN 250.0 63 \n",
"408380 NaN 2 NaN 110.0 80 \n",
"409325 847.0 1 Feb,May,Aug,Nov 190.0 64 \n",
"410122 498.0 6 Jan,Apr,Jul,Oct 990.0 75 \n",
"\n",
" Sales \n",
"407390 15278 \n",
"407789 7667 \n",
"408380 11214 \n",
"409325 10440 \n",
"410122 8645 "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_test_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Feb,May,Aug,Nov', 'Jan,Apr,Jul,Oct', 'Mar,Jun,Sept,Dec'], dtype='object')"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_train_df.PromoInterval.cat.categories"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"245 -1\n",
"523 -1\n",
"2403 -1\n",
"2501 2\n",
"3547 1\n",
"dtype: int8"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_train_df['PromoInterval'].cat.codes[:5]"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"fill_missing = FillMissing(small_cat_vars, small_cont_vars)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [
{
"ename": "Exception",
"evalue": "There are nan values in field CompetitionDistance but there were none in the training set. \n Please fix those manually.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mException\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mfill_missing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msmall_train_df\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mfill_missing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msmall_test_df\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/anaconda3/envs/fastai-v1/lib/python3.6/site-packages/fastai/tabular/transform.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, df, test)\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\"Apply the correct function to `df` depending on `test`.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_test\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtest\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_train\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_train\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/fastai-v1/lib/python3.6/site-packages/fastai/tabular/transform.py\u001b[0m in \u001b[0;36mapply_test\u001b[0;34m(self, df)\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnull\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m raise Exception(f\"\"\"There are nan values in field {name} but there were none in the training set. \n\u001b[0;32m---> 97\u001b[0;31m Please fix those manually.\"\"\")\n\u001b[0m\u001b[1;32m 98\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mNormalize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mTabularProc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mException\u001b[0m: There are nan values in field CompetitionDistance but there were none in the training set. \n Please fix those manually."
]
}
],
"source": [
"fill_missing(small_train_df)\n",
"fill_missing(small_test_df, test=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fix the previous error: https://forums.fast.ai/t/there-are-nan-values-in-field-but-there-were-none-in-the-training-set/32260?u=cedric"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"4"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_test_df.CompetitionDistance.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 75,
"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",
" 413591 | \n",
" NaN | \n",
" 3 | \n",
" NaN | \n",
" NaN | \n",
" 77 | \n",
" 3793 | \n",
"
\n",
" \n",
" 592154 | \n",
" NaN | \n",
" 6 | \n",
" NaN | \n",
" NaN | \n",
" 79 | \n",
" 4936 | \n",
"
\n",
" \n",
" 620431 | \n",
" NaN | \n",
" 5 | \n",
" NaN | \n",
" NaN | \n",
" 68 | \n",
" 5776 | \n",
"
\n",
" \n",
" 810783 | \n",
" NaN | \n",
" 3 | \n",
" Feb,May,Aug,Nov | \n",
" NaN | \n",
" 88 | \n",
" 3839 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Store DayOfWeek PromoInterval CompetitionDistance Mean_Humidity \\\n",
"413591 NaN 3 NaN NaN 77 \n",
"592154 NaN 6 NaN NaN 79 \n",
"620431 NaN 5 NaN NaN 68 \n",
"810783 NaN 3 Feb,May,Aug,Nov NaN 88 \n",
"\n",
" Sales \n",
"413591 3793 \n",
"592154 4936 \n",
"620431 5776 \n",
"810783 3839 "
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"small_test_df[small_test_df[\"CompetitionDistance\"].isnull()]"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2290.0\n"
]
}
],
"source": [
"filler = small_test_df.loc[:,'CompetitionDistance'].median()\n",
"print(filler)\n",
"small_test_df.loc[:,'CompetitionDistance'] = small_test_df.loc[:,'CompetitionDistance'].fillna(filler)\n",
"# small_test_df[small_test_df[\"CompetitionDistance\"] == filler]"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
"fill_missing(small_test_df, test=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# small_train_df[small_train_df['CompetitionDistance_na'] == True]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Preparing full data set"
]
},
{
"cell_type": "code",
"execution_count": 81,
"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": 82,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(844338, 41088)"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(train_df), len(test_df)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"procs = [FillMissing, Categorify, Normalize]"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [],
"source": [
"cat_vars = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen',\n",
" 'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear',\n",
" 'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw',\n",
" 'SchoolHoliday_fw', 'SchoolHoliday_bw']\n",
"\n",
"cont_vars = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC',\n",
" 'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', \n",
" 'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE',\n",
" 'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday']"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
"dep_var = 'Sales'\n",
"df = train_df[cat_vars + cont_vars + [dep_var, 'Date']].copy()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Timestamp('2015-08-01 00:00:00'), Timestamp('2015-09-17 00:00:00'))"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_df['Date'].min(), test_df['Date'].max()"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"41395"
]
},
"execution_count": 87,
"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": 88,
"metadata": {},
"outputs": [],
"source": [
"valid_idx = range(cut)"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 5263\n",
"1 6064\n",
"2 8314\n",
"3 13995\n",
"4 4822\n",
"Name: Sales, dtype: int64"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[dep_var].head()"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [],
"source": [
"data = (TabularList.from_df(df, path=path, cat_names=cat_vars, cont_names=cont_vars, procs=procs)\n",
" .split_by_idx(valid_idx)\n",
" .label_from_df(cols=dep_var, label_cls=FloatList, log=True)\n",
" .databunch())"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [],
"source": [
"doc(FloatList)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [],
"source": [
"max_log_y = np.log(np.max(train_df['Sales'])*1.2)\n",
"y_range = torch.tensor([0, max_log_y], device=defaults.device)"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"learn = tabular_learner(data, layers=[1000,500], ps=[0.001,0.01], emb_drop=0.04,\n",
" y_range=y_range, metrics=exp_rmspe)"
]
},
{
"cell_type": "code",
"execution_count": 99,
"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(26, 10)\n",
" (7): Embedding(27, 10)\n",
" (8): Embedding(5, 4)\n",
" (9): Embedding(4, 3)\n",
" (10): Embedding(4, 3)\n",
" (11): Embedding(24, 9)\n",
" (12): Embedding(9, 5)\n",
" (13): Embedding(13, 7)\n",
" (14): Embedding(53, 15)\n",
" (15): Embedding(22, 9)\n",
" (16): Embedding(7, 5)\n",
" (17): Embedding(7, 5)\n",
" (18): Embedding(4, 3)\n",
" (19): Embedding(4, 3)\n",
" (20): Embedding(9, 5)\n",
" (21): Embedding(9, 5)\n",
" (22): Embedding(3, 3)\n",
" (23): Embedding(3, 3)\n",
" )\n",
" (emb_drop): Dropout(p=0.04)\n",
" (bn_cont): BatchNorm1d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers): Sequential(\n",
" (0): Linear(in_features=233, out_features=1000, bias=True)\n",
" (1): ReLU(inplace)\n",
" (2): BatchNorm1d(1000, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (3): Dropout(p=0.001)\n",
" (4): Linear(in_features=1000, out_features=500, bias=True)\n",
" (5): ReLU(inplace)\n",
" (6): BatchNorm1d(500, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (7): Dropout(p=0.01)\n",
" (8): Linear(in_features=500, out_features=1, bias=True)\n",
" )\n",
")"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.model"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"16"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(data.train_ds.cont_names)"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n"
]
}
],
"source": [
"learn.lr_find()"
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learn.recorder.plot(skip_start=10, skip_end=0)"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 12:32 \n",
" \n",
" epoch | \n",
" train_loss | \n",
" valid_loss | \n",
" exp_rmspe | \n",
"
\n",
" \n",
" 1 | \n",
" 0.021942 | \n",
" 0.024053 | \n",
" 0.155830 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.019645 | \n",
" 0.017017 | \n",
" 0.129867 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.016388 | \n",
" 0.021986 | \n",
" 0.120790 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.012060 | \n",
" 0.012576 | \n",
" 0.110928 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.009612 | \n",
" 0.010940 | \n",
" 0.103163 | \n",
"
\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit_one_cycle(5, 1e-3, wd=0.2)"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [],
"source": [
"learn.save('1')"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEKCAYAAAA4t9PUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXd4VEXXwH+TTSVAQu+QSFFahFAEAQURBFFRRAEVsWJ9LVhe1FdEbIgN/VSwomBBRUAUAUVAUZEqRXqAAAGkEwLpyXx/7N3N9pLdTT2/58mTe+fO3J0bljn3zGlKa40gCIIgFJew0p6AIAiCUL4RQSIIgiAEhAgSQRAEISBEkAiCIAgBIYJEEARBCAgRJIIgCEJAiCARBEEQAkIEiSAIghAQIkgEQRCEgAgv7QmUBLVr19YJCQmlPQ1BEIRyxdq1a49pret461cpBElCQgJr1qwp7WkIgiCUK5RSe33pJ1tbgiAIQkCIIBEEQRACQgSJIAiCEBCVwkYiCELFIC8vj7S0NLKzs0t7KhWK6OhoGjduTERERLHGiyARBKHckJaWRrVq1UhISEApVdrTqRBorTl+/DhpaWkkJiYW6x6ytSUIQrkhOzubWrVqiRAJIkopatWqFZCWJ4JEEIRyhQiR4BPo31QESQVhwaZDnDibW9rTEAShEiKCpAJw/EwO93y+jjs+XV3aUxGECs3x48fp0KEDHTp0oH79+jRq1Mh6npvr24vcrbfeyvbt20M805JFjO0VgPxCDcD+k1mlPBNBqNjUqlWL9evXAzB+/HiqVq3Ko48+atdHa43WmrAw1+/p06ZNC/k8SxrRSCoAlu1NrUt3HoJQWUlJSaFdu3bcfffdJCcnc+jQIUaPHk3nzp1p27YtEyZMsPbt2bMn69evJz8/n/j4eMaOHcv5559P9+7dOXLkSCk+RfERjaQCEGZIEi2SRKhEPPv9ZrYcPB3Ue7ZpWJ1nrmxbrLFbtmxh2rRpTJ06FYCJEydSs2ZN8vPz6dOnD0OHDqVNmzZ2Y9LT07n44ouZOHEiY8aM4eOPP2bs2LEBP0dJIxpJBcAiSApFkAhCqdG8eXO6dOliPf/yyy9JTk4mOTmZrVu3smXLFqcxMTExDBw4EIBOnTqRmppaUtMNKqKRVAAsjnuFIkeESkRxNYdQERsbaz3euXMnb775JqtWrSI+Pp6bbrrJZZxGZGSk9dhkMpGfn18icw02opFUAIpsJCJJBKEscPr0aapVq0b16tU5dOgQixYtKu0phZSQChKl1ACl1HalVIpSymnjTykVpZT6yri+UimVYLR3VUqtN342KKWu8fWelRFLMJGIEUEoGyQnJ9OmTRvatWvHnXfeSY8ePUp7SiFFheotVillAnYA/YA0YDUwQmu9xabPvUCS1vpupdRw4Bqt9TClVBUgV2udr5RqAGwAGmJeKz3e0xWdO3fWFbmw1ensPJLG/0TVqHD+efay0p6OIISMrVu30rp169KeRoXE1d9WKbVWa93Z29hQaiRdgRSt9W6tdS4wExjs0Gcw8KlxPAvoq5RSWutMrbVlszCaopdtX+5ZaZGtLUEQSoNQCpJGwH6b8zSjzWUfQ3CkA7UAlFIXKKU2A5uAu43rvtyz0lIggkQQhFIglILEVRYwx5XObR+t9UqtdVugC/CEUirax3uab6zUaKXUGqXUmqNHj/ox7fKLyBFBEEqDUAqSNKCJzXlj4KC7PkqpcCAOOGHbQWu9FTgLtPPxnpZx72utO2utO9epUyeAxyg/iBwRBKE0CKUgWQ20VEolKqUigeHAPIc+84BRxvFQYInWWhtjwgGUUs2Ac4FUH+9Z6bBqIiJJBEEoBUIWkGh4XN0PLAJMwMda681KqQnAGq31POAjYIZSKgWzJjLcGN4TGKuUygMKgXu11scAXN0zVM9Q3tAiSQRBKAVCGkeitf5Ra91Ka91ca/2C0TbOECJorbO11tdprVtorbtqrXcb7TO01m211h201sla67me7imYERuJIISW3r17OwUXTp48mXvvvdftmKpVqwJw8OBBhg4d6va+3kIUJk+eTGZmpvX88ssv59SpU75OPaRIZHsFQuSIIISWESNGMHPmTLu2mTNnMmLECK9jGzZsyKxZs4r92Y6C5McffyQ+Pr7Y9wsmIkgqEJK0URBCy9ChQ/nhhx/IyckBIDU1lYMHD9KhQwf69u1LcnIy7du357vvvnMam5qaSrt27QDIyspi+PDhJCUlMWzYMLKyimoJ3XPPPdb088888wwAb731FgcPHqRPnz706dMHgISEBI4dOwbA66+/Trt27WjXrh2TJ0+2fl7r1q258847adu2Lf3797f7nGAiSRsrECJHhErFgrHw76bg3rN+exg4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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learn.recorder.plot_losses(last=-1)"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/plain": [
"Learner(data=TabularDataBunch;\n",
"\n",
"Train: LabelList\n",
"y: FloatList (802943 items)\n",
"[FloatItem 9.022926, FloatItem 8.443546, FloatItem 8.547528, FloatItem 8.92758, FloatItem 9.091557]...\n",
"Path: data/rossmann\n",
"x: TabularList (802943 items)\n",
"[TabularLine Store 1115; DayOfWeek 5; Year 2015; Month 6; Day 19; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 25; StoreType d; Assortment c; PromoInterval Mar,Jun,Sept,Dec; CompetitionOpenSinceYear 1900; Promo2SinceYear 2012; State HE; Week 25; Events Rain; Promo_fw 1.0; Promo_bw 5.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 0.0; SchoolHoliday_bw 0.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.0130; Max_TemperatureC 0.1333; Mean_TemperatureC 0.4683; Min_TemperatureC 0.8602; Max_Humidity 0.0780; Mean_Humidity -0.3412; Min_Humidity -0.0811; Max_Wind_SpeedKm_h -0.1780; Mean_Wind_SpeedKm_h 0.1902; CloudCover 0.2552; trend 0.4066; trend_DE 0.5969; AfterStateHoliday -0.7329; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday -0.4796; , TabularLine Store 1; DayOfWeek 4; Year 2015; Month 6; Day 18; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 0; StoreType c; Assortment a; PromoInterval #na#; CompetitionOpenSinceYear 2008; Promo2SinceYear 1900; State HE; Week 25; Events Rain; Promo_fw 2.0; Promo_bw 4.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 0.0; SchoolHoliday_bw 0.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.5358; Max_TemperatureC 0.8549; Mean_TemperatureC 1.0322; Min_TemperatureC 1.1756; Max_Humidity 0.8653; Mean_Humidity -0.6479; Min_Humidity -1.0487; Max_Wind_SpeedKm_h 0.3768; Mean_Wind_SpeedKm_h 0.1902; CloudCover 0.2552; trend 0.4066; trend_DE 0.5969; AfterStateHoliday -0.7645; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday -0.4796; , TabularLine Store 2; DayOfWeek 4; Year 2015; Month 6; Day 18; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 25; StoreType a; Assortment a; PromoInterval Jan,Apr,Jul,Oct; CompetitionOpenSinceYear 2007; Promo2SinceYear 2010; State TH; Week 25; Events Rain; Promo_fw 2.0; Promo_bw 4.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 0.0; SchoolHoliday_bw 0.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.6255; Max_TemperatureC 0.6144; Mean_TemperatureC 0.8912; Min_TemperatureC 1.0179; Max_Humidity 0.8653; Mean_Humidity -0.1112; Min_Humidity -0.6413; Max_Wind_SpeedKm_h 0.4878; Mean_Wind_SpeedKm_h 0.3579; CloudCover 0.2552; trend -0.4997; trend_DE 0.5969; AfterStateHoliday -0.4486; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday -0.4796; , TabularLine Store 3; DayOfWeek 4; Year 2015; Month 6; Day 18; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 25; StoreType a; Assortment a; PromoInterval Jan,Apr,Jul,Oct; CompetitionOpenSinceYear 2006; Promo2SinceYear 2011; State NW; Week 25; Events Rain; Promo_fw 2.0; Promo_bw 4.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 0.0; SchoolHoliday_bw 0.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance 1.1122; Max_TemperatureC 0.7346; Mean_TemperatureC 1.0322; Min_TemperatureC 1.1756; Max_Humidity 0.8653; Mean_Humidity -0.4945; Min_Humidity -0.8959; Max_Wind_SpeedKm_h 0.7097; Mean_Wind_SpeedKm_h 0.3579; CloudCover 0.2552; trend 1.0410; trend_DE 0.5969; AfterStateHoliday -0.7645; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday -0.4796; , TabularLine Store 4; DayOfWeek 4; Year 2015; Month 6; Day 18; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 0; StoreType c; Assortment c; PromoInterval #na#; CompetitionOpenSinceYear 2009; Promo2SinceYear 1900; State BE; Week 25; Events Rain; Promo_fw 2.0; Promo_bw 4.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 0.0; SchoolHoliday_bw 0.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.6191; Max_TemperatureC 0.8549; Mean_TemperatureC 1.0322; Min_TemperatureC 1.0179; Max_Humidity 0.8653; Mean_Humidity -0.4179; Min_Humidity -0.8450; Max_Wind_SpeedKm_h 0.1549; Mean_Wind_SpeedKm_h 0.3579; CloudCover 0.2552; trend -0.1372; trend_DE 0.5969; AfterStateHoliday -0.4486; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday -0.4796; ]...\n",
"Path: data/rossmann;\n",
"\n",
"Valid: LabelList\n",
"y: FloatList (41395 items)\n",
"[FloatItem 8.568457, FloatItem 8.710125, FloatItem 9.025696, FloatItem 9.546455, FloatItem 8.480944]...\n",
"Path: data/rossmann\n",
"x: TabularList (41395 items)\n",
"[TabularLine Store 1; DayOfWeek 5; Year 2015; Month 7; Day 31; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 0; StoreType c; Assortment a; PromoInterval #na#; CompetitionOpenSinceYear 2008; Promo2SinceYear 1900; State HE; Week 31; Events Fog; Promo_fw 5.0; Promo_bw 5.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 7.0; SchoolHoliday_bw 5.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.5358; Max_TemperatureC 1.0954; Mean_TemperatureC 0.8912; Min_TemperatureC 0.3871; Max_Humidity 0.6029; Mean_Humidity -1.5678; Min_Humidity -1.6598; Max_Wind_SpeedKm_h 0.1549; Mean_Wind_SpeedKm_h -0.1452; CloudCover -2.8229; trend 1.8567; trend_DE 1.8939; AfterStateHoliday 0.5940; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday 2.0852; , TabularLine Store 2; DayOfWeek 5; Year 2015; Month 7; Day 31; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 25; StoreType a; Assortment a; PromoInterval Jan,Apr,Jul,Oct; CompetitionOpenSinceYear 2007; Promo2SinceYear 2010; State TH; Week 31; Events Fog; Promo_fw 1.0; Promo_bw 5.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 1.0; SchoolHoliday_bw 5.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.6255; Max_TemperatureC 0.6144; Mean_TemperatureC 0.4683; Min_TemperatureC 0.2293; Max_Humidity 0.8653; Mean_Humidity -0.9545; Min_Humidity -1.3033; Max_Wind_SpeedKm_h -0.9548; Mean_Wind_SpeedKm_h -0.1452; CloudCover -0.9761; trend 1.4035; trend_DE 1.8939; AfterStateHoliday 0.9099; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday 2.0852; , TabularLine Store 3; DayOfWeek 5; Year 2015; Month 7; Day 31; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 25; StoreType a; Assortment a; PromoInterval Jan,Apr,Jul,Oct; CompetitionOpenSinceYear 2006; Promo2SinceYear 2011; State NW; Week 31; Events Fog; Promo_fw 5.0; Promo_bw 5.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 5.0; SchoolHoliday_bw 5.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance 1.1122; Max_TemperatureC 0.8549; Mean_TemperatureC 0.4683; Min_TemperatureC 0.0716; Max_Humidity 0.8653; Mean_Humidity -1.0312; Min_Humidity -1.3542; Max_Wind_SpeedKm_h -0.9548; Mean_Wind_SpeedKm_h -1.1514; CloudCover -2.2073; trend 1.9473; trend_DE 1.8939; AfterStateHoliday 0.5940; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday 2.0852; , TabularLine Store 4; DayOfWeek 5; Year 2015; Month 7; Day 31; StateHoliday False; CompetitionMonthsOpen 24; Promo2Weeks 0; StoreType c; Assortment c; PromoInterval #na#; CompetitionOpenSinceYear 2009; Promo2SinceYear 1900; State BE; Week 31; Events #na#; Promo_fw 1.0; Promo_bw 5.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 1.0; SchoolHoliday_bw 5.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance -0.6191; Max_TemperatureC 0.6144; Mean_TemperatureC 0.6092; Min_TemperatureC 0.5448; Max_Humidity 0.0780; Mean_Humidity -1.0312; Min_Humidity -1.0487; Max_Wind_SpeedKm_h 0.0439; Mean_Wind_SpeedKm_h 0.6933; CloudCover 0.2552; trend 0.8597; trend_DE 1.8939; AfterStateHoliday 0.9099; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday 2.0852; , TabularLine Store 5; DayOfWeek 5; Year 2015; Month 7; Day 31; StateHoliday False; CompetitionMonthsOpen 3; Promo2Weeks 0; StoreType a; Assortment a; PromoInterval #na#; CompetitionOpenSinceYear 2015; Promo2SinceYear 1900; State SN; Week 31; Events #na#; Promo_fw 1.0; Promo_bw 5.0; StateHoliday_fw 0.0; StateHoliday_bw 0.0; SchoolHoliday_fw 1.0; SchoolHoliday_bw 5.0; CompetitionDistance_na False; CloudCover_na False; CompetitionDistance 3.1344; Max_TemperatureC 0.7346; Mean_TemperatureC 0.7502; Min_TemperatureC 0.7025; Max_Humidity -1.4966; Mean_Humidity -1.4912; Min_Humidity -1.2524; Max_Wind_SpeedKm_h -0.9548; Mean_Wind_SpeedKm_h -0.1452; CloudCover -0.9761; trend 1.5848; trend_DE 1.8939; AfterStateHoliday 0.5940; BeforeStateHoliday 1.1848; Promo 1.1119; SchoolHoliday 2.0852; ]...\n",
"Path: data/rossmann;\n",
"\n",
"Test: None, model=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(26, 10)\n",
" (7): Embedding(27, 10)\n",
" (8): Embedding(5, 4)\n",
" (9): Embedding(4, 3)\n",
" (10): Embedding(4, 3)\n",
" (11): Embedding(24, 9)\n",
" (12): Embedding(9, 5)\n",
" (13): Embedding(13, 7)\n",
" (14): Embedding(53, 15)\n",
" (15): Embedding(22, 9)\n",
" (16): Embedding(7, 5)\n",
" (17): Embedding(7, 5)\n",
" (18): Embedding(4, 3)\n",
" (19): Embedding(4, 3)\n",
" (20): Embedding(9, 5)\n",
" (21): Embedding(9, 5)\n",
" (22): Embedding(3, 3)\n",
" (23): Embedding(3, 3)\n",
" )\n",
" (emb_drop): Dropout(p=0.04)\n",
" (bn_cont): BatchNorm1d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers): Sequential(\n",
" (0): Linear(in_features=233, out_features=1000, bias=True)\n",
" (1): ReLU(inplace)\n",
" (2): BatchNorm1d(1000, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (3): Dropout(p=0.001)\n",
" (4): Linear(in_features=1000, out_features=500, bias=True)\n",
" (5): ReLU(inplace)\n",
" (6): BatchNorm1d(500, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (7): Dropout(p=0.01)\n",
" (8): Linear(in_features=500, out_features=1, bias=True)\n",
" )\n",
"), opt_func=functools.partial(, betas=(0.9, 0.99)), loss_func=, metrics=[], true_wd=True, bn_wd=True, wd=0.01, train_bn=True, path=PosixPath('data/rossmann'), model_dir='models', callback_fns=[], callbacks=[], layer_groups=[Sequential(\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(26, 10)\n",
" (7): Embedding(27, 10)\n",
" (8): Embedding(5, 4)\n",
" (9): Embedding(4, 3)\n",
" (10): Embedding(4, 3)\n",
" (11): Embedding(24, 9)\n",
" (12): Embedding(9, 5)\n",
" (13): Embedding(13, 7)\n",
" (14): Embedding(53, 15)\n",
" (15): Embedding(22, 9)\n",
" (16): Embedding(7, 5)\n",
" (17): Embedding(7, 5)\n",
" (18): Embedding(4, 3)\n",
" (19): Embedding(4, 3)\n",
" (20): Embedding(9, 5)\n",
" (21): Embedding(9, 5)\n",
" (22): Embedding(3, 3)\n",
" (23): Embedding(3, 3)\n",
" (24): Dropout(p=0.04)\n",
" (25): BatchNorm1d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (26): Linear(in_features=233, out_features=1000, bias=True)\n",
" (27): ReLU(inplace)\n",
" (28): BatchNorm1d(1000, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (29): Dropout(p=0.001)\n",
" (30): Linear(in_features=1000, out_features=500, bias=True)\n",
" (31): BatchNorm1d(500, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
" (32): Dropout(p=0.01)\n",
" (33): Linear(in_features=500, out_features=1, bias=True)\n",
")])"
]
},
"execution_count": 132,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.load('1')"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 12:34 \n",
" \n",
" epoch | \n",
" train_loss | \n",
" valid_loss | \n",
" exp_rmspe | \n",
"
\n",
" \n",
" 1 | \n",
" 0.012550 | \n",
" 0.012367 | \n",
" 0.106852 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.012358 | \n",
" 0.021246 | \n",
" 0.111081 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.011525 | \n",
" 0.014918 | \n",
" 0.111002 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.009461 | \n",
" 0.017571 | \n",
" 0.111387 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.009007 | \n",
" 0.017285 | \n",
" 0.108684 | \n",
"
\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit_one_cycle(5, 3e-4)"
]
},
{
"cell_type": "code",
"execution_count": 134,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 12:36 \n",
" \n",
" epoch | \n",
" train_loss | \n",
" valid_loss | \n",
" exp_rmspe | \n",
"
\n",
" \n",
" 1 | \n",
" 0.010818 | \n",
" 0.020555 | \n",
" 0.116035 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.011677 | \n",
" 0.015560 | \n",
" 0.112247 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.010527 | \n",
" 0.014982 | \n",
" 0.119206 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.011010 | \n",
" 0.017705 | \n",
" 0.107552 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.009523 | \n",
" 0.015204 | \n",
" 0.112792 | \n",
"
\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit_one_cycle(5, 3e-4)"
]
},
{
"cell_type": "code",
"execution_count": 135,
"metadata": {},
"outputs": [],
"source": [
"learn.save('2')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(10th place in the competition was 0.108)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## fin"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}