{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"packages = [\n    '../input/indoor-locationnavigation-2021/indoor-location-competition-20-master/indoor-location-competition-20-master'\n]\nimport sys\nfor pth in packages:\n    sys.path.append(pth)","metadata":{"papermill":{"duration":0.023803,"end_time":"2021-03-13T07:36:54.843585","exception":false,"start_time":"2021-03-13T07:36:54.819782","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from io_f import read_data_file ","metadata":{"papermill":{"duration":0.045575,"end_time":"2021-03-13T07:36:54.903963","exception":false,"start_time":"2021-03-13T07:36:54.858388","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def all_files(f_list,directory):\n    for info in walk(directory):\n        dirpath,dirnames,filenames =  info\n        for fname in filenames:\n            f_list.append(dirpath+'/'+fname)\n        for dname in dirnames:\n            all_files(f_list,dirpath+'/'+dname)\n        return f_list\n        ","metadata":{"papermill":{"duration":0.021674,"end_time":"2021-03-13T07:36:54.94047","exception":false,"start_time":"2021-03-13T07:36:54.918796","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os","metadata":{"papermill":{"duration":0.020807,"end_time":"2021-03-13T07:36:54.976005","exception":false,"start_time":"2021-03-13T07:36:54.955198","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_parquet('../input/indoor-prediction-data-manager/train_data.parquet')\ntest = pd.read_parquet('../input/indoor-prediction-data-manager/test_data.parquet')","metadata":{"papermill":{"duration":2.751876,"end_time":"2021-03-13T07:36:57.74245","exception":false,"start_time":"2021-03-13T07:36:54.990574","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_bssid = pd.read_csv('../input/indoor-prediction-data-manager/unique_bssid.csv') ","metadata":{"papermill":{"duration":0.170063,"end_time":"2021-03-13T07:36:57.928563","exception":false,"start_time":"2021-03-13T07:36:57.7585","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.x = train.x.astype('float')\ntrain.y = train.y.astype('float')\ntrain.f = train.f.astype('int')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.td = train.td.astype('int')\ntrain = train[train.td<2000]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bssids = {}\nfor i,val in enumerate(unique_bssid['0'].to_numpy()):\n    bssids[val] = i","metadata":{"papermill":{"duration":0.041873,"end_time":"2021-03-13T07:36:57.987475","exception":false,"start_time":"2021-03-13T07:36:57.945602","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv('../input/indoor-location-navigation/sample_submission.csv')","metadata":{"papermill":{"duration":0.045082,"end_time":"2021-03-13T07:36:58.047188","exception":false,"start_time":"2021-03-13T07:36:58.002106","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tf-models-official","metadata":{"papermill":{"duration":22.362442,"end_time":"2021-03-13T07:37:20.425836","exception":false,"start_time":"2021-03-13T07:36:58.063394","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom sklearn.model_selection import GroupKFold,KFold\nimport numpy as np\nfrom time import time\nfrom contextlib import contextmanager\nfrom psutil import virtual_memory, Process","metadata":{"papermill":{"duration":5.818403,"end_time":"2021-03-13T07:37:26.275644","exception":false,"start_time":"2021-03-13T07:37:20.457241","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from official.nlp.transformer import model_utils\nfrom official.nlp.transformer import transformer","metadata":{"papermill":{"duration":1.05465,"end_time":"2021-03-13T07:37:27.360058","exception":false,"start_time":"2021-03-13T07:37:26.305408","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\nfrom tqdm.notebook import tqdm","metadata":{"papermill":{"duration":0.037397,"end_time":"2021-03-13T07:37:27.426873","exception":false,"start_time":"2021-03-13T07:37:27.389476","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mpe_error(pred,tar):\n    xy = np.sqrt(np.square(pred[:,0]-tar[:,0])+np.square(pred[:,1]-tar[:,1]))\n    f = 15*np.abs(pred[:,2]-tar[:,2])\n    return (xy+f).mean()\n\ndef mpe_loss(tar,pred):\n    tar = tf.expand_dims(tar,1)\n    xy = tf.sqrt(tf.square(pred[:,:,0]-tar[:,:,0])+tf.square(pred[:,:,1]-tar[:,:,1]))\n    f = 15*tf.abs(pred[:,:,2]-tar[:,:,2])\n    return tf.reduce_mean(xy+f)","metadata":{"papermill":{"duration":0.046396,"end_time":"2021-03-13T07:37:27.50277","exception":false,"start_time":"2021-03-13T07:37:27.456374","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@contextmanager\ndef timer():\n    start = time()\n    yield\n    end = time()\n    m,s = (end-start)//60, (end-start)%60\n    print(f\"Training ended in {m} min {s} sec. Current Memory Usage: {virtual_memory().percent} \\n\")\n    ","metadata":{"papermill":{"duration":0.036108,"end_time":"2021-03-13T07:37:27.567983","exception":false,"start_time":"2021-03-13T07:37:27.531875","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ChangeModes(keras.callbacks.Callback):\n    def __init__(self,model,features,targ,max_f,min_f):\n        self.model = model\n        self.fea = features\n        self.tar = np.expand_dims(targ,1)\n        self.min_f = min_f\n        self.max_f = max_f\n    def on_train_begin(self, logs=None):\n        self.model.training()\n    def on_test_begin(self, logs=None):\n        self.model.testing()\n    def on_epoch_end(self,epoch,logs=None):\n        pred = model.predict(self.fea)*(self.max_f-self.min_f)+self.min_f\n        xy = np.sqrt(np.square(pred[:,:,0]-self.tar[:,:,0])+np.square(pred[:,:,1]-self.tar[:,:,1]))\n        f = (15*np.abs(pred[:,:,2]-self.tar[:,:,2]))\n        print(f\"Epoch:{epoch},Est_lbscore:{(xy+f).mean()} validation loss: {logs['val_mpe_loss']}, building_loss={f.mean()}, location_loss = {xy.mean()}\")","metadata":{"papermill":{"duration":0.040354,"end_time":"2021-03-13T07:37:27.637325","exception":false,"start_time":"2021-03-13T07:37:27.596971","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class IndoorPrediction(keras.Model):\n    def __init__(self,inp_shape,params,emb_length,emb_dim_bssid, emb_dim_rssi,bssid_dict):\n        super(IndoorPrediction, self).__init__()\n        self.train=True\n        self.bssid_dict = bssid_dict\n        self.inp_shape = inp_shape\n        self.embedding_bssid = keras.layers.Embedding(emb_length,emb_dim_bssid)\n        self.embedding_rssi = keras.layers.Embedding(1000,emb_dim_rssi) # (0-999) Most of these are not used.\n        self.encoder = transformer.EncoderStack(params)\n        self.encoder.build(inp_shape)\n        \n        self.fc = keras.layers.Dense(3,activation='sigmoid')\n        \n    def training(self):\n        self.train =True\n    def testing(self):\n        self.train =False\n    def buildModel(self):\n        self.build(self.inp_shape)\n    def process_data(self,i):\n        bs,rs = i[:,:100],i[:,100:]*-1\n        return bs,rs\n    def call(self,i):\n        bs,rs = self.process_data(i)\n        attention_bias = model_utils.get_padding_bias(bs)\n        x = tf.concat([self.embedding_bssid(bs),self.embedding_rssi(rs)],2)\n        return self.fc(self.encoder.call(x,attention_bias,None,self.train)[:,-50:-1,:])","metadata":{"papermill":{"duration":0.040279,"end_time":"2021-03-13T07:37:27.706623","exception":false,"start_time":"2021-03-13T07:37:27.666344","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size=64\nseq_len = 100\nemb_dim_bssid= 36\nemb_dim_rssi = 18","metadata":{"papermill":{"duration":0.035704,"end_time":"2021-03-13T07:37:27.771026","exception":false,"start_time":"2021-03-13T07:37:27.735322","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"params = {\n    \"hidden_size\": emb_dim_bssid+emb_dim_rssi,\n#     Attention-layer parameters\n    \"num_hidden_layers\":8,\n    \"attention_dropout\":0.0,\n    \"layer_postprocess_dropout\": 0.0,\n    \"num_heads\": 6,\n#     Feed-Forward parameters\n    \"filter_size\": 64,\n    \"relu_dropout\": 0.0\n}","metadata":{"papermill":{"duration":0.03581,"end_time":"2021-03-13T07:37:27.836305","exception":false,"start_time":"2021-03-13T07:37:27.800495","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fea,tar = train.iloc[:,:200].values,train.iloc[:,200:203].values\ntest_fea = test.iloc[:,:200].values","metadata":{"papermill":{"duration":0.109611,"end_time":"2021-03-13T07:37:27.97478","exception":false,"start_time":"2021-03-13T07:37:27.865169","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"max_f,min_f = tar.max(0),tar.min(0)\ntar= (tar- min_f)/(max_f-min_f) ","metadata":{"papermill":{"duration":0.041866,"end_time":"2021-03-13T07:37:28.04593","exception":false,"start_time":"2021-03-13T07:37:28.004064","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"splits=5\npredict = np.zeros((test_fea.shape[0],3))\nfor i in range(splits):\n        mask = np.random.rand(len(tar))<0.8\n        X_train, Y_train = fea[mask], tar[mask]\n        X_valid, Y_valid = fea[~mask], tar[~mask]\n        print(f\"{i}-fold model training starting...\");\n        model = IndoorPrediction((batch_size,seq_len), params,len(bssids),emb_dim_bssid,emb_dim_rssi,bssids)\n        model.compile(optimizer = tf.keras.optimizers.Adam(\n                        learning_rate=5e-4, beta_1=0.9, \n                        beta_2=0.999, epsilon=1e-07, \n                        amsgrad=False,name='Adam'), loss=mpe_loss,metrics=[mpe_loss])\n        earlystop = keras.callbacks.EarlyStopping(monitor='val_loss',patience=8)\n        changemode = ChangeModes(model,X_valid,Y_valid,max_f,min_f)\n        save_point = 'checkpoint.ckpt'\n        model_checkpoint = keras.callbacks.ModelCheckpoint(save_point,monitor='val_loss',mode='min',\n                                                           verbose=1,save_best_only=True,save_weights_only=True)\n        reducelr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=0, mode='min')\n        with timer():\n            history = model.fit(X_train,Y_train,batch_size=batch_size,\n                                validation_data = (X_valid,Y_valid),epochs=30,\n                                callbacks=[earlystop,reducelr,changemode,model_checkpoint],verbose=0)\n        model.load_weights(save_point)\n        Y_predict = model.predict(test_fea)[:,-1,:]*(max_f-min_f)+min_f\n        predict += Y_predict\n        gc.collect()\npredict /=splits","metadata":{"papermill":{"duration":31003.423676,"end_time":"2021-03-13T16:14:11.498768","exception":false,"start_time":"2021-03-13T07:37:28.075092","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"validation with 19 entries 1 epoch:  \nEpoch:0, validation loss: 0.08501642197370529, building_loss=21.83549779882712, location_loss = 169.73047401256605\n\nvalidation with 9 entries 1 epoch:  \nloss: 0.4561 - mpe_loss: 0.4561 Epoch:0,Est_lbscore:188.62509873283773 validation loss: 0.10268882662057877, building_loss=21.53930707612264, location_loss = 167.0857916567151\n\nvalidation with 29 entries 1 epoch:  \nloss: 0.4266 - mpe_loss: 0.4266 - val_loss: 0.1043 - val_mpe_loss: 0.1049\nEpoch:0,Est_lbscore:193.9539121881643 validation loss: 0.10486969351768494, building_loss=22.04513628422682, location_loss = 171.90877590393754","metadata":{"papermill":{"duration":0.069122,"end_time":"2021-03-13T16:14:11.639233","exception":false,"start_time":"2021-03-13T16:14:11.570111","status":"completed"},"tags":[]}},{"cell_type":"code","source":"sub_other = pd.read_csv('../input/simple-99-accurate-floor-model/submission.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['floor'] = sub_other['floor']\nsubmission['x'] = predict[:,0]\nsubmission['y'] = predict[:,1]","metadata":{"papermill":{"duration":0.081072,"end_time":"2021-03-13T16:14:11.789381","exception":false,"start_time":"2021-03-13T16:14:11.708309","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['floor'] = submission['floor'].astype('int32')","metadata":{"papermill":{"duration":0.079862,"end_time":"2021-03-13T16:14:11.93849","exception":false,"start_time":"2021-03-13T16:14:11.858628","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv',index=False)","metadata":{"papermill":{"duration":0.264406,"end_time":"2021-03-13T16:14:12.27356","exception":false,"start_time":"2021-03-13T16:14:12.009154","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]}]}