├── .gitignore ├── README.md ├── calculate_metric.py ├── extract_csv_files.py ├── images ├── EE_German_States.png └── Karte-Deutschland-Fun-Facts-Deutsch.png ├── models.py ├── plot_distribution.py ├── plot_embeddings.ipynb ├── plot_metric.ipynb ├── prepare_features.py ├── store_states.csv └── train_test_model.py /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints/ 2 | *.pdf 3 | *.pickle 4 | *.pyc 5 | store.csv 6 | test.csv 7 | train.csv -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is the code used in the paper **"[Entity Embeddings of Categorical Variables](http://arxiv.org/abs/1604.06737)"**. If you want to get the original version of the code used for the Kaggle competition, please use [**the Kaggle branch**](https://github.com/entron/entity-embedding-rossmann/tree/kaggle). 2 | 3 | To run the code one needs first download and unzip the `train.csv` and `store.csv` files on [Kaggle](https://www.kaggle.com/c/rossmann-store-sales/data) and put them in this folder. 4 | 5 | If you use [Anaconda](https://docs.conda.io/en/latest/miniconda.html) you can install the dependecies like the following example: 6 | 7 | ``` 8 | conda create --name ee python=3.7 pip 9 | conda activate ee 10 | pip install scikit-learn xgboost tensorflow keras jupyter matplotlib 11 | ``` 12 | Please refer to [Keras](https://github.com/fchollet/keras) for more details regarding how to install keras. 13 | 14 | Next, run the following scripts to extract the csv files and prepare the features: 15 | 16 | ``` 17 | python3 extract_csv_files.py 18 | python3 prepare_features.py 19 | ``` 20 | 21 | To run the models: 22 | 23 | ``` 24 | python3 train_test_model.py 25 | ``` 26 | 27 | You can anaylize the embeddings with [plot_embeddings.ipynb](https://github.com/entron/entity-embedding-rossmann/blob/master/plot_embeddings.ipynb). For example, the following are the learned embeeding of German States printed in 2D and the map of Germany side by side. Considering the algorithm knows nothing about German geography the remarkable resemblance between the two demonstrates the power of the algorithm for abductive reasoning. I expect entity embedding will be a very useful tool to study the relationship of genome, proteins, drugs, diseases and I would love to see its applications in biology and medicine one day. 28 | 29 | Visualizaiton of Entity Embedding of German States in 2D | Map of Germany 30 | :-------------------------:|:-------------------------: 31 | ![EE_German_States](images/EE_German_States.png) | ![Karte-Deutschland-Fun-Facts-Deutsch](images/Karte-Deutschland-Fun-Facts-Deutsch.png) 32 | 33 | -------------------------------------------------------------------------------- /calculate_metric.py: -------------------------------------------------------------------------------- 1 | # Compute the distance between two stores based on the definition in the paper. 2 | 3 | import pickle 4 | import random 5 | import numpy 6 | 7 | f = open('feature_train_data.pickle', 'rb') 8 | (X, y) = pickle.load(f) 9 | 10 | dictlist = [{} for _ in range(1115)] 11 | for feature, sale in zip(X, y): 12 | store = feature[1] 13 | dictlist[store][tuple(feature[2:7])] = sale 14 | 15 | with open("embeddings.pickle", 'rb') as f: 16 | embeddings = pickle.load(f) 17 | store_embeddings = embeddings[0] 18 | 19 | 20 | def distance(store_pairs, dictlist): 21 | '''Distance as defined in the paper''' 22 | absdiffs = [] 23 | a, b = store_pairs 24 | for key in dictlist[a]: 25 | if key in dictlist[b]: 26 | absdiffs.append(abs(dictlist[a][key] - dictlist[b][key])) 27 | return sum(absdiffs) / float(len(absdiffs)) 28 | 29 | 30 | def embed_distance(store_pairs, em): 31 | '''Distance in the embedding space''' 32 | a, b = store_pairs 33 | a_vec = em[a] 34 | b_vec = em[b] 35 | return(numpy.linalg.norm(a_vec - b_vec)) 36 | 37 | # Generate n random store pairs 38 | n = 10000 39 | pairs = set() 40 | while len(pairs) < n: 41 | a, b = random.sample(range(1115), 2) 42 | if a < b: 43 | pairs.add((a, b)) 44 | 45 | 46 | # Calcuate distances 47 | with open('distances.csv', 'w') as f: 48 | for pair in pairs: 49 | d = distance(pair, dictlist) 50 | d_em = embed_distance(pair, store_embeddings) 51 | print(d, d_em, file=f) 52 | -------------------------------------------------------------------------------- /extract_csv_files.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import csv 3 | 4 | 5 | def csv2dicts(csvfile): 6 | data = [] 7 | keys = [] 8 | for row_index, row in enumerate(csvfile): 9 | if row_index == 0: 10 | keys = row 11 | print(row) 12 | continue 13 | # if row_index % 10000 == 0: 14 | # print(row_index) 15 | data.append({key: value for key, value in zip(keys, row)}) 16 | return data 17 | 18 | 19 | def set_nan_as_string(data, replace_str='0'): 20 | for i, x in enumerate(data): 21 | for key, value in x.items(): 22 | if value == '': 23 | x[key] = replace_str 24 | data[i] = x 25 | 26 | 27 | train_data = "train.csv" 28 | store_data = "store.csv" 29 | store_states = 'store_states.csv' 30 | 31 | with open(train_data) as csvfile: 32 | data = csv.reader(csvfile, delimiter=',') 33 | with open('train_data.pickle', 'wb') as f: 34 | data = csv2dicts(data) 35 | data = data[::-1] 36 | pickle.dump(data, f, -1) 37 | print(data[:3]) 38 | 39 | 40 | with open(store_data) as csvfile, open(store_states) as csvfile2: 41 | data = csv.reader(csvfile, delimiter=',') 42 | state_data = csv.reader(csvfile2, delimiter=',') 43 | with open('store_data.pickle', 'wb') as f: 44 | data = csv2dicts(data) 45 | state_data = csv2dicts(state_data) 46 | set_nan_as_string(data) 47 | for index, val in enumerate(data): 48 | state = state_data[index] 49 | val['State'] = state['State'] 50 | data[index] = val 51 | pickle.dump(data, f, -1) 52 | print(data[:2]) 53 | -------------------------------------------------------------------------------- /images/EE_German_States.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/entron/entity-embedding-rossmann/39b137968f75ac065d62f4703a3a42263858a169/images/EE_German_States.png -------------------------------------------------------------------------------- /images/Karte-Deutschland-Fun-Facts-Deutsch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/entron/entity-embedding-rossmann/39b137968f75ac065d62f4703a3a42263858a169/images/Karte-Deutschland-Fun-Facts-Deutsch.png -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | import numpy 2 | numpy.random.seed(123) 3 | from sklearn import linear_model 4 | from sklearn.ensemble import RandomForestRegressor 5 | from sklearn.svm import SVR 6 | from sklearn.preprocessing import StandardScaler 7 | import xgboost as xgb 8 | from sklearn import neighbors 9 | from sklearn.preprocessing import Normalizer 10 | 11 | from keras.models import Sequential 12 | from keras.models import Model as KerasModel 13 | from keras.layers import Input, Dense, Activation, Reshape 14 | from keras.layers import Concatenate 15 | from keras.layers.embeddings import Embedding 16 | from keras.callbacks import ModelCheckpoint 17 | 18 | import pickle 19 | 20 | 21 | def embed_features(X, saved_embeddings_fname): 22 | # f_embeddings = open("embeddings_shuffled.pickle", "rb") 23 | f_embeddings = open(saved_embeddings_fname, "rb") 24 | embeddings = pickle.load(f_embeddings) 25 | 26 | index_embedding_mapping = {1: 0, 2: 1, 4: 2, 5: 3, 6: 4, 7: 5} 27 | X_embedded = [] 28 | 29 | (num_records, num_features) = X.shape 30 | for record in X: 31 | embedded_features = [] 32 | for i, feat in enumerate(record): 33 | feat = int(feat) 34 | if i not in index_embedding_mapping.keys(): 35 | embedded_features += [feat] 36 | else: 37 | embedding_index = index_embedding_mapping[i] 38 | embedded_features += embeddings[embedding_index][feat].tolist() 39 | 40 | X_embedded.append(embedded_features) 41 | 42 | return numpy.array(X_embedded) 43 | 44 | 45 | def split_features(X): 46 | X_list = [] 47 | 48 | store_index = X[..., [1]] 49 | X_list.append(store_index) 50 | 51 | day_of_week = X[..., [2]] 52 | X_list.append(day_of_week) 53 | 54 | promo = X[..., [3]] 55 | X_list.append(promo) 56 | 57 | year = X[..., [4]] 58 | X_list.append(year) 59 | 60 | month = X[..., [5]] 61 | X_list.append(month) 62 | 63 | day = X[..., [6]] 64 | X_list.append(day) 65 | 66 | State = X[..., [7]] 67 | X_list.append(State) 68 | 69 | return X_list 70 | 71 | 72 | class Model(object): 73 | 74 | def evaluate(self, X_val, y_val): 75 | assert(min(y_val) > 0) 76 | guessed_sales = self.guess(X_val) 77 | relative_err = numpy.absolute((y_val - guessed_sales) / y_val) 78 | result = numpy.sum(relative_err) / len(y_val) 79 | return result 80 | 81 | 82 | class LinearModel(Model): 83 | 84 | def __init__(self, X_train, y_train, X_val, y_val): 85 | super().__init__() 86 | self.clf = linear_model.LinearRegression() 87 | self.clf.fit(X_train, numpy.log(y_train)) 88 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 89 | 90 | def guess(self, feature): 91 | return numpy.exp(self.clf.predict(feature)) 92 | 93 | 94 | class RF(Model): 95 | 96 | def __init__(self, X_train, y_train, X_val, y_val): 97 | super().__init__() 98 | self.clf = RandomForestRegressor(n_estimators=200, verbose=True, max_depth=35, min_samples_split=2, 99 | min_samples_leaf=1) 100 | self.clf.fit(X_train, numpy.log(y_train)) 101 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 102 | 103 | def guess(self, feature): 104 | return numpy.exp(self.clf.predict(feature)) 105 | 106 | 107 | class SVM(Model): 108 | 109 | def __init__(self, X_train, y_train, X_val, y_val): 110 | super().__init__() 111 | self.X_train = X_train 112 | self.y_train = y_train 113 | self.__normalize_data() 114 | self.clf = SVR(kernel='linear', degree=3, gamma='auto', coef0=0.0, tol=0.001, 115 | C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1) 116 | 117 | self.clf.fit(self.X_train, numpy.log(self.y_train)) 118 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 119 | 120 | def __normalize_data(self): 121 | self.scaler = StandardScaler() 122 | self.X_train = self.scaler.fit_transform(self.X_train) 123 | 124 | def guess(self, feature): 125 | return numpy.exp(self.clf.predict(feature)) 126 | 127 | 128 | class XGBoost(Model): 129 | 130 | def __init__(self, X_train, y_train, X_val, y_val): 131 | super().__init__() 132 | dtrain = xgb.DMatrix(X_train, label=numpy.log(y_train)) 133 | evallist = [(dtrain, 'train')] 134 | param = {'nthread': -1, 135 | 'max_depth': 7, 136 | 'eta': 0.02, 137 | 'silent': 1, 138 | 'objective': 'reg:linear', 139 | 'colsample_bytree': 0.7, 140 | 'subsample': 0.7} 141 | num_round = 3000 142 | self.bst = xgb.train(param, dtrain, num_round, evallist) 143 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 144 | 145 | def guess(self, feature): 146 | dtest = xgb.DMatrix(feature) 147 | return numpy.exp(self.bst.predict(dtest)) 148 | 149 | 150 | class HistricalMedian(Model): 151 | 152 | def __init__(self, X_train, y_train, X_val, y_val): 153 | super().__init__() 154 | self.history = {} 155 | self.feature_index = [1, 2, 3, 4] 156 | for x, y in zip(X_train, y_train): 157 | key = tuple(x[self.feature_index]) 158 | self.history.setdefault(key, []).append(y) 159 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 160 | 161 | def guess(self, features): 162 | features = numpy.array(features) 163 | features = features[:, self.feature_index] 164 | guessed_sales = [numpy.median(self.history[tuple(feature)]) for feature in features] 165 | return numpy.array(guessed_sales) 166 | 167 | 168 | class KNN(Model): 169 | 170 | def __init__(self, X_train, y_train, X_val, y_val): 171 | super().__init__() 172 | self.normalizer = Normalizer() 173 | self.normalizer.fit(X_train) 174 | self.clf = neighbors.KNeighborsRegressor(n_neighbors=10, weights='distance', p=1) 175 | self.clf.fit(self.normalizer.transform(X_train), numpy.log(y_train)) 176 | print("Result on validation data: ", self.evaluate(self.normalizer.transform(X_val), y_val)) 177 | 178 | def guess(self, feature): 179 | return numpy.exp(self.clf.predict(self.normalizer.transform(feature))) 180 | 181 | 182 | class NN_with_EntityEmbedding(Model): 183 | 184 | def __init__(self, X_train, y_train, X_val, y_val): 185 | super().__init__() 186 | self.epochs = 10 187 | self.checkpointer = ModelCheckpoint(filepath="best_model_weights.hdf5", verbose=1, save_best_only=True) 188 | self.max_log_y = max(numpy.max(numpy.log(y_train)), numpy.max(numpy.log(y_val))) 189 | self.__build_keras_model() 190 | self.fit(X_train, y_train, X_val, y_val) 191 | 192 | def preprocessing(self, X): 193 | X_list = split_features(X) 194 | return X_list 195 | 196 | def __build_keras_model(self): 197 | input_store = Input(shape=(1,)) 198 | output_store = Embedding(1115, 10, name='store_embedding')(input_store) 199 | output_store = Reshape(target_shape=(10,))(output_store) 200 | 201 | input_dow = Input(shape=(1,)) 202 | output_dow = Embedding(7, 6, name='dow_embedding')(input_dow) 203 | output_dow = Reshape(target_shape=(6,))(output_dow) 204 | 205 | input_promo = Input(shape=(1,)) 206 | output_promo = Dense(1)(input_promo) 207 | 208 | input_year = Input(shape=(1,)) 209 | output_year = Embedding(3, 2, name='year_embedding')(input_year) 210 | output_year = Reshape(target_shape=(2,))(output_year) 211 | 212 | input_month = Input(shape=(1,)) 213 | output_month = Embedding(12, 6, name='month_embedding')(input_month) 214 | output_month = Reshape(target_shape=(6,))(output_month) 215 | 216 | input_day = Input(shape=(1,)) 217 | output_day = Embedding(31, 10, name='day_embedding')(input_day) 218 | output_day = Reshape(target_shape=(10,))(output_day) 219 | 220 | input_germanstate = Input(shape=(1,)) 221 | output_germanstate = Embedding(12, 6, name='state_embedding')(input_germanstate) 222 | output_germanstate = Reshape(target_shape=(6,))(output_germanstate) 223 | 224 | input_model = [input_store, input_dow, input_promo, 225 | input_year, input_month, input_day, input_germanstate] 226 | 227 | output_embeddings = [output_store, output_dow, output_promo, 228 | output_year, output_month, output_day, output_germanstate] 229 | 230 | output_model = Concatenate()(output_embeddings) 231 | output_model = Dense(1000, kernel_initializer="uniform")(output_model) 232 | output_model = Activation('relu')(output_model) 233 | output_model = Dense(500, kernel_initializer="uniform")(output_model) 234 | output_model = Activation('relu')(output_model) 235 | output_model = Dense(1)(output_model) 236 | output_model = Activation('sigmoid')(output_model) 237 | 238 | self.model = KerasModel(inputs=input_model, outputs=output_model) 239 | 240 | self.model.compile(loss='mean_absolute_error', optimizer='adam') 241 | 242 | def _val_for_fit(self, val): 243 | val = numpy.log(val) / self.max_log_y 244 | return val 245 | 246 | def _val_for_pred(self, val): 247 | return numpy.exp(val * self.max_log_y) 248 | 249 | def fit(self, X_train, y_train, X_val, y_val): 250 | self.model.fit(self.preprocessing(X_train), self._val_for_fit(y_train), 251 | validation_data=(self.preprocessing(X_val), self._val_for_fit(y_val)), 252 | epochs=self.epochs, batch_size=128, 253 | # callbacks=[self.checkpointer], 254 | ) 255 | # self.model.load_weights('best_model_weights.hdf5') 256 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 257 | 258 | def guess(self, features): 259 | features = self.preprocessing(features) 260 | result = self.model.predict(features).flatten() 261 | return self._val_for_pred(result) 262 | 263 | 264 | class NN(Model): 265 | 266 | def __init__(self, X_train, y_train, X_val, y_val): 267 | super().__init__() 268 | self.epochs = 10 269 | self.checkpointer = ModelCheckpoint(filepath="best_model_weights.hdf5", verbose=1, save_best_only=True) 270 | self.max_log_y = max(numpy.max(numpy.log(y_train)), numpy.max(numpy.log(y_val))) 271 | self.__build_keras_model() 272 | self.fit(X_train, y_train, X_val, y_val) 273 | 274 | def __build_keras_model(self): 275 | self.model = Sequential() 276 | self.model.add(Dense(1000, kernel_initializer="uniform", input_dim=1183)) 277 | self.model.add(Activation('relu')) 278 | self.model.add(Dense(500, kernel_initializer="uniform")) 279 | self.model.add(Activation('relu')) 280 | self.model.add(Dense(1)) 281 | self.model.add(Activation('sigmoid')) 282 | 283 | self.model.compile(loss='mean_absolute_error', optimizer='adam') 284 | 285 | def _val_for_fit(self, val): 286 | val = numpy.log(val) / self.max_log_y 287 | return val 288 | 289 | def _val_for_pred(self, val): 290 | return numpy.exp(val * self.max_log_y) 291 | 292 | def fit(self, X_train, y_train, X_val, y_val): 293 | self.model.fit(X_train, self._val_for_fit(y_train), 294 | validation_data=(X_val, self._val_for_fit(y_val)), 295 | epochs=self.epochs, batch_size=128, 296 | # callbacks=[self.checkpointer], 297 | ) 298 | # self.model.load_weights('best_model_weights.hdf5') 299 | print("Result on validation data: ", self.evaluate(X_val, y_val)) 300 | 301 | def guess(self, features): 302 | result = self.model.predict(features).flatten() 303 | return self._val_for_pred(result) 304 | -------------------------------------------------------------------------------- /plot_distribution.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import numpy 3 | from sklearn.decomposition import PCA 4 | import matplotlib.pyplot as plt 5 | import numpy as np 6 | import matplotlib.cm as cm 7 | from scipy.stats.mstats import normaltest 8 | from scipy.optimize import curve_fit 9 | from sklearn import manifold 10 | import matplotlib 11 | import math 12 | import itertools 13 | 14 | 15 | font = {'family': 'normal', 16 | 'weight': 'bold', 17 | 'size': 18} 18 | 19 | matplotlib.rc('font', **font) 20 | 21 | 22 | def gaus(x, a, x0, sigma): 23 | return a*np.exp(-(x-x0)**2/(2*sigma**2)) 24 | 25 | 26 | def plot_sales_along_axes(X_embedded, X, y, axes): 27 | y_projected = [] 28 | for axis in axes: 29 | nr_categories = 1 30 | colors = cm.rainbow(np.linspace(0, 1, nr_categories)) 31 | for category_index, c in zip(range(nr_categories), colors): 32 | x_projected = [] 33 | y_projected = [] 34 | for record_embedded, record, sales in zip(X_embedded, X, y): 35 | if record[2] == 2 and record[3] == 0 and record[4] == 0 and record[5] == 10: 36 | projected = np.dot(axis, record_embedded) 37 | x_projected.append(projected) 38 | y_projected.append(sales) 39 | 40 | plt.scatter(x_projected, y_projected) 41 | plt.show() 42 | 43 | 44 | def plot_distribution_along_axis(X_embedded, X, axes): 45 | for axis in axes: 46 | nr_categories = 1 47 | colors = cm.rainbow(np.linspace(0, 1, nr_categories)) 48 | for category_index, c in zip(range(nr_categories), colors): 49 | x_projected = [] 50 | for record_embedded, record in zip(X_embedded, X): 51 | if True: 52 | projected = np.dot(axis, record_embedded) 53 | x_projected.append(projected) 54 | 55 | hist, bins = np.histogram(x_projected, bins=50) 56 | width = 0.7 * (bins[1] - bins[0]) 57 | center = (bins[:-1] + bins[1:]) / 2 58 | plt.bar(center, hist, align='center', width=width) 59 | popt, pcov = curve_fit(gaus, center, hist, p0=[1.0, 0.0, 1.0]) 60 | plt.plot(center, gaus(center, *popt), color='red', linewidth=2) 61 | print(normaltest(x_projected)) 62 | plt.show() 63 | 64 | 65 | # same notation as in: https://en.wikipedia.org/wiki/Multivariate_normal_distribution#Multivariate_normality_tests 66 | def mardia_test(sample): 67 | (n, k) = sample.shape 68 | x_bar = np.mean(sample, axis=0) 69 | sigma = np.cov(sample.T) 70 | sigma_inv = np.linalg.inv(sigma) 71 | A = 0.0 72 | for i, j in itertools.product(range(n), range(n)): 73 | x_i = sample[i, :] 74 | x_j = sample[j, :] 75 | A += (np.dot((x_i - x_bar).T, np.dot(sigma_inv, (x_j - x_bar))))**3 76 | A /= (6*n) 77 | 78 | B = 0.0 79 | for i in range(n): 80 | x_i = sample[i, :] 81 | B += (np.dot((x_i - x_bar).T, np.dot(sigma_inv, (x_i - x_bar))))**2 82 | B /= n 83 | B -= k*(k + 2) 84 | B *= math.sqrt(n/(8*k*(k + 2))) 85 | 86 | print("A", A) 87 | print("B", B) 88 | 89 | return (A, B) 90 | 91 | 92 | def plot_surface_slice(X_embedded, X, axis1, axis2): 93 | x1_projected = [] 94 | x2_projected = [] 95 | for record_embedded, record in zip(X_embedded, X): 96 | # if record[1] == 0 and record[4] == 0: 97 | if record[2] == 2 and record[3] == 0 and record[4] == 0 and record[5] == 10: 98 | x1_projected.append(np.dot(record_embedded, axis1)) 99 | x2_projected.append(np.dot(record_embedded, axis2)) 100 | 101 | # print(np.unique(x1_projected)) 102 | plt.scatter(x1_projected, x2_projected) 103 | plt.show() 104 | 105 | 106 | def plot_tsne_embedding(X_embedded, X): 107 | x_store = X_embedded # X_embedded[X[:, 1] == 0] 108 | tsne = manifold.TSNE(n_components=2, init='pca', random_state=0) 109 | Y = tsne.fit_transform(x_store) 110 | plt.scatter(Y[:, 0], Y[:, 1]) 111 | plt.show() 112 | 113 | 114 | def embedd_features(X, feature_index): 115 | # f_embeddings = open("embeddings.pickle", "rb") 116 | f_embeddings = open("embeddings_shuffled.pickle", "rb") 117 | embeddings = pickle.load(f_embeddings) 118 | 119 | index_embedding_mapping = {1: 0, 2: 1, 4: 2, 5: 3, 6: 4, 7: 5} 120 | embedding_index = index_embedding_mapping[feature_index] 121 | X_embedded = [] 122 | 123 | (num_records, num_features) = X.shape 124 | for record in X: 125 | feat = int(record[feature_index]) 126 | embedded_features = embeddings[embedding_index][feat].tolist() 127 | X_embedded.append(embedded_features) 128 | 129 | return numpy.array(X_embedded) 130 | 131 | f = open('feature_train_data.pickle', 'rb') 132 | (X, y) = pickle.load(f) 133 | 134 | X_store_index = numpy.zeros((1115, 8)) 135 | for i in range(1115): 136 | X_store_index[i, 1] = i 137 | 138 | X_dow_index = numpy.zeros((7, 8)) 139 | for i in range(7): 140 | X_dow_index[i, 2] = i 141 | 142 | X_embedded_store = embedd_features(X_store_index, 1) 143 | print(X_embedded_store) 144 | print(X_embedded_store.shape) 145 | 146 | mardia_test(X_embedded_store) 147 | 148 | pca = PCA(n_components=6) 149 | X_pca = pca.fit_transform(X_embedded_store) 150 | print("principal components...") 151 | print(pca.components_) 152 | print("-"*40) 153 | 154 | print(pca.explained_variance_ratio_) 155 | 156 | mardia_test(X_pca[:, 0:2]) 157 | 158 | plot_sales_along_axes(X_embedded_store, X, y, pca.components_[0:2]) 159 | plot_distribution_along_axis(X_embedded_store, X, pca.components_[0:4]) 160 | 161 | random_direction = np.random.rand(X_embedded_store.shape[1]) 162 | random_direction = random_direction / (np.dot(random_direction, random_direction))**0.5 163 | 164 | plot_sales_along_axes(X_embedded_store, X, y, [random_direction]) 165 | -------------------------------------------------------------------------------- /plot_metric.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import numpy\n", 12 | "import matplotlib.pyplot as plt\n", 13 | "%matplotlib inline" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "metadata": { 20 | "collapsed": false 21 | }, 22 | "outputs": [], 23 | "source": [ 24 | "distances = numpy.loadtxt(open(\"distances.csv\",\"r\"),delimiter=\" \")" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 3, 30 | "metadata": { 31 | "collapsed": false 32 | }, 33 | "outputs": [ 34 | { 35 | "data": { 36 | "text/plain": [ 37 | "array([[ 2.33808707e+03, 1.69515000e+00],\n", 38 | " [ 2.20209744e+03, 1.50831000e+00],\n", 39 | " [ 8.55184852e+02, 1.73432000e+00],\n", 40 | " ..., \n", 41 | " [ 4.43946463e+03, 2.08118000e+00],\n", 42 | " [ 2.48838639e+03, 2.00538000e+00],\n", 43 | " [ 2.36236492e+03, 1.53081000e+00]])" 44 | ] 45 | }, 46 | "execution_count": 3, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "distances" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": { 59 | "collapsed": false, 60 | "scrolled": false 61 | }, 62 | "outputs": [ 63 | { 64 | "data": { 65 | "image/png": "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\nhdLS1YTD3669j6HQt9SvvwdHH300p556NNHoXuTmHkJmZh9efPEp+vTpQix2jbvuH4jFrqdPny6b\n9Iw++ugj9tqrLVWq1OfUU89l9erVf72Tx+PxeHY7/tL/MWLECEtL29egjykSPub86m+aot+HOP94\n1OAEU0S9mXrat3Xj2zp/e0NT1P4oU+T/fqZc/D7OX9/IjX/Y+drvd3EDVd3xMwxGuOOPdDEDfZL8\n+O+bovOD/P1xbp+jTPnvmQYXmyLrg8yAw5zfv6rB1S6OIMjvf88d50dLTc13fnkzNRVqYKrrH/Qd\nOCFpHp9ZJJJvFSvWsmi0r2Vk/Nuysyva5MmT197XyZMn2zvvvGPz5883M7OysjK78MJLLSurgmVn\nV7ShQ4dvUp7+1KlTLRarYGp29K1lZBxhxx7b7+87vDwej2cXhp24It+WwN2DDfPUU0/Rr9/NFBfX\nR1r8K8i0Xgw0QBrx8+79IKTFd0fm8w6obe4c5OtfiszxtZDWfSnS4qui6Ps09/t/kDb+EIqK/wTV\nCCgPXOFm9h2KIWiN3AegqnxvoriBgAx3/KDSXwi5BXKQZn+KO/bNbt7XIdP+SpLLHUQiXSgpGe2u\npxWySJwN9EJxB+3cMUBxBHtz553XkJaWRklJCYcffjg1a9bc6L3+O/z3v/9lyJAfKC6+y21ZTEbG\nnqxe/fsWP5fH4/Hs7Gytiny7jHm/R48e5OX9jgrVHIt87iOQsJwNnICEe2UU7PcGSpW7BqXbVUWC\nFyRsK6GgvLORgF+KegeluTFHoJK5VyOf/DWo6M2b7vevgSdINLz5EjgRpREGjXmmu2M9gYL32rlX\nGLkMxqA0v7YoAPBfaNFxO1pALEPfiY/cceZRUjKOSpUqoXTCOsCvwAMo5TALlSd+GTU1PANozNKl\nS1m1qohbb32Ezp2P5umnn9nEu77pZGZmEg4vSNqygIyMzC1+Ho/H4/Hs/GySOeT777+3RK/3pyxR\ncCbdVCQnKGP7qalBTdRUxOZ0UxvZ+w3mOfN5Y1Pa3Bx3zKBU7wp3nKEupa2OKV3P3Pi+lkjRyzX1\npP/MlBa3t9sn1ZQql21KpavtTPKNTO10a7jxFZyZv3eSSX6JJRrudHCm/QoGrdy2Pax8+Zp2zTU3\n2MEHH26tWrVxcw32b2ZK92ti0N+i0dp27rkDLRZrbPCJwXsWi9XY4kV3li1bZjVqNLC0tJMNbrBY\n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\nTkSuQmCC\n", 66 | "text/plain": [ 67 | "" 68 | ] 69 | }, 70 | "metadata": {}, 71 | "output_type": "display_data" 72 | } 73 | ], 74 | "source": [ 75 | "plt.figure(figsize=(8,6))\n", 76 | "plt.xlim([0, 20000])\n", 77 | "plt.xlabel('distance in metric space')\n", 78 | "plt.ylabel('distance in embedding space')\n", 79 | "plt.scatter(distances[:, 0], distances[:, 1])\n", 80 | "plt.savefig('distance.pdf')" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [] 91 | } 92 | ], 93 | "metadata": { 94 | "kernelspec": { 95 | "display_name": "Python 3", 96 | "language": "python", 97 | "name": "python3" 98 | }, 99 | "language_info": { 100 | "codemirror_mode": { 101 | "name": "ipython", 102 | "version": 3 103 | }, 104 | "file_extension": ".py", 105 | "mimetype": "text/x-python", 106 | "name": "python", 107 | "nbconvert_exporter": "python", 108 | "pygments_lexer": "ipython3", 109 | "version": "3.4.3" 110 | } 111 | }, 112 | "nbformat": 4, 113 | "nbformat_minor": 0 114 | } 115 | -------------------------------------------------------------------------------- /prepare_features.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | from datetime import datetime 3 | from sklearn import preprocessing 4 | import numpy as np 5 | import random 6 | random.seed(42) 7 | 8 | with open('train_data.pickle', 'rb') as f: 9 | train_data = pickle.load(f) 10 | num_records = len(train_data) 11 | with open('store_data.pickle', 'rb') as f: 12 | store_data = pickle.load(f) 13 | 14 | 15 | def feature_list(record): 16 | dt = datetime.strptime(record['Date'], '%Y-%m-%d') 17 | store_index = int(record['Store']) 18 | year = dt.year 19 | month = dt.month 20 | day = dt.day 21 | day_of_week = int(record['DayOfWeek']) 22 | try: 23 | store_open = int(record['Open']) 24 | except: 25 | store_open = 1 26 | 27 | promo = int(record['Promo']) 28 | 29 | return [store_open, 30 | store_index, 31 | day_of_week, 32 | promo, 33 | year, 34 | month, 35 | day, 36 | store_data[store_index - 1]['State'] 37 | ] 38 | 39 | 40 | train_data_X = [] 41 | train_data_y = [] 42 | 43 | for record in train_data: 44 | if record['Sales'] != '0' and record['Open'] != '': 45 | fl = feature_list(record) 46 | train_data_X.append(fl) 47 | train_data_y.append(int(record['Sales'])) 48 | print("Number of train datapoints: ", len(train_data_y)) 49 | 50 | print(min(train_data_y), max(train_data_y)) 51 | 52 | full_X = train_data_X 53 | full_X = np.array(full_X) 54 | train_data_X = np.array(train_data_X) 55 | les = [] 56 | for i in range(train_data_X.shape[1]): 57 | le = preprocessing.LabelEncoder() 58 | le.fit(full_X[:, i]) 59 | les.append(le) 60 | train_data_X[:, i] = le.transform(train_data_X[:, i]) 61 | 62 | with open('les.pickle', 'wb') as f: 63 | pickle.dump(les, f, -1) 64 | 65 | train_data_X = train_data_X.astype(int) 66 | train_data_y = np.array(train_data_y) 67 | 68 | with open('feature_train_data.pickle', 'wb') as f: 69 | pickle.dump((train_data_X, train_data_y), f, -1) 70 | print(train_data_X[0], train_data_y[0]) 71 | -------------------------------------------------------------------------------- /store_states.csv: -------------------------------------------------------------------------------- 1 | Store,State 2 | 1,HE 3 | 2,TH 4 | 3,NW 5 | 4,BE 6 | 5,SN 7 | 6,SN 8 | 7,SH 9 | 8,SH 10 | 9,NW 11 | 10,"HB,NI" 12 | 11,SH 13 | 12,SH 14 | 13,BY 15 | 14,NW 16 | 15,SH 17 | 16,BW 18 | 17,TH 19 | 18,TH 20 | 19,NW 21 | 20,BY 22 | 21,BW 23 | 22,BY 24 | 23,RP 25 | 24,NW 26 | 25,NW 27 | 26,TH 28 | 27,NW 29 | 28,ST 30 | 29,NW 31 | 30,NW 32 | 31,SH 33 | 32,BY 34 | 33,NW 35 | 34,BE 36 | 35,NW 37 | 36,BY 38 | 37,ST 39 | 38,NW 40 | 39,NW 41 | 40,NW 42 | 41,BY 43 | 42,NW 44 | 43,NW 45 | 44,BE 46 | 45,RP 47 | 46,BY 48 | 47,HH 49 | 48,HH 50 | 49,BW 51 | 50,RP 52 | 51,BY 53 | 52,BY 54 | 53,SH 55 | 54,ST 56 | 55,SN 57 | 56,HE 58 | 57,SN 59 | 58,BY 60 | 59,TH 61 | 60,SN 62 | 61,BW 63 | 62,NW 64 | 63,SH 65 | 64,NW 66 | 65,ST 67 | 66,BW 68 | 67,BW 69 | 68,SH 70 | 69,HE 71 | 70,"HB,NI" 72 | 71,NW 73 | 72,BY 74 | 73,SH 75 | 74,NW 76 | 75,SH 77 | 76,BY 78 | 77,HE 79 | 78,ST 80 | 79,BW 81 | 80,RP 82 | 81,BY 83 | 82,NW 84 | 83,NW 85 | 84,NW 86 | 85,BE 87 | 86,NW 88 | 87,BE 89 | 88,ST 90 | 89,BY 91 | 90,NW 92 | 91,BW 93 | 92,NW 94 | 93,NW 95 | 94,NW 96 | 95,SN 97 | 96,SN 98 | 97,SN 99 | 98,NW 100 | 99,BY 101 | 100,BY 102 | 101,SH 103 | 102,NW 104 | 103,BE 105 | 104,BE 106 | 105,BW 107 | 106,BE 108 | 107,"HB,NI" 109 | 108,BY 110 | 109,SH 111 | 110,SH 112 | 111,HE 113 | 112,"HB,NI" 114 | 113,BY 115 | 114,TH 116 | 115,BY 117 | 116,BE 118 | 117,NW 119 | 118,SH 120 | 119,SH 121 | 120,HE 122 | 121,SN 123 | 122,SH 124 | 123,ST 125 | 124,NW 126 | 125,BE 127 | 126,NW 128 | 127,BY 129 | 128,HE 130 | 129,BY 131 | 130,HE 132 | 131,NW 133 | 132,BY 134 | 133,TH 135 | 134,BE 136 | 135,HE 137 | 136,BY 138 | 137,BY 139 | 138,SN 140 | 139,BY 141 | 140,HE 142 | 141,BW 143 | 142,NW 144 | 143,RP 145 | 144,BY 146 | 145,BY 147 | 146,NW 148 | 147,NW 149 | 148,BE 150 | 149,BY 151 | 150,SH 152 | 151,ST 153 | 152,NW 154 | 153,NW 155 | 154,HE 156 | 155,BY 157 | 156,TH 158 | 157,NW 159 | 158,RP 160 | 159,BY 161 | 160,HE 162 | 161,NW 163 | 162,HE 164 | 163,BE 165 | 164,BY 166 | 165,BY 167 | 166,NW 168 | 167,ST 169 | 168,BW 170 | 169,NW 171 | 170,NW 172 | 171,NW 173 | 172,BY 174 | 173,BE 175 | 174,BY 176 | 175,HH 177 | 176,NW 178 | 177,ST 179 | 178,SN 180 | 179,NW 181 | 180,HH 182 | 181,BY 183 | 182,HE 184 | 183,BY 185 | 184,NW 186 | 185,BE 187 | 186,BY 188 | 187,SH 189 | 188,RP 190 | 189,RP 191 | 190,BY 192 | 191,BY 193 | 192,BY 194 | 193,BW 195 | 194,BW 196 | 195,NW 197 | 196,TH 198 | 197,HH 199 | 198,TH 200 | 199,RP 201 | 200,NW 202 | 201,NW 203 | 202,HE 204 | 203,ST 205 | 204,BY 206 | 205,BE 207 | 206,NW 208 | 207,SH 209 | 208,BE 210 | 209,SH 211 | 210,RP 212 | 211,BE 213 | 212,SH 214 | 213,NW 215 | 214,NW 216 | 215,BY 217 | 216,NW 218 | 217,HH 219 | 218,BY 220 | 219,NW 221 | 220,NW 222 | 221,SH 223 | 222,BE 224 | 223,TH 225 | 224,BW 226 | 225,ST 227 | 226,HE 228 | 227,NW 229 | 228,NW 230 | 229,RP 231 | 230,SH 232 | 231,BY 233 | 232,ST 234 | 233,HE 235 | 234,NW 236 | 235,HE 237 | 236,BE 238 | 237,BE 239 | 238,NW 240 | 239,NW 241 | 240,BE 242 | 241,NW 243 | 242,HE 244 | 243,BY 245 | 244,NW 246 | 245,HE 247 | 246,HH 248 | 247,HE 249 | 248,SH 250 | 249,SH 251 | 250,HE 252 | 251,NW 253 | 252,NW 254 | 253,NW 255 | 254,RP 256 | 255,NW 257 | 256,NW 258 | 257,BE 259 | 258,BY 260 | 259,HE 261 | 260,BE 262 | 261,TH 263 | 262,HH 264 | 263,BY 265 | 264,BE 266 | 265,RP 267 | 266,SN 268 | 267,SH 269 | 268,"HB,NI" 270 | 269,NW 271 | 270,BE 272 | 271,SN 273 | 272,HE 274 | 273,NW 275 | 274,HE 276 | 275,BY 277 | 276,SN 278 | 277,BY 279 | 278,SH 280 | 279,BY 281 | 280,BW 282 | 281,SH 283 | 282,BE 284 | 283,BY 285 | 284,BY 286 | 285,HE 287 | 286,TH 288 | 287,BY 289 | 288,BY 290 | 289,HE 291 | 290,NW 292 | 291,SN 293 | 292,BE 294 | 293,BE 295 | 294,HE 296 | 295,BW 297 | 296,HE 298 | 297,BW 299 | 298,BY 300 | 299,SH 301 | 300,HE 302 | 301,SH 303 | 302,HE 304 | 303,NW 305 | 304,"HB,NI" 306 | 305,HE 307 | 306,BY 308 | 307,TH 309 | 308,NW 310 | 309,NW 311 | 310,SH 312 | 311,HE 313 | 312,HE 314 | 313,TH 315 | 314,NW 316 | 315,SH 317 | 316,NW 318 | 317,BY 319 | 318,SN 320 | 319,SH 321 | 320,SH 322 | 321,SN 323 | 322,TH 324 | 323,RP 325 | 324,ST 326 | 325,NW 327 | 326,RP 328 | 327,ST 329 | 328,NW 330 | 329,NW 331 | 330,NW 332 | 331,RP 333 | 332,ST 334 | 333,HH 335 | 334,NW 336 | 335,NW 337 | 336,HE 338 | 337,HE 339 | 338,HE 340 | 339,RP 341 | 340,SH 342 | 341,NW 343 | 342,BY 344 | 343,NW 345 | 344,HH 346 | 345,BY 347 | 346,NW 348 | 347,BW 349 | 348,BY 350 | 349,BE 351 | 350,HE 352 | 351,NW 353 | 352,SH 354 | 353,BW 355 | 354,NW 356 | 355,SH 357 | 356,BW 358 | 357,SN 359 | 358,NW 360 | 359,RP 361 | 360,BE 362 | 361,ST 363 | 362,HE 364 | 363,BE 365 | 364,RP 366 | 365,BY 367 | 366,ST 368 | 367,SH 369 | 368,BW 370 | 369,HE 371 | 370,NW 372 | 371,HE 373 | 372,NW 374 | 373,BW 375 | 374,BE 376 | 375,ST 377 | 376,BE 378 | 377,SH 379 | 378,NW 380 | 379,"HB,NI" 381 | 380,NW 382 | 381,ST 383 | 382,ST 384 | 383,HE 385 | 384,TH 386 | 385,BY 387 | 386,NW 388 | 387,NW 389 | 388,NW 390 | 389,HH 391 | 390,BE 392 | 391,NW 393 | 392,NW 394 | 393,NW 395 | 394,HE 396 | 395,NW 397 | 396,ST 398 | 397,NW 399 | 398,SH 400 | 399,BY 401 | 400,TH 402 | 401,SN 403 | 402,ST 404 | 403,NW 405 | 404,BW 406 | 405,NW 407 | 406,RP 408 | 407,BY 409 | 408,BW 410 | 409,HE 411 | 410,NW 412 | 411,HE 413 | 412,BY 414 | 413,BY 415 | 414,HE 416 | 415,RP 417 | 416,HH 418 | 417,NW 419 | 418,NW 420 | 419,BE 421 | 420,BY 422 | 421,SH 423 | 422,SH 424 | 423,BE 425 | 424,NW 426 | 425,NW 427 | 426,NW 428 | 427,BY 429 | 428,BY 430 | 429,BY 431 | 430,BY 432 | 431,NW 433 | 432,HH 434 | 433,SH 435 | 434,BY 436 | 435,NW 437 | 436,SN 438 | 437,SN 439 | 438,SN 440 | 439,BE 441 | 440,BW 442 | 441,NW 443 | 442,BW 444 | 443,SN 445 | 444,SN 446 | 445,NW 447 | 446,NW 448 | 447,SH 449 | 448,NW 450 | 449,HE 451 | 450,BW 452 | 451,HE 453 | 452,SH 454 | 453,SH 455 | 454,ST 456 | 455,BW 457 | 456,NW 458 | 457,BY 459 | 458,HE 460 | 459,SH 461 | 460,ST 462 | 461,BW 463 | 462,ST 464 | 463,NW 465 | 464,BE 466 | 465,HE 467 | 466,NW 468 | 467,NW 469 | 468,SH 470 | 469,BE 471 | 470,NW 472 | 471,BY 473 | 472,HH 474 | 473,NW 475 | 474,TH 476 | 475,NW 477 | 476,SN 478 | 477,BY 479 | 478,BE 480 | 479,ST 481 | 480,BE 482 | 481,HE 483 | 482,ST 484 | 483,ST 485 | 484,SH 486 | 485,BY 487 | 486,NW 488 | 487,SH 489 | 488,SH 490 | 489,ST 491 | 490,BY 492 | 491,BW 493 | 492,BY 494 | 493,NW 495 | 494,BE 496 | 495,BW 497 | 496,BE 498 | 497,HE 499 | 498,BY 500 | 499,BW 501 | 500,BY 502 | 501,BY 503 | 502,HE 504 | 503,ST 505 | 504,"HB,NI" 506 | 505,BW 507 | 506,NW 508 | 507,NW 509 | 508,NW 510 | 509,HE 511 | 510,NW 512 | 511,"HB,NI" 513 | 512,BY 514 | 513,BE 515 | 514,BY 516 | 515,NW 517 | 516,NW 518 | 517,HE 519 | 518,BY 520 | 519,SH 521 | 520,SH 522 | 521,RP 523 | 522,BY 524 | 523,BE 525 | 524,SH 526 | 525,BE 527 | 526,TH 528 | 527,NW 529 | 528,NW 530 | 529,SH 531 | 530,SH 532 | 531,HH 533 | 532,NW 534 | 533,BW 535 | 534,BY 536 | 535,NW 537 | 536,NW 538 | 537,BW 539 | 538,SH 540 | 539,BY 541 | 540,BY 542 | 541,NW 543 | 542,BY 544 | 543,HE 545 | 544,SN 546 | 545,NW 547 | 546,BE 548 | 547,BY 549 | 548,HE 550 | 549,HH 551 | 550,HE 552 | 551,SH 553 | 552,HE 554 | 553,BW 555 | 554,HH 556 | 555,BY 557 | 556,BE 558 | 557,NW 559 | 558,HH 560 | 559,ST 561 | 560,BE 562 | 561,NW 563 | 562,"HB,NI" 564 | 563,NW 565 | 564,NW 566 | 565,NW 567 | 566,HH 568 | 567,NW 569 | 568,HE 570 | 569,BE 571 | 570,NW 572 | 571,BY 573 | 572,NW 574 | 573,BY 575 | 574,BW 576 | 575,BY 577 | 576,BE 578 | 577,SH 579 | 578,SH 580 | 579,NW 581 | 580,SH 582 | 581,RP 583 | 582,HE 584 | 583,ST 585 | 584,HE 586 | 585,SH 587 | 586,NW 588 | 587,BY 589 | 588,SH 590 | 589,HE 591 | 590,BW 592 | 591,BW 593 | 592,NW 594 | 593,SH 595 | 594,BE 596 | 595,BE 597 | 596,BE 598 | 597,RP 599 | 598,BY 600 | 599,BE 601 | 600,SH 602 | 601,HE 603 | 602,HE 604 | 603,BW 605 | 604,BY 606 | 605,BW 607 | 606,BE 608 | 607,TH 609 | 608,ST 610 | 609,BE 611 | 610,NW 612 | 611,BY 613 | 612,BY 614 | 613,TH 615 | 614,SN 616 | 615,HE 617 | 616,NW 618 | 617,SN 619 | 618,HE 620 | 619,BY 621 | 620,BY 622 | 621,NW 623 | 622,SH 624 | 623,NW 625 | 624,NW 626 | 625,NW 627 | 626,SN 628 | 627,HE 629 | 628,"HB,NI" 630 | 629,BY 631 | 630,TH 632 | 631,SH 633 | 632,HH 634 | 633,BY 635 | 634,SN 636 | 635,ST 637 | 636,BY 638 | 637,BY 639 | 638,BY 640 | 639,NW 641 | 640,NW 642 | 641,NW 643 | 642,NW 644 | 643,SH 645 | 644,BY 646 | 645,BW 647 | 646,BY 648 | 647,SH 649 | 648,BE 650 | 649,ST 651 | 650,BY 652 | 651,NW 653 | 652,TH 654 | 653,NW 655 | 654,SN 656 | 655,NW 657 | 656,HE 658 | 657,NW 659 | 658,NW 660 | 659,HE 661 | 660,BY 662 | 661,HE 663 | 662,"HB,NI" 664 | 663,BW 665 | 664,ST 666 | 665,HE 667 | 666,BW 668 | 667,SH 669 | 668,BE 670 | 669,BY 671 | 670,BY 672 | 671,BY 673 | 672,SN 674 | 673,BW 675 | 674,NW 676 | 675,NW 677 | 676,HE 678 | 677,BY 679 | 678,NW 680 | 679,BE 681 | 680,SH 682 | 681,RP 683 | 682,BE 684 | 683,BE 685 | 684,BY 686 | 685,NW 687 | 686,SN 688 | 687,NW 689 | 688,ST 690 | 689,HE 691 | 690,NW 692 | 691,NW 693 | 692,NW 694 | 693,HE 695 | 694,BY 696 | 695,NW 697 | 696,HH 698 | 697,NW 699 | 698,BE 700 | 699,HE 701 | 700,HE 702 | 701,BY 703 | 702,BY 704 | 703,NW 705 | 704,BE 706 | 705,NW 707 | 706,BY 708 | 707,NW 709 | 708,SN 710 | 709,BE 711 | 710,BY 712 | 711,BY 713 | 712,BY 714 | 713,NW 715 | 714,BW 716 | 715,ST 717 | 716,BY 718 | 717,NW 719 | 718,HE 720 | 719,BY 721 | 720,SH 722 | 721,SH 723 | 722,"HB,NI" 724 | 723,HE 725 | 724,NW 726 | 725,SH 727 | 726,SN 728 | 727,HE 729 | 728,BW 730 | 729,NW 731 | 730,BE 732 | 731,NW 733 | 732,SH 734 | 733,NW 735 | 734,NW 736 | 735,ST 737 | 736,BY 738 | 737,NW 739 | 738,NW 740 | 739,BY 741 | 740,HE 742 | 741,"HB,NI" 743 | 742,NW 744 | 743,SN 745 | 744,BY 746 | 745,SN 747 | 746,HE 748 | 747,ST 749 | 748,NW 750 | 749,RP 751 | 750,BY 752 | 751,NW 753 | 752,NW 754 | 753,NW 755 | 754,TH 756 | 755,TH 757 | 756,NW 758 | 757,BW 759 | 758,BW 760 | 759,NW 761 | 760,BE 762 | 761,BE 763 | 762,BW 764 | 763,SH 765 | 764,RP 766 | 765,BW 767 | 766,BY 768 | 767,SH 769 | 768,SH 770 | 769,NW 771 | 770,NW 772 | 771,BY 773 | 772,HH 774 | 773,HE 775 | 774,SH 776 | 775,BY 777 | 776,NW 778 | 777,BW 779 | 778,BY 780 | 779,SN 781 | 780,SN 782 | 781,ST 783 | 782,RP 784 | 783,TH 785 | 784,NW 786 | 785,NW 787 | 786,ST 788 | 787,SN 789 | 788,BE 790 | 789,BW 791 | 790,HE 792 | 791,NW 793 | 792,NW 794 | 793,NW 795 | 794,SN 796 | 795,NW 797 | 796,NW 798 | 797,BY 799 | 798,SN 800 | 799,NW 801 | 800,RP 802 | 801,SH 803 | 802,SH 804 | 803,HE 805 | 804,BY 806 | 805,BY 807 | 806,BY 808 | 807,HE 809 | 808,SN 810 | 809,NW 811 | 810,RP 812 | 811,SH 813 | 812,SN 814 | 813,BW 815 | 814,TH 816 | 815,BY 817 | 816,NW 818 | 817,BE 819 | 818,HE 820 | 819,SH 821 | 820,BY 822 | 821,BE 823 | 822,SH 824 | 823,SH 825 | 824,SH 826 | 825,BY 827 | 826,NW 828 | 827,BE 829 | 828,ST 830 | 829,HE 831 | 830,SN 832 | 831,NW 833 | 832,HE 834 | 833,RP 835 | 834,BE 836 | 835,NW 837 | 836,SN 838 | 837,HE 839 | 838,TH 840 | 839,BE 841 | 840,"HB,NI" 842 | 841,SN 843 | 842,BY 844 | 843,BE 845 | 844,NW 846 | 845,NW 847 | 846,NW 848 | 847,NW 849 | 848,BW 850 | 849,"HB,NI" 851 | 850,NW 852 | 851,BY 853 | 852,HE 854 | 853,BW 855 | 854,SN 856 | 855,BW 857 | 856,HH 858 | 857,HE 859 | 858,BY 860 | 859,BY 861 | 860,HH 862 | 861,RP 863 | 862,SH 864 | 863,SH 865 | 864,BW 866 | 865,NW 867 | 866,HE 868 | 867,SH 869 | 868,HE 870 | 869,SN 871 | 870,BE 872 | 871,HE 873 | 872,NW 874 | 873,SN 875 | 874,"HB,NI" 876 | 875,RP 877 | 876,ST 878 | 877,SH 879 | 878,ST 880 | 879,BY 881 | 880,BW 882 | 881,NW 883 | 882,NW 884 | 883,NW 885 | 884,BY 886 | 885,NW 887 | 886,NW 888 | 887,HE 889 | 888,SH 890 | 889,ST 891 | 890,BY 892 | 891,NW 893 | 892,SN 894 | 893,BY 895 | 894,NW 896 | 895,BW 897 | 896,SH 898 | 897,RP 899 | 898,TH 900 | 899,SN 901 | 900,BY 902 | 901,SH 903 | 902,BY 904 | 903,BY 905 | 904,BY 906 | 905,NW 907 | 906,HE 908 | 907,NW 909 | 908,HE 910 | 909,BY 911 | 910,ST 912 | 911,SH 913 | 912,SH 914 | 913,RP 915 | 914,SH 916 | 915,BY 917 | 916,NW 918 | 917,NW 919 | 918,SN 920 | 919,BY 921 | 920,BY 922 | 921,SN 923 | 922,NW 924 | 923,BE 925 | 924,NW 926 | 925,BW 927 | 926,NW 928 | 927,NW 929 | 928,NW 930 | 929,SH 931 | 930,NW 932 | 931,SH 933 | 932,BY 934 | 933,SN 935 | 934,NW 936 | 935,SH 937 | 936,NW 938 | 937,HE 939 | 938,"HB,NI" 940 | 939,NW 941 | 940,SN 942 | 941,BY 943 | 942,HE 944 | 943,NW 945 | 944,"HB,NI" 946 | 945,SH 947 | 946,RP 948 | 947,BW 949 | 948,BW 950 | 949,BE 951 | 950,BW 952 | 951,NW 953 | 952,BY 954 | 953,TH 955 | 954,NW 956 | 955,NW 957 | 956,NW 958 | 957,BE 959 | 958,BE 960 | 959,BE 961 | 960,HE 962 | 961,NW 963 | 962,NW 964 | 963,SN 965 | 964,BW 966 | 965,HE 967 | 966,NW 968 | 967,NW 969 | 968,SN 970 | 969,BW 971 | 970,HE 972 | 971,TH 973 | 972,ST 974 | 973,NW 975 | 974,BY 976 | 975,NW 977 | 976,NW 978 | 977,BY 979 | 978,SN 980 | 979,TH 981 | 980,NW 982 | 981,ST 983 | 982,SN 984 | 983,NW 985 | 984,NW 986 | 985,BW 987 | 986,NW 988 | 987,BE 989 | 988,SH 990 | 989,BY 991 | 990,SN 992 | 991,NW 993 | 992,NW 994 | 993,SN 995 | 994,NW 996 | 995,SN 997 | 996,SN 998 | 997,HE 999 | 998,BW 1000 | 999,SN 1001 | 1000,BY 1002 | 1001,TH 1003 | 1002,BE 1004 | 1003,NW 1005 | 1004,BY 1006 | 1005,NW 1007 | 1006,ST 1008 | 1007,SH 1009 | 1008,HH 1010 | 1009,BY 1011 | 1010,SH 1012 | 1011,NW 1013 | 1012,BY 1014 | 1013,NW 1015 | 1014,NW 1016 | 1015,RP 1017 | 1016,NW 1018 | 1017,SN 1019 | 1018,BE 1020 | 1019,BY 1021 | 1020,HE 1022 | 1021,BE 1023 | 1022,NW 1024 | 1023,SN 1025 | 1024,SH 1026 | 1025,RP 1027 | 1026,NW 1028 | 1027,BY 1029 | 1028,NW 1030 | 1029,ST 1031 | 1030,ST 1032 | 1031,NW 1033 | 1032,ST 1034 | 1033,BE 1035 | 1034,SN 1036 | 1035,SN 1037 | 1036,NW 1038 | 1037,NW 1039 | 1038,BY 1040 | 1039,NW 1041 | 1040,NW 1042 | 1041,BY 1043 | 1042,NW 1044 | 1043,ST 1045 | 1044,BW 1046 | 1045,SH 1047 | 1046,ST 1048 | 1047,NW 1049 | 1048,SH 1050 | 1049,BY 1051 | 1050,HE 1052 | 1051,BW 1053 | 1052,NW 1054 | 1053,"HB,NI" 1055 | 1054,SH 1056 | 1055,BE 1057 | 1056,BY 1058 | 1057,SH 1059 | 1058,NW 1060 | 1059,HH 1061 | 1060,NW 1062 | 1061,BW 1063 | 1062,RP 1064 | 1063,HH 1065 | 1064,NW 1066 | 1065,BY 1067 | 1066,NW 1068 | 1067,BY 1069 | 1068,BW 1070 | 1069,TH 1071 | 1070,"HB,NI" 1072 | 1071,SH 1073 | 1072,NW 1074 | 1073,NW 1075 | 1074,SN 1076 | 1075,BE 1077 | 1076,NW 1078 | 1077,NW 1079 | 1078,BW 1080 | 1079,HE 1081 | 1080,BY 1082 | 1081,BE 1083 | 1082,SN 1084 | 1083,HE 1085 | 1084,HE 1086 | 1085,BE 1087 | 1086,HE 1088 | 1087,"HB,NI" 1089 | 1088,NW 1090 | 1089,NW 1091 | 1090,SN 1092 | 1091,SH 1093 | 1092,BY 1094 | 1093,SN 1095 | 1094,BY 1096 | 1095,TH 1097 | 1096,NW 1098 | 1097,RP 1099 | 1098,SN 1100 | 1099,SH 1101 | 1100,NW 1102 | 1101,SH 1103 | 1102,BY 1104 | 1103,HE 1105 | 1104,BY 1106 | 1105,NW 1107 | 1106,SH 1108 | 1107,BY 1109 | 1108,SN 1110 | 1109,BY 1111 | 1110,BE 1112 | 1111,NW 1113 | 1112,NW 1114 | 1113,SH 1115 | 1114,HH 1116 | 1115,HE 1117 | -------------------------------------------------------------------------------- /train_test_model.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import numpy 3 | numpy.random.seed(123) 4 | from models import * 5 | from sklearn.preprocessing import OneHotEncoder 6 | import sys 7 | sys.setrecursionlimit(10000) 8 | 9 | train_ratio = 0.9 10 | shuffle_data = False 11 | one_hot_as_input = False 12 | embeddings_as_input = False 13 | save_embeddings = True 14 | saved_embeddings_fname = "embeddings.pickle" # set save_embeddings to True to create this file 15 | 16 | f = open('feature_train_data.pickle', 'rb') 17 | (X, y) = pickle.load(f) 18 | 19 | num_records = len(X) 20 | train_size = int(train_ratio * num_records) 21 | 22 | if shuffle_data: 23 | print("Using shuffled data") 24 | sh = numpy.arange(X.shape[0]) 25 | numpy.random.shuffle(sh) 26 | X = X[sh] 27 | y = y[sh] 28 | 29 | if embeddings_as_input: 30 | print("Using learned embeddings as input") 31 | X = embed_features(X, saved_embeddings_fname) 32 | 33 | if one_hot_as_input: 34 | print("Using one-hot encoding as input") 35 | enc = OneHotEncoder(sparse=False) 36 | enc.fit(X) 37 | X = enc.transform(X) 38 | 39 | X_train = X[:train_size] 40 | X_val = X[train_size:] 41 | y_train = y[:train_size] 42 | y_val = y[train_size:] 43 | 44 | 45 | def sample(X, y, n): 46 | '''random samples''' 47 | num_row = X.shape[0] 48 | indices = numpy.random.randint(num_row, size=n) 49 | return X[indices, :], y[indices] 50 | 51 | 52 | X_train, y_train = sample(X_train, y_train, 200000) # Simulate data sparsity 53 | print("Number of samples used for training: " + str(y_train.shape[0])) 54 | 55 | models = [] 56 | 57 | print("Fitting NN_with_EntityEmbedding...") 58 | for i in range(5): 59 | models.append(NN_with_EntityEmbedding(X_train, y_train, X_val, y_val)) 60 | 61 | # print("Fitting NN...") 62 | # for i in range(5): 63 | # models.append(NN(X_train, y_train, X_val, y_val)) 64 | 65 | # print("Fitting RF...") 66 | # models.append(RF(X_train, y_train, X_val, y_val)) 67 | 68 | # print("Fitting KNN...") 69 | # models.append(KNN(X_train, y_train, X_val, y_val)) 70 | 71 | # print("Fitting XGBoost...") 72 | # models.append(XGBoost(X_train, y_train, X_val, y_val)) 73 | 74 | 75 | if save_embeddings: 76 | model = models[0].model 77 | store_embedding = model.get_layer('store_embedding').get_weights()[0] 78 | dow_embedding = model.get_layer('dow_embedding').get_weights()[0] 79 | year_embedding = model.get_layer('year_embedding').get_weights()[0] 80 | month_embedding = model.get_layer('month_embedding').get_weights()[0] 81 | day_embedding = model.get_layer('day_embedding').get_weights()[0] 82 | german_states_embedding = model.get_layer('state_embedding').get_weights()[0] 83 | with open(saved_embeddings_fname, 'wb') as f: 84 | pickle.dump([store_embedding, dow_embedding, year_embedding, 85 | month_embedding, day_embedding, german_states_embedding], f, -1) 86 | 87 | 88 | def evaluate_models(models, X, y): 89 | assert(min(y) > 0) 90 | guessed_sales = numpy.array([model.guess(X) for model in models]) 91 | mean_sales = guessed_sales.mean(axis=0) 92 | relative_err = numpy.absolute((y - mean_sales) / y) 93 | result = numpy.sum(relative_err) / len(y) 94 | return result 95 | 96 | 97 | print("Evaluate combined models...") 98 | print("Training error...") 99 | r_train = evaluate_models(models, X_train, y_train) 100 | print(r_train) 101 | 102 | print("Validation error...") 103 | r_val = evaluate_models(models, X_val, y_val) 104 | print(r_val) 105 | --------------------------------------------------------------------------------