%reload_ext autoreload %autoreload 2 from fastai import * from fastai.tabular import * import pyarrow path = Path('data/rossmann/') train_df = pd.read_feather(path/'train_clean') test_df = pd.read_feather(path/'test_clean') train_df.head().T cat_vars = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen', 'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear', 'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw', 'SchoolHoliday_fw', 'SchoolHoliday_bw'] cont_vars = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC', 'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', 'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE', 'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday'] n = len(train_df); n idx = np.random.permutation(range(n))[:2000] idx.sort() small_train_df = train_df.iloc[idx[:1000]] small_test_df = train_df.iloc[idx[1000:]] small_cont_vars = ['CompetitionDistance', 'Mean_Humidity'] small_cat_vars = ['Store', 'DayOfWeek', 'PromoInterval'] small_train_df = small_train_df[small_cat_vars+small_cont_vars + ['Sales']] small_test_df = small_test_df[small_cat_vars+small_cont_vars + ['Sales']] small_train_df.head() small_test_df.head() categorify = Categorify(small_cat_vars, small_cont_vars) categorify(small_train_df) categorify(small_test_df, test=True) small_test_df.head() small_train_df['PromoInterval'].cat.codes[:5] small_test_df['Store'].cat.codes[:5] fill_missing = FillMissing(small_cat_vars, small_cont_vars) fill_missing(small_train_df) fill_missing(small_test_df, test=True) small_train_df[small_train_df['CompetitionDistance_na'] == True] small_test_df[small_test_df['CompetitionDistance_na'] == True] train_df = pd.read_feather(path/'train_clean') procs=[FillMissing, Categorify, Normalize] cat_names = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen', 'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear', 'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw', 'SchoolHoliday_fw', 'SchoolHoliday_bw'] cont_names = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC', 'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', 'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE', 'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday'] dep_var = 'Sales' train_df = pd.read_feather(path/'train_clean') df = train_df[cat_vars+cont_vars+[dep_var, 'Date']].copy() test_df['Date'].min(), test_df['Date'].max() len(test_df) cut = train_df['Date'][(train_df['Date'] == train_df['Date'][len(test_df)])].index.max() cut valid_idx = range(cut) data = (TabularList.from_df(df, path=path, cat_names=cat_names, cont_names=cont_names, procs=procs) .split_by_idx(valid_idx) .label_from_df(cols=dep_var, label_cls=FloatList, log=True) .databunch()) max_log_y = np.log(np.max(train_df['Sales'])) y_range = torch.tensor([0, max_log_y*1.2], device=defaults.device) emb_szs = data.get_emb_szs({}) model = TabularModel(emb_szs, len(cont_vars), 1, [1000,500], [0.001,0.01], emb_drop=0.04, y_range=y_range) model [len(v) for k,v in data.train_ds.classes.items()] len(data.train_ds.cont_names) learn = Learner(data, model) learn.loss_fn = F.mse_loss learn.metrics = [exp_rmspe] learn.lr_find() learn.recorder.plot() learn.fit_one_cycle(5, 1e-3, wd=0.2, pct_start=0.2) learn.fit_one_cycle(5, 1e-3, wd=0.1, pct_start=0.3) with torch.no_grad(): pct_var,cnt = 0.,0 for x,y in learn.data.valid_dl: out = learn.model(*x) cnt += y.size(0) y, out = torch.exp(y), torch.exp(out) pct_var += ((y - out)/y).pow(2).sum() torch.sqrt(pct_var/cnt).item()