{"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":"import numpy as np\nimport pandas as pd\ntr_meta = pd.read_csv('../input/PLAsTiCC-2018/training_set_metadata.csv') #Stationary Data ,\n                                #that doesn't change over time, like the coordinates of the object.\ntr_data = pd.read_csv('../input/PLAsTiCC-2018/training_set.csv') #Time Series Data\n\ntraining = pd.merge(tr_data, tr_meta, how = 'left', left_on = ['object_id'], right_on = ['object_id'])\ntraining.head()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-10-22T14:01:57.612002Z","iopub.execute_input":"2021-10-22T14:01:57.612895Z","iopub.status.idle":"2021-10-22T14:01:59.824229Z","shell.execute_reply.started":"2021-10-22T14:01:57.612787Z","shell.execute_reply":"2021-10-22T14:01:59.823207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Exploratory Data Analysis**","metadata":{}},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')\nprint('Shape of Meta Data (Stationary) is:: {}'.format(tr_meta.shape)) #(7848, 12)\nprint('Shape of Time Series Data is:: {}'.format(tr_data.shape)) #(1421705, 6)\nprint('Shape of Merged Data is:: {}'.format(training.shape)) #(1421705, 17)\n\nTarget_Class = training['target'].nunique()\nprint('Number of target Class:: {}'.format(training['target'].nunique()))\nprint('Number of Objects:: {}'.format(training['object_id'].nunique()))\n\nprint('Number of Detected Labels:: {}'.format(training['detected'].nunique()))\n\nprint('Detected Labels are:: {}'.format(training['detected'].unique()))","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:02:14.777511Z","iopub.execute_input":"2021-10-22T14:02:14.777837Z","iopub.status.idle":"2021-10-22T14:02:14.871306Z","shell.execute_reply.started":"2021-10-22T14:02:14.777807Z","shell.execute_reply":"2021-10-22T14:02:14.869286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for column in training.columns:\n    if training[column].isnull().sum() >0:\n        print('Column {} contains {} null Values'.format(column, training[column].isnull().sum()))\n    \n#Column distmod contains 400574 null Values/Values\n\nprint('Column Distmod Contains {} % Null Values'.format(training['distmod'].isnull().sum()/ training.shape[0] *100))","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:02:18.089667Z","iopub.execute_input":"2021-10-22T14:02:18.089954Z","iopub.status.idle":"2021-10-22T14:02:18.1556Z","shell.execute_reply.started":"2021-10-22T14:02:18.089924Z","shell.execute_reply":"2021-10-22T14:02:18.154589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training['object_id'].value_counts().nunique()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:02:23.024875Z","iopub.execute_input":"2021-10-22T14:02:23.025514Z","iopub.status.idle":"2021-10-22T14:02:23.051619Z","shell.execute_reply.started":"2021-10-22T14:02:23.025481Z","shell.execute_reply":"2021-10-22T14:02:23.0506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"per_obj_row_count = training.groupby(['object_id'], as_index = False)['passband'].count()\nper_obj_row_count.rename(columns = {'passband': 'RowCount'}, inplace = True)\n\ndistmod_null = training[training.isnull().any(axis=1)]\ndistmod_null_count = distmod_null.groupby(['object_id'], as_index = False)['passband'].count()\ndistmod_null_count.rename(columns = {'passband': 'NullRowCount'}, inplace = True)\n\nNull_DF_Analysis = pd.merge(per_obj_row_count, distmod_null_count, how = 'left', left_on = ['object_id'],\n                           right_on = ['object_id'])\nNull_DF_Analysis.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:02:51.004451Z","iopub.execute_input":"2021-10-22T14:02:51.004786Z","iopub.status.idle":"2021-10-22T14:02:51.283378Z","shell.execute_reply.started":"2021-10-22T14:02:51.004755Z","shell.execute_reply":"2021-10-22T14:02:51.28213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Null_Obj_Id = list(Null_DF_Analysis[Null_DF_Analysis['NullRowCount'] >0]['object_id'].values)\n# Null_Obj_Id","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:02:56.463035Z","iopub.execute_input":"2021-10-22T14:02:56.463436Z","iopub.status.idle":"2021-10-22T14:02:56.491348Z","shell.execute_reply.started":"2021-10-22T14:02:56.463393Z","shell.execute_reply":"2021-10-22T14:02:56.490372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training.distmod.fillna(0, inplace = True)\ntraining.drop(columns = ['distmod', 'detected', 'mjd'], inplace = True)\n# training.drop(columns = ['unix_time'], inplace = True)\ntraining.target.value_counts()\ntraining.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:02:59.500503Z","iopub.execute_input":"2021-10-22T14:02:59.500892Z","iopub.status.idle":"2021-10-22T14:02:59.609505Z","shell.execute_reply.started":"2021-10-22T14:02:59.500845Z","shell.execute_reply":"2021-10-22T14:02:59.608497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"minmax_dict = {}\nfor col in training.columns:\n    if col not in ['object_id', 'passband', 'detected', 'ddf', 'target']:\n        min_ = training[col].min()\n        max_ = training[col].max()\n        minmax_dict[col] = {}\n        minmax_dict[col]['min'] = min_\n        minmax_dict[col]['max'] = max_\n        training[col] = (training[col] - min_) / max_\n        \ntraining.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:03:04.376638Z","iopub.execute_input":"2021-10-22T14:03:04.37733Z","iopub.status.idle":"2021-10-22T14:03:04.517155Z","shell.execute_reply.started":"2021-10-22T14:03:04.377297Z","shell.execute_reply":"2021-10-22T14:03:04.51606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training['target'].nunique()\n\ntgt = [92, 88, 42, 90, 65, 16, 67, 95, 62, 15, 52,  6, 64, 53]\nencoded_tgt = [i for i in range(14)]\n\nencoded_dict = dict(zip(tgt, encoded_tgt))\ntraining['target_encoded'] = training['target'].apply(lambda x: encoded_dict[x])\ntraining.drop(columns = ['target'], inplace = True)\ntraining.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:03:15.874612Z","iopub.execute_input":"2021-10-22T14:03:15.874915Z","iopub.status.idle":"2021-10-22T14:03:16.843197Z","shell.execute_reply.started":"2021-10-22T14:03:15.874885Z","shell.execute_reply":"2021-10-22T14:03:16.842073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training.drop(columns = ['ddf'], inplace = True)\ntraining.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:03:20.309636Z","iopub.execute_input":"2021-10-22T14:03:20.309927Z","iopub.status.idle":"2021-10-22T14:03:20.332592Z","shell.execute_reply.started":"2021-10-22T14:03:20.309881Z","shell.execute_reply":"2021-10-22T14:03:20.331506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training.drop(columns =['mjd', 'target'], inplace = True)\n# training.drop(columns =['mjd'], inplace = True)\n\nTr, Te = training.iloc[: int(training.shape[0] * 0.7), :],training.iloc[int(training.shape[0] * 0.7): , :]\nTR_X, TR_Y = Tr.iloc[:,:-1], Tr.iloc[:,-1]\nTE_X, TE_Y = Te.iloc[:,:-1], Te.iloc[:,-1]\n\nX_Train_Dynamic, X_Train_Static = TR_X.iloc[:,:4], TR_X.iloc[:,4:]\nX_Test_Dynamic, X_Test_Static = TE_X.iloc[:,:4], TE_X.iloc[:,4:]\n\nX_Train_Static.insert(0, 'object_id', X_Train_Dynamic.iloc[:,0])\nX_Test_Static.insert(0, 'object_id', X_Test_Dynamic.iloc[:,0])\n\nTR_Y = pd.DataFrame(TR_Y)\nTR_Y.insert(0, 'object_id', X_Train_Dynamic.iloc[:,0])\n\nTE_Y = pd.DataFrame(TE_Y)\nTE_Y.insert(0, 'object_id', X_Test_Dynamic.iloc[:,0])\n\n\nTR_Y.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:03:31.678465Z","iopub.execute_input":"2021-10-22T14:03:31.67877Z","iopub.status.idle":"2021-10-22T14:03:31.841915Z","shell.execute_reply.started":"2021-10-22T14:03:31.67874Z","shell.execute_reply":"2021-10-22T14:03:31.840918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_time_series_data(X_Dynamic, X_Static, Tr_Val, n_past = 5, n_future = 1):\n    X_D, X_S, Y = [], [], []\n    for window in range(X_Dynamic.shape[0]):\n        past_end = window + n_past\n        future_end = past_end + n_future\n\n        if future_end > X_Dynamic.shape[0]:\n            break\n        else:\n            historic_data_dynamic = list(X_Dynamic.iloc[window: past_end, 1:].values)\n            \n            X_D.append(historic_data_dynamic)\n            X_S.append(X_Static.iloc[past_end,1:])\n            Y.append(Tr_Val.iloc[past_end, 1])\n            \n    return np.array(X_D), np.array(X_S), np.array(Y)","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:27:02.028949Z","iopub.execute_input":"2021-10-22T14:27:02.029306Z","iopub.status.idle":"2021-10-22T14:27:02.040518Z","shell.execute_reply.started":"2021-10-22T14:27:02.029272Z","shell.execute_reply":"2021-10-22T14:27:02.038988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_Tr_D, X_Tr_S, Y_Tr = np.array([]), np.array([]), np.array([])\n\nprint(X_Train_Dynamic.shape)\nprint(X_Train_Static.shape)\nprint(TR_Y.shape)\n\nobject_ = X_Train_Dynamic['object_id'].unique()\nprint(len(object_))\n\nfor obj in object_:\n    sub_df_dy = X_Train_Dynamic[(X_Train_Dynamic['object_id'] == obj)]\n    sub_df_st = X_Train_Static[(X_Train_Static['object_id'] == obj)]\n    True_Val = TR_Y[(TR_Y['object_id'] == obj)]\n    \n    D, S, Y = prepare_time_series_data(sub_df_dy, sub_df_st, True_Val)\n    \n    X_Tr_D = np.vstack([X_Tr_D, D]) if X_Tr_D.size else D\n    X_Tr_S = np.vstack([X_Tr_S, S]) if X_Tr_S.size else S\n    Y_Tr = np.concatenate([Y_Tr, Y])\n\nprint(X_Tr_D.shape)\nprint(X_Tr_S.shape)\nprint(Y_Tr.shape)","metadata":{"execution":{"iopub.status.busy":"2021-10-22T14:27:04.744875Z","iopub.execute_input":"2021-10-22T14:27:04.745839Z","iopub.status.idle":"2021-10-22T14:47:20.00899Z","shell.execute_reply.started":"2021-10-22T14:27:04.745796Z","shell.execute_reply":"2021-10-22T14:47:20.007986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_Tr_S[1:5, :]","metadata":{"execution":{"iopub.status.busy":"2021-10-19T16:39:23.711684Z","iopub.execute_input":"2021-10-19T16:39:23.712213Z","iopub.status.idle":"2021-10-19T16:39:23.721967Z","shell.execute_reply.started":"2021-10-19T16:39:23.712146Z","shell.execute_reply":"2021-10-19T16:39:23.720819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Conv1D, Activation,BatchNormalization, LSTM, GRU, Lambda\nfrom tensorflow.keras import optimizers\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.callbacks import ModelCheckpoint","metadata":{"execution":{"iopub.status.busy":"2021-10-22T15:04:08.752533Z","iopub.execute_input":"2021-10-22T15:04:08.75283Z","iopub.status.idle":"2021-10-22T15:04:08.75869Z","shell.execute_reply.started":"2021-10-22T15:04:08.7528Z","shell.execute_reply":"2021-10-22T15:04:08.757562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ip_layer_dynamic = (X_Tr_D.shape[1], X_Tr_D.shape[2])\ndynamic = Sequential()\ndynamic.add(Conv1D(filters = 8, kernel_size = 3, strides = 1, padding = 'Same',\n                  name = 'Dynamic_Layer_CONV1D',input_shape = ip_layer_dynamic))\n\ndynamic.add(BatchNormalization(name = 'Dynamic_Layer_BN'))\ndynamic.add(Activation('relu', name = 'Dynamic_Layer_Activation'))\n\ndynamic.add(LSTM(4, name = 'Dynamic_Layer_LSTM1'))\n# dynamic.add(LSTM(64, name = 'Dynamic_Layer_LSTM2'))\ndynamic.add(Dense(4, name = 'Dynamic_Layer_Dense'))\ndynamic.add(Lambda(lambda x: x * 2))\n\ndynamic.summary()\n","metadata":{"execution":{"iopub.status.busy":"2021-10-22T15:04:57.984073Z","iopub.execute_input":"2021-10-22T15:04:57.984394Z","iopub.status.idle":"2021-10-22T15:04:58.304409Z","shell.execute_reply.started":"2021-10-22T15:04:57.984363Z","shell.execute_reply":"2021-10-22T15:04:58.303408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ip_layer_static = X_Tr_S.shape[1]\nstatic = Sequential()\nstatic.add(Dense(units = 8, kernel_initializer = tf.keras.initializers.he_normal(seed = 42),\n                 input_dim = ip_layer_static, name = 'Static_Layer_Dense_16' ))\n\nstatic.add(BatchNormalization(name = 'Static_Layer_BN1'))\nstatic.add(Activation('relu' , name = 'Static_Layer_Activation1'))\n\nstatic.add(Dense(units = 4, kernel_initializer = tf.keras.initializers.he_normal(seed = 42),\n                name = 'Static_Layer_Dense_32'))\nstatic.add(BatchNormalization(name = 'Static_Layer_BN2'))\nstatic.add(Activation('relu', name = 'Static_Layer_Activation2'))\n\n\n# static.add(Dense(units = 8, kernel_initializer = tf.keras.initializers.he_normal(seed = 42),\n#                 name = 'Static_Layer_Dense_64'))\n# static.add(BatchNormalization(name = 'Static_Layer_BN3'))\n\n\n# static.add(Dense(units = 128, kernel_initializer = tf.keras.initializers.he_normal(seed = 42),\n#                 name = 'Static_Layer_Dense_128'))\n# static.add(BatchNormalization(name = 'Static_Layer_BN4'))\n# static.add(Activation('relu', name = 'Static_Layer_Activation4'))\n\nstatic.add(Lambda(lambda x: x * 0.01))\nstatic.add(Activation('relu', name = 'Static_Layer_Activation3'))\n\nstatic.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T15:05:16.311374Z","iopub.execute_input":"2021-10-22T15:05:16.312163Z","iopub.status.idle":"2021-10-22T15:05:16.432325Z","shell.execute_reply.started":"2021-10-22T15:05:16.312118Z","shell.execute_reply":"2021-10-22T15:05:16.431366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"static_dynamic_model = tf.keras.layers.Concatenate()([dynamic.output,static.output])\nmerged_model = Dense(16, kernel_initializer = tf.keras.initializers.he_normal(seed = 42),\n                     name = 'Merged_Model_Dense_1024')(static_dynamic_model)\n\nmerged_model = BatchNormalization(name = 'Merged_Layer_BN1')(merged_model)\nmerged_model = Activation('relu', name = 'Merged_Layer_Activation1')(merged_model)\n# merged_model = Dense(512, activation=\"relu\", name = 'Merged_Model_Dense_512')(merged_model)\nmerged_model = tf.keras.layers.Dropout(0.30, name = 'Dropout2')(merged_model)\n\nmerged_model = Dense(16,kernel_initializer = tf.keras.initializers.he_normal(seed = 42),\n                      name = 'Merged_Model_Dense_128')(merged_model)\n\nmerged_model = BatchNormalization(name = 'Merged_Layer_BN2')(merged_model)\nmerged_model = Activation('relu', name = 'Merged_Layer_Activation2')(merged_model)\nmerged_model = tf.keras.layers.Dropout(0.30, name = 'Dropout3')(merged_model)\n\nmerged_model = Dense(14, activation=\"softmax\", name = 'Softmax_Output')(merged_model)\n\nmodel = Model(inputs = [dynamic.input, static.input], outputs = merged_model)\n\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-22T15:05:25.974078Z","iopub.execute_input":"2021-10-22T15:05:25.97441Z","iopub.status.idle":"2021-10-22T15:05:26.075131Z","shell.execute_reply.started":"2021-10-22T15:05:25.974371Z","shell.execute_reply":"2021-10-22T15:05:26.074224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"opt = tf.keras.optimizers.SGD(learning_rate=0.01,momentum = 0.9, nesterov = True)\nmodel.compile(loss = tf.keras.losses.CategoricalCrossentropy(), optimizer = opt,\n                metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-10-22T15:05:31.602637Z","iopub.execute_input":"2021-10-22T15:05:31.602924Z","iopub.status.idle":"2021-10-22T15:05:31.619408Z","shell.execute_reply.started":"2021-10-22T15:05:31.602895Z","shell.execute_reply":"2021-10-22T15:05:31.618346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.utils import class_weight\nclass_weights = class_weight.compute_class_weight('balanced', np.unique(Y_Tr), Y_Tr)\n\nY_Tr_Categorical = tf.keras.utils.to_categorical(Y_Tr)\n# Y_Tr_Categorical = Y_Tr\n# class_ = [i for i in range(14)]\n# cw = dict(zip())\n# print(class_weights)\nmodel_checkpoint = tf.keras.callbacks.ModelCheckpoint('Astronomy.hdf5', monitor = 'val_accuracy', verbose = 1,\n                                  save_best_only = True)\n# z.fit(X_train, y_train, class_weight = class_weights)\nhist =model.fit([X_Tr_D, X_Tr_S], Y_Tr_Categorical, batch_size = 256, epochs=100, verbose=1,\n                validation_split = 0.33, callbacks = [model_checkpoint])\n\n\n# opt = tf.keras.optimizers.SGD(learning_rate=0.1,momentum = 0.9, nesterov = True)\n# dynamic.compile(loss = tf.keras.losses.CategoricalCrossentropy(), optimizer = opt,\n#                 metrics = ['accuracy'])\n# hist =dynamic.fit(X_Tr_D, Y_Tr_Categorical, batch_size = 256, epochs=100, verbose=1,\n#                 validation_split = 0.33, callbacks = [model_checkpoint])\n","metadata":{"execution":{"iopub.status.busy":"2021-10-22T15:05:36.31101Z","iopub.execute_input":"2021-10-22T15:05:36.311675Z","iopub.status.idle":"2021-10-22T15:58:45.183243Z","shell.execute_reply.started":"2021-10-22T15:05:36.311641Z","shell.execute_reply":"2021-10-22T15:58:45.182213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_Tr.shape","metadata":{"execution":{"iopub.status.busy":"2021-10-12T08:18:35.543117Z","iopub.status.idle":"2021-10-12T08:18:35.544279Z","shell.execute_reply.started":"2021-10-12T08:18:35.543947Z","shell.execute_reply":"2021-10-12T08:18:35.543978Z"},"trusted":true},"execution_count":null,"outputs":[]}]}