{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":41880,"databundleVersionId":5677426,"sourceType":"competition"}],"dockerImageVersionId":30628,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### <font color='orange'>0. Imports</font>","metadata":{}},{"cell_type":"code","source":"# For numerical manipulation\nimport numpy as np\n\n# For dataframes utilization\nimport pandas as pd\n\n# File operations\nimport os\n\n# Tensorflow for CNN model\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras import layers\n\n\nfrom sklearn.metrics import average_precision_score\nfrom keras.models import load_model","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-02T12:01:25.465574Z","iopub.execute_input":"2024-03-02T12:01:25.465864Z","iopub.status.idle":"2024-03-02T12:01:37.834204Z","shell.execute_reply.started":"2024-03-02T12:01:25.465839Z","shell.execute_reply":"2024-03-02T12:01:37.833373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <font color='orange'>2. Creating the TDCSFOG Dataset</font>","metadata":{}},{"cell_type":"markdown","source":"### <font color='purple'>2.1. Train</font>","metadata":{}},{"cell_type":"code","source":"directory = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/train/tdcsfog/'\n\n# Initialize an empty list to store DataFrames\ndfs = []\n\n# Iterate through each file in the directory\nfor filename in os.listdir(directory):  \n    file_path = os.path.join(directory, filename)\n    # Read the CSV file into a DataFrame and append to the list\n    df = pd.read_csv(file_path)\n    file_id = os.path.splitext(filename)[0]\n    df['Id_file'] = file_id\n    columns = ['Id_file']+[col for col in df if col != 'Id_file']\n    df = df[columns]\n    dfs.append(df)\n\n# Concatenate all DataFrames in the list into a single DataFrame\ndata = pd.concat(dfs, ignore_index=True) # The ignore_index=True argument is used to reset the index of the concatenated DataFrame so that it starts from 0 and increments linearly, regardless of the original indices of the individual DataFrames.","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:01:37.835730Z","iopub.execute_input":"2024-03-02T12:01:37.836248Z","iopub.status.idle":"2024-03-02T12:02:00.888858Z","shell.execute_reply.started":"2024-03-02T12:01:37.836221Z","shell.execute_reply":"2024-03-02T12:02:00.888013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"directory = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/train/defog'\n\n# Initialize an empty list to store DataFrames\ndefog_dfs = []\n\n# Iterate through each file in the directory\nfor filename in os.listdir(directory):  \n    file_path = os.path.join(directory, filename)\n    # Read the CSV file into a DataFrame and append to the list\n    df = pd.read_csv(file_path)\n    file_id = os.path.splitext(filename)[0]\n    df['Id_file'] = file_id\n    columns = ['Id_file']+[col for col in df if col != 'Id_file']\n    df = df[columns]\n    defog_dfs.append(df)\n\n# Concatenate all DataFrames in the list into a single DataFrame\ndefogdata = pd.concat(defog_dfs, ignore_index=True) # The ignore_index=True argument is used to reset the index of the concatenated DataFrame so that it starts from 0 and increments linearly, regardless of the original indices of the individual DataFrames.","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:02:00.890000Z","iopub.execute_input":"2024-03-02T12:02:00.890288Z","iopub.status.idle":"2024-03-02T12:02:30.997379Z","shell.execute_reply.started":"2024-03-02T12:02:00.890265Z","shell.execute_reply":"2024-03-02T12:02:30.996524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filtereddefog_df = defogdata[(defogdata['Valid'] == True) & (defogdata['Task'] == True)]","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:02:30.999443Z","iopub.execute_input":"2024-03-02T12:02:30.999745Z","iopub.status.idle":"2024-03-02T12:02:31.273002Z","shell.execute_reply.started":"2024-03-02T12:02:30.999721Z","shell.execute_reply":"2024-03-02T12:02:31.272146Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.concat([data,filtereddefog_df],ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:02:31.274385Z","iopub.execute_input":"2024-03-02T12:02:31.274798Z","iopub.status.idle":"2024-03-02T12:02:32.254535Z","shell.execute_reply.started":"2024-03-02T12:02:31.274763Z","shell.execute_reply":"2024-03-02T12:02:32.253672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = data.sample(n=100000, random_state=42)\ndata","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:02:32.255832Z","iopub.execute_input":"2024-03-02T12:02:32.256195Z","iopub.status.idle":"2024-03-02T12:02:32.926853Z","shell.execute_reply.started":"2024-03-02T12:02:32.256163Z","shell.execute_reply":"2024-03-02T12:02:32.925870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = data[['AccV','AccML','AccAP']].copy().values\ny_walking_train = data['Walking']\ny_turn_train = data['Turn']\ny_SH_train = data['StartHesitation']","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:02:32.927957Z","iopub.execute_input":"2024-03-02T12:02:32.928234Z","iopub.status.idle":"2024-03-02T12:02:32.939145Z","shell.execute_reply.started":"2024-03-02T12:02:32.928212Z","shell.execute_reply":"2024-03-02T12:02:32.938148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(x_train)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:05:20.586147Z","iopub.execute_input":"2024-03-02T12:05:20.586548Z","iopub.status.idle":"2024-03-02T12:05:20.592688Z","shell.execute_reply.started":"2024-03-02T12:05:20.586518Z","shell.execute_reply":"2024-03-02T12:05:20.591393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], 1))\n\nnum_classes = 2\n\n# idx = np.random.permutation(len(x_train))\n# x_train = x_train[idx]\n# y_walking_train = y_walking_train[idx]\n# y_turn_train = y_turn_train[idx]\n# y_SH_train = y_SH_train[idx]","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:05:44.529590Z","iopub.execute_input":"2024-03-02T12:05:44.530414Z","iopub.status.idle":"2024-03-02T12:05:44.534879Z","shell.execute_reply.started":"2024-03-02T12:05:44.530385Z","shell.execute_reply":"2024-03-02T12:05:44.533971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <font color='purple'>2.2. Test</font>","metadata":{}},{"cell_type":"code","source":"test_directory = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/test/tdcsfog'\n\n# Initialize an empty list to store DataFrames\ntest_dfs = []\n\n# Iterate through each file in the directory\nfor filename in os.listdir(test_directory):  \n    file_path = os.path.join(test_directory, filename)\n    # Read the CSV file into a DataFrame and append to the list\n    test_df = pd.read_csv(file_path)\n    file_id = os.path.splitext(filename)[0]\n    df['Id_file'] = file_id\n    columns = ['Id_file']+[col for col in df if col != 'Id_file']\n    df = df[columns]\n    test_dfs.append(df)\n# Concatenate all DataFrames in the list into a single DataFrame\ntest_data = pd.concat(test_dfs, ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:00.754148Z","iopub.execute_input":"2024-03-02T12:06:00.754528Z","iopub.status.idle":"2024-03-02T12:06:00.794108Z","shell.execute_reply.started":"2024-03-02T12:06:00.754499Z","shell.execute_reply":"2024-03-02T12:06:00.793248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_directory = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/test/defog'\n\n# Initialize an empty list to store DataFrames\ntest_dfs = []\n\n# Iterate through each file in the directory\nfor filename in os.listdir(test_directory):  \n    file_path = os.path.join(test_directory, filename)\n    # Read the CSV file into a DataFrame and append to the list\n    test_df = pd.read_csv(file_path)\n    file_id = os.path.splitext(filename)[0]\n    df['Id_file'] = file_id\n    columns = ['Id_file']+[col for col in df if col != 'Id_file']\n    df = df[columns]\n    test_dfs.append(df)\n# Concatenate all DataFrames in the list into a single DataFrame\ntest_defogdata = pd.concat(test_dfs, ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:01.056870Z","iopub.execute_input":"2024-03-02T12:06:01.057543Z","iopub.status.idle":"2024-03-02T12:06:01.499820Z","shell.execute_reply.started":"2024-03-02T12:06:01.057512Z","shell.execute_reply":"2024-03-02T12:06:01.498920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = pd.concat([test_data,test_defogdata],ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:01.501422Z","iopub.execute_input":"2024-03-02T12:06:01.501738Z","iopub.status.idle":"2024-03-02T12:06:01.511652Z","shell.execute_reply.started":"2024-03-02T12:06:01.501712Z","shell.execute_reply":"2024-03-02T12:06:01.510643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_test = test_data[['AccV','AccML','AccAP']].copy().values\ny_walking_test = test_data['Walking']\ny_turn_test = test_data['Turn']\ny_SH_test = test_data['StartHesitation']\n","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:01.700040Z","iopub.execute_input":"2024-03-02T12:06:01.700887Z","iopub.status.idle":"2024-03-02T12:06:01.711044Z","shell.execute_reply.started":"2024-03-02T12:06:01.700854Z","shell.execute_reply":"2024-03-02T12:06:01.710160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], 1))\nidx = np.random.permutation(len(x_test))\nx_test = x_test[idx]\ny_walking_test = y_walking_test[idx]\ny_turn_test = y_turn_test[idx]\ny_SH_test = y_SH_test[idx]","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:01.926762Z","iopub.execute_input":"2024-03-02T12:06:01.927106Z","iopub.status.idle":"2024-03-02T12:06:01.984585Z","shell.execute_reply.started":"2024-03-02T12:06:01.927081Z","shell.execute_reply":"2024-03-02T12:06:01.983755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <font color='orange'>3. CNN model</font>","metadata":{}},{"cell_type":"markdown","source":"### <font color='purple'>3.1. Defining model</font>","metadata":{}},{"cell_type":"code","source":"def make_model(input_shape):\n    input_layer = keras.layers.Input(input_shape)\n\n    # Define convolutional block with BatchNormalization and ReLU activation\n    def conv_block(x, filters, kernel_size):\n        x = keras.layers.Conv1D(filters=filters, kernel_size=kernel_size, padding=\"same\")(x)\n        x = keras.layers.BatchNormalization()(x)\n        x = keras.layers.ReLU()(x)\n        return x\n\n    # Three convolutional blocks\n    conv1 = conv_block(input_layer, filters=64, kernel_size=3)\n    conv2 = conv_block(conv1, filters=64, kernel_size=3)\n    conv3 = conv_block(conv2, filters=64, kernel_size=3)\n\n    \n    gap = keras.layers.GlobalAveragePooling1D()(conv3)\n\n    output_layer = keras.layers.Dense(num_classes, activation=\"sigmoid\")(gap)\n\n    return keras.models.Model(inputs=input_layer, outputs=output_layer)\n\n\nmodel = make_model(input_shape=x_train.shape[1:])","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:02.556108Z","iopub.execute_input":"2024-03-02T12:06:02.556961Z","iopub.status.idle":"2024-03-02T12:06:03.684365Z","shell.execute_reply.started":"2024-03-02T12:06:02.556929Z","shell.execute_reply":"2024-03-02T12:06:03.683479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:03.686011Z","iopub.execute_input":"2024-03-02T12:06:03.686329Z","iopub.status.idle":"2024-03-02T12:06:03.725223Z","shell.execute_reply.started":"2024-03-02T12:06:03.686285Z","shell.execute_reply":"2024-03-02T12:06:03.724151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <font color='purple'>3.2. Initializing model</font>","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import precision_score\noutput_layer = []\nepochs = 2\nbatch_size = 96\n\nmodel.compile(\n    optimizer=\"adam\",\n    loss=\"sparse_categorical_crossentropy\",\n    metrics=[\"sparse_categorical_accuracy\"],\n)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:03.726484Z","iopub.execute_input":"2024-03-02T12:06:03.726790Z","iopub.status.idle":"2024-03-02T12:06:03.750268Z","shell.execute_reply.started":"2024-03-02T12:06:03.726764Z","shell.execute_reply":"2024-03-02T12:06:03.749376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### <font color='purple'>3.3. Fitting model on training set and evaluating on test set</font>","metadata":{}},{"cell_type":"markdown","source":"### <font color='pink'>3.3.1. Walking FOG event</font>","metadata":{}},{"cell_type":"code","source":"history = model.fit(\n    x_train,\n    y_walking_train,\n    batch_size=batch_size,\n    epochs=epochs,\n)\n\nmodel.save('walking_model.keras')","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:03.859505Z","iopub.execute_input":"2024-03-02T12:06:03.859849Z","iopub.status.idle":"2024-03-02T12:06:46.567706Z","shell.execute_reply.started":"2024-03-02T12:06:03.859824Z","shell.execute_reply":"2024-03-02T12:06:46.566877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    x_train,\n    y_turn_train,\n    batch_size=batch_size,\n    epochs=epochs,\n)\nmodel.save('turn_model.keras')","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:06:46.569812Z","iopub.execute_input":"2024-03-02T12:06:46.570110Z","iopub.status.idle":"2024-03-02T12:07:08.363063Z","shell.execute_reply.started":"2024-03-02T12:06:46.570085Z","shell.execute_reply":"2024-03-02T12:07:08.362090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    x_train,\n    y_SH_train,\n    batch_size=batch_size,\n    epochs=epochs,\n)\nmodel.save('SH_model.keras')","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:07:08.364371Z","iopub.execute_input":"2024-03-02T12:07:08.365294Z","iopub.status.idle":"2024-03-02T12:07:30.259243Z","shell.execute_reply.started":"2024-03-02T12:07:08.365265Z","shell.execute_reply":"2024-03-02T12:07:30.258288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"w_model_path = '/kaggle/working/walking_model.keras'\nw_model = load_model(w_model_path)\ntest_w_loss, test_w_acc = w_model.evaluate(x_test, y_walking_test)\npredictions_walking = w_model.predict(x_test)\npredictions_walking = np.argmax(predictions_walking, axis=1)\npredictions_walking = pd.Series(predictions_walking)\n# precision = precision_score(y_walking_test, predictions_walking)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:07:30.261870Z","iopub.execute_input":"2024-03-02T12:07:30.262296Z","iopub.status.idle":"2024-03-02T12:08:02.630143Z","shell.execute_reply.started":"2024-03-02T12:07:30.262255Z","shell.execute_reply":"2024-03-02T12:08:02.629348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"t_model_path = '/kaggle/working/turn_model.keras'\nt_model = load_model(t_model_path)\ntest_t_loss, test_t_acc = t_model.evaluate(x_test, y_turn_test)\npredictions_turn = t_model.predict(x_test)\npredictions_turn = np.argmax(predictions_turn, axis=1)\npredictions_turn = pd.Series(predictions_turn)\n# precision = precision_score(y_walking_test, predictions_walking)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:08:02.631240Z","iopub.execute_input":"2024-03-02T12:08:02.631538Z","iopub.status.idle":"2024-03-02T12:08:33.566157Z","shell.execute_reply.started":"2024-03-02T12:08:02.631513Z","shell.execute_reply":"2024-03-02T12:08:33.565266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sh_model_path = '/kaggle/working/SH_model.keras'\nsh_model = load_model(t_model_path)\ntest_SH_loss, test_SH_acc = sh_model.evaluate(x_test, y_SH_test)\npredictions_SH = model.predict(x_test)\npredictions_SH = np.argmax(predictions_SH, axis=1)\npredictions_SH = pd.Series(predictions_SH)\n# precision = precision_score(y_walking_test, predictions_walking)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:08:33.567406Z","iopub.execute_input":"2024-03-02T12:08:33.567726Z","iopub.status.idle":"2024-03-02T12:09:04.957981Z","shell.execute_reply.started":"2024-03-02T12:08:33.567700Z","shell.execute_reply":"2024-03-02T12:09:04.957073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Id_seriestimepoints = test_data['Id_file'].astype(str)+'_'+test_data['Time'].astype(str)\nsubmission_df = pd.DataFrame({'Id':Id_seriestimepoints,'StartHesitation':predictions_SH,'Turn':predictions_turn,'Walking':predictions_walking})\nsubmission_df","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:09:04.959239Z","iopub.execute_input":"2024-03-02T12:09:04.959615Z","iopub.status.idle":"2024-03-02T12:09:05.181795Z","shell.execute_reply.started":"2024-03-02T12:09:04.959583Z","shell.execute_reply":"2024-03-02T12:09:05.180799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2024-03-02T12:09:05.182973Z","iopub.execute_input":"2024-03-02T12:09:05.183264Z","iopub.status.idle":"2024-03-02T12:09:05.781825Z","shell.execute_reply.started":"2024-03-02T12:09:05.183240Z","shell.execute_reply":"2024-03-02T12:09:05.780757Z"},"trusted":true},"execution_count":null,"outputs":[]}]}