{"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":"markdown","source":"# Intro\nWelcome to the [](https://www.kaggle.com/c/g2net-gravitational-wave-detection/overview) compedition\n![](https://storage.googleapis.com/kaggle-competitions/kaggle/23249/logos/header.png)\n\n<span style=\"color: royalblue;\">Please vote the notebook up if it helps you. Thank you. </span>","metadata":{}},{"cell_type":"markdown","source":"# Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport os\n\nfrom sklearn.model_selection import train_test_split\n\nfrom keras.utils import Sequence\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten, Conv1D, MaxPool1D, BatchNormalization\nfrom keras.optimizers import RMSprop,Adam\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-06-30T19:39:17.765489Z","iopub.execute_input":"2021-06-30T19:39:17.765898Z","iopub.status.idle":"2021-06-30T19:39:17.772304Z","shell.execute_reply.started":"2021-06-30T19:39:17.765863Z","shell.execute_reply":"2021-06-30T19:39:17.771175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Path","metadata":{}},{"cell_type":"code","source":"path = '/kaggle/input/g2net-gravitational-wave-detection/'\nos.listdir(path)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:17.831698Z","iopub.execute_input":"2021-06-30T19:39:17.832201Z","iopub.status.idle":"2021-06-30T19:39:17.842594Z","shell.execute_reply.started":"2021-06-30T19:39:17.832151Z","shell.execute_reply":"2021-06-30T19:39:17.841252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"train_labels = pd.read_csv(path+'training_labels.csv')\nsamp_subm = pd.read_csv(path+'sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:17.844092Z","iopub.execute_input":"2021-06-30T19:39:17.844433Z","iopub.status.idle":"2021-06-30T19:39:18.566314Z","shell.execute_reply.started":"2021-06-30T19:39:17.844397Z","shell.execute_reply":"2021-06-30T19:39:18.565079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Overview","metadata":{}},{"cell_type":"code","source":"print('Number train samples:', len(train_labels))\nprint('Number submission samples:', len(samp_subm))","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.568866Z","iopub.execute_input":"2021-06-30T19:39:18.569344Z","iopub.status.idle":"2021-06-30T19:39:18.575541Z","shell.execute_reply.started":"2021-06-30T19:39:18.569297Z","shell.execute_reply":"2021-06-30T19:39:18.574712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels.head()","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.577185Z","iopub.execute_input":"2021-06-30T19:39:18.577732Z","iopub.status.idle":"2021-06-30T19:39:18.608511Z","shell.execute_reply.started":"2021-06-30T19:39:18.577695Z","shell.execute_reply":"2021-06-30T19:39:18.607747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Functions\nWe define some helper functions.","metadata":{}},{"cell_type":"code","source":"def plot_data(data):\n    \"\"\" Plot 3 Detections of data array\"\"\"\n    \n    fig, axs = plt.subplots(1, 3, figsize=(20, 5))\n    axs = axs.ravel()\n    for i in range(3):\n        x = range(len(data[i]))\n        y = data[i]\n        axs[i].plot(x, y)\n        axs[i].grid()\n        axs[i].set_title('Detection '+str((i+1)))","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.609879Z","iopub.execute_input":"2021-06-30T19:39:18.61039Z","iopub.status.idle":"2021-06-30T19:39:18.617728Z","shell.execute_reply.started":"2021-06-30T19:39:18.610347Z","shell.execute_reply":"2021-06-30T19:39:18.616579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Focus On Example Sample\nWe consider the first example of the train data. To get familiar with npy-files we consider [this article](https://towardsdatascience.com/what-is-npy-files-and-why-you-should-use-them-603373c78883).","metadata":{}},{"cell_type":"code","source":"id_ = train_labels.loc[0, 'id']\nid_","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.619047Z","iopub.execute_input":"2021-06-30T19:39:18.619334Z","iopub.status.idle":"2021-06-30T19:39:18.664386Z","shell.execute_reply.started":"2021-06-30T19:39:18.619308Z","shell.execute_reply":"2021-06-30T19:39:18.662786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The first 3 characters are used for the path:","metadata":{}},{"cell_type":"code","source":"path_in = '/'.join([path, 'train', id_[0], id_[1], id_[2]])+'/'\nfile = id_+'.npy'","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.666204Z","iopub.execute_input":"2021-06-30T19:39:18.666545Z","iopub.status.idle":"2021-06-30T19:39:18.672279Z","shell.execute_reply.started":"2021-06-30T19:39:18.666515Z","shell.execute_reply":"2021-06-30T19:39:18.671061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Each data sample (npy file) contains 3 time series (1 for each detector) and each spans 2 sec and is sampled at 2,048 Hz.","metadata":{}},{"cell_type":"code","source":"data_array = np.load(path_in+file)\ndata_array.shape","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.674999Z","iopub.execute_input":"2021-06-30T19:39:18.675323Z","iopub.status.idle":"2021-06-30T19:39:18.700735Z","shell.execute_reply.started":"2021-06-30T19:39:18.675293Z","shell.execute_reply":"2021-06-30T19:39:18.699528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_data(data_array)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:18.703918Z","iopub.execute_input":"2021-06-30T19:39:18.704396Z","iopub.status.idle":"2021-06-30T19:39:19.219099Z","shell.execute_reply.started":"2021-06-30T19:39:18.704362Z","shell.execute_reply":"2021-06-30T19:39:19.218222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EDA\n*Coming Soon*","metadata":{}},{"cell_type":"markdown","source":"# Train, Val And Test Data","metadata":{}},{"cell_type":"code","source":"list_IDs_train, list_IDs_val = train_test_split(list(train_labels.index), test_size=0.33, random_state=2021)\nlist_IDs_test = list(samp_subm.index)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:19.220146Z","iopub.execute_input":"2021-06-30T19:39:19.220537Z","iopub.status.idle":"2021-06-30T19:39:19.576147Z","shell.execute_reply.started":"2021-06-30T19:39:19.220508Z","shell.execute_reply":"2021-06-30T19:39:19.575289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Number train samples:', len(list_IDs_train))\nprint('Number val samples:', len(list_IDs_val))\nprint('Number test samples:', len(list_IDs_test))","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:19.577347Z","iopub.execute_input":"2021-06-30T19:39:19.577978Z","iopub.status.idle":"2021-06-30T19:39:19.585544Z","shell.execute_reply.started":"2021-06-30T19:39:19.577931Z","shell.execute_reply":"2021-06-30T19:39:19.58426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Generator\nWe define a data generator to define the data on demand.","metadata":{}},{"cell_type":"code","source":"batch_size = 64","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:19.586968Z","iopub.execute_input":"2021-06-30T19:39:19.587261Z","iopub.status.idle":"2021-06-30T19:39:19.598907Z","shell.execute_reply.started":"2021-06-30T19:39:19.587234Z","shell.execute_reply":"2021-06-30T19:39:19.597867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DataGenerator(Sequence):\n    def __init__(self, path, list_IDs, data, batch_size):\n        self.path = path\n        self.list_IDs = list_IDs\n        self.data = data\n        self.batch_size = batch_size\n        self.indexes = np.arange(len(self.list_IDs))\n        \n    def __len__(self):\n        len_ = int(len(self.list_IDs)/self.batch_size)\n        if len_*self.batch_size < len(self.list_IDs):\n            len_ += 1\n        return len_\n    \n    def __getitem__(self, index):\n        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]\n        list_IDs_temp = [self.list_IDs[k] for k in indexes]\n        X, y = self.__data_generation(list_IDs_temp)\n        return X, y\n    \n    def __data_generation(self, list_IDs_temp):\n        X = np.zeros((self.batch_size, 3, 4096))\n        y = np.zeros((self.batch_size, 1))\n        for i, ID in enumerate(list_IDs_temp):\n            id_ = self.data.loc[ID, 'id']\n            file = id_+'.npy'\n            path_in = '/'.join([self.path, id_[0], id_[1], id_[2]])+'/'\n            data_array = np.load(path_in+file)\n            data_array = (data_array-data_array.mean())/data_array.std()\n            X[i, ] = data_array\n            y[i, ] = self.data.loc[ID, 'target']\n        return X, y","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:48.047085Z","iopub.execute_input":"2021-06-30T19:39:48.047512Z","iopub.status.idle":"2021-06-30T19:39:48.06079Z","shell.execute_reply.started":"2021-06-30T19:39:48.047476Z","shell.execute_reply":"2021-06-30T19:39:48.059195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = DataGenerator(path+'train/', list_IDs_train, train_labels, batch_size)\nval_generator = DataGenerator(path+'train/', list_IDs_val, train_labels, batch_size)\ntest_generator = DataGenerator(path+'test/', list_IDs_test, samp_subm, batch_size)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:48.964484Z","iopub.execute_input":"2021-06-30T19:39:48.965071Z","iopub.status.idle":"2021-06-30T19:39:48.973519Z","shell.execute_reply.started":"2021-06-30T19:39:48.965021Z","shell.execute_reply":"2021-06-30T19:39:48.972452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Model","metadata":{}},{"cell_type":"code","source":"epochs = 1\nlernrate = 2e-4","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:50.870346Z","iopub.execute_input":"2021-06-30T19:39:50.87106Z","iopub.status.idle":"2021-06-30T19:39:50.877805Z","shell.execute_reply.started":"2021-06-30T19:39:50.871019Z","shell.execute_reply":"2021-06-30T19:39:50.876539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv1D(64, input_shape=(3, 4096,), kernel_size=3, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(Flatten())\nmodel.add(Dense(64, activation='relu'))\nmodel.add(Dense(1, activation='sigmoid'))","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:52.045121Z","iopub.execute_input":"2021-06-30T19:39:52.045546Z","iopub.status.idle":"2021-06-30T19:39:52.114641Z","shell.execute_reply.started":"2021-06-30T19:39:52.045508Z","shell.execute_reply":"2021-06-30T19:39:52.113409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer = Adam(lr=lernrate),\n              loss='binary_crossentropy',\n              metrics=['acc'])","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:53.821531Z","iopub.execute_input":"2021-06-30T19:39:53.821978Z","iopub.status.idle":"2021-06-30T19:39:53.838378Z","shell.execute_reply.started":"2021-06-30T19:39:53.821944Z","shell.execute_reply":"2021-06-30T19:39:53.836714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:55.666988Z","iopub.execute_input":"2021-06-30T19:39:55.667371Z","iopub.status.idle":"2021-06-30T19:39:55.675931Z","shell.execute_reply.started":"2021-06-30T19:39:55.667341Z","shell.execute_reply":"2021-06-30T19:39:55.674632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(generator=train_generator, validation_data=val_generator, epochs = epochs, workers=4)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:58.376531Z","iopub.execute_input":"2021-06-30T19:39:58.376903Z","iopub.status.idle":"2021-06-30T19:58:59.311584Z","shell.execute_reply.started":"2021-06-30T19:39:58.376874Z","shell.execute_reply":"2021-06-30T19:58:59.307158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Predict test data","metadata":{}},{"cell_type":"code","source":"predict = model.predict_generator(test_generator, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T20:01:44.388327Z","iopub.execute_input":"2021-06-30T20:01:44.388909Z","iopub.status.idle":"2021-06-30T20:25:43.243883Z","shell.execute_reply.started":"2021-06-30T20:01:44.388868Z","shell.execute_reply":"2021-06-30T20:25:43.241899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samp_subm['target'] = predict[:len(samp_subm)]","metadata":{"execution":{"iopub.status.busy":"2021-06-30T20:26:50.238686Z","iopub.execute_input":"2021-06-30T20:26:50.239082Z","iopub.status.idle":"2021-06-30T20:26:50.246121Z","shell.execute_reply.started":"2021-06-30T20:26:50.239047Z","shell.execute_reply":"2021-06-30T20:26:50.244743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Export","metadata":{}},{"cell_type":"code","source":"samp_subm.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-06-30T19:39:19.874678Z","iopub.status.idle":"2021-06-30T19:39:19.875115Z"},"trusted":true},"execution_count":null,"outputs":[]}]}