{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\n# import os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-10T17:53:11.737092Z","iopub.execute_input":"2023-04-10T17:53:11.737542Z","iopub.status.idle":"2023-04-10T17:53:11.742637Z","shell.execute_reply.started":"2023-04-10T17:53:11.737493Z","shell.execute_reply":"2023-04-10T17:53:11.741629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Importing all necessary modules & packages \n\n# For Data Analysis , Sampling & Visualization\nimport numpy as np # linear algebra\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n\n# For Model Building Training and Preliminary Evaluation\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.svm import SVC\nfrom sklearn.preprocessing import scale\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import cross_val_score\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.utils import resample\nfrom sklearn.inspection import permutation_importance\nimport sklearn.metrics \n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:55:15.553840Z","iopub.execute_input":"2023-04-29T13:55:15.554260Z","iopub.status.idle":"2023-04-29T13:55:16.884773Z","shell.execute_reply.started":"2023-04-29T13:55:15.554218Z","shell.execute_reply":"2023-04-29T13:55:16.883235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Read in the train and test data\ntrain_df = pd.read_csv(\"/kaggle/input/parkinsons-training-data-subset/subset_data.csv\")\ntest_df = pd.read_csv(\"/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/test/defog/02ab235146.csv\")\n\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:55:20.647258Z","iopub.execute_input":"2023-04-29T13:55:20.647653Z","iopub.status.idle":"2023-04-29T13:55:36.450210Z","shell.execute_reply.started":"2023-04-29T13:55:20.647617Z","shell.execute_reply":"2023-04-29T13:55:36.448765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Quick Statistical Exploration","metadata":{}},{"cell_type":"code","source":"# Training dataset\ntrain_df.describe()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T17:16:46.301575Z","iopub.execute_input":"2023-04-27T17:16:46.302119Z","iopub.status.idle":"2023-04-27T17:16:48.142893Z","shell.execute_reply.started":"2023-04-27T17:16:46.302073Z","shell.execute_reply":"2023-04-27T17:16:48.141617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The Test dataset\ntest_df.describe()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T17:16:48.551287Z","iopub.execute_input":"2023-04-27T17:16:48.551743Z","iopub.status.idle":"2023-04-27T17:16:48.612674Z","shell.execute_reply.started":"2023-04-27T17:16:48.551700Z","shell.execute_reply":"2023-04-27T17:16:48.610999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Variable types of the dataframe\ntrain_df.info()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T17:17:55.051651Z","iopub.execute_input":"2023-04-27T17:17:55.052172Z","iopub.status.idle":"2023-04-27T17:17:55.068432Z","shell.execute_reply.started":"2023-04-27T17:17:55.052127Z","shell.execute_reply":"2023-04-27T17:17:55.066491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Checking for null values\ntrain_df.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T17:21:09.359155Z","iopub.execute_input":"2023-04-27T17:21:09.359651Z","iopub.status.idle":"2023-04-27T17:21:09.460514Z","shell.execute_reply.started":"2023-04-27T17:21:09.359600Z","shell.execute_reply":"2023-04-27T17:21:09.459003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Exploratory Data Visualization","metadata":{}},{"cell_type":"code","source":"# Countplots of the 3 different FOG events\nplt.figure(figsize = (16, 7))\nplt.subplot(1,3,1)\nsns.countplot(train_df, x = \"StartHesitation\")\nplt.title('StartHesitation FOG Occurrences')\n\nplt.subplot(1,3,2)\nsns.countplot(train_df, x = \"Turn\")\nplt.title('Turning FOG Occurrences')\n\nplt.subplot(1,3,3)\nsns.countplot(train_df, x = \"Walking\")\nplt.title('Walking FOG Occurrences')\nplt.show()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T18:04:12.423140Z","iopub.execute_input":"2023-04-27T18:04:12.423779Z","iopub.status.idle":"2023-04-27T18:04:14.143291Z","shell.execute_reply.started":"2023-04-27T18:04:12.423729Z","shell.execute_reply":"2023-04-27T18:04:14.141798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Filtering the training data to only include series where labellings of the FOG event was valid","metadata":{"execution":{"iopub.status.busy":"2023-04-12T14:18:31.812841Z","iopub.execute_input":"2023-04-12T14:18:31.813194Z","iopub.status.idle":"2023-04-12T14:18:31.926153Z","shell.execute_reply.started":"2023-04-12T14:18:31.813162Z","shell.execute_reply":"2023-04-12T14:18:31.924682Z"}}},{"cell_type":"code","source":"train_df = train_df[train_df[\"Valid\"] == True]\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-04-12T14:18:31.812841Z","iopub.execute_input":"2023-04-12T14:18:31.813194Z","iopub.status.idle":"2023-04-12T14:18:31.926153Z","shell.execute_reply.started":"2023-04-12T14:18:31.813162Z","shell.execute_reply":"2023-04-12T14:18:31.924682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Explicitly  Viewing the Relative Distribution of FOG event occurences (only valid)","metadata":{"execution":{"iopub.status.busy":"2023-04-12T14:18:42.865535Z","iopub.execute_input":"2023-04-12T14:18:42.865919Z","iopub.status.idle":"2023-04-12T14:18:43.112356Z","shell.execute_reply.started":"2023-04-12T14:18:42.865886Z","shell.execute_reply":"2023-04-12T14:18:43.111335Z"}}},{"cell_type":"code","source":"fog_occurrences = [train_df[\"StartHesitation\"].value_counts()[1], train_df[\"Turn\"].value_counts()[1], train_df[\"Walking\"].value_counts()[1]]\ntemp_df = pd.DataFrame({\n    \"FOG Events\": \"StartHesitation Turn Walking\".split(),\n    \"Count\": fog_occurrences\n})\n\n# Plotting\nplt.rcParams[\"figure.figsize\"] = [7.00, 4]\n\nsns.barplot(data = temp_df, x = \"FOG Events\", y = \"Count\")\nax = sns.barplot(data = temp_df, x = \"FOG Events\", y = \"Count\")\n\nfor p in ax.patches:\n    ax.annotate('{:.1f}'.format(p.get_height()), (p.get_x()+0.25, p.get_height()+2.0))\n\n    \nplt.title(\"Distribution of Different FOG event Occurrences in Parkinson Patients\")\nplt.tight_layout()\nplt.show()\n\n# NOTE: See how StartHesitation was the most difficult to have labelled!!","metadata":{"execution":{"iopub.status.busy":"2023-04-12T14:18:42.865535Z","iopub.execute_input":"2023-04-12T14:18:42.865919Z","iopub.status.idle":"2023-04-12T14:18:43.112356Z","shell.execute_reply.started":"2023-04-12T14:18:42.865886Z","shell.execute_reply":"2023-04-12T14:18:43.111335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Inlight of needing enough data for training the models, we cannot filter to only include unambiguous records but must instead include all and allow the model to train. \n(An acute Bias-Variance Trade off decision)","metadata":{}},{"cell_type":"code","source":"# Resetting the trainind data\ntrain_df = pd.read_csv(\"/kaggle/input/parkinsons-training-data-subset/subset_data.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-04-27T20:39:48.815404Z","iopub.execute_input":"2023-04-27T20:39:48.815863Z","iopub.status.idle":"2023-04-27T20:39:57.940006Z","shell.execute_reply.started":"2023-04-27T20:39:48.815823Z","shell.execute_reply":"2023-04-27T20:39:57.938604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Explicitly  Viewing the relative distribution of FOG event occurences\nfog_occurrences = [train_df[\"StartHesitation\"].value_counts()[1], train_df[\"Turn\"].value_counts()[1], train_df[\"Walking\"].value_counts()[1]]\ntemp_df = pd.DataFrame({\n    \"FOG Events\": \"StartHesitation Turn Walking\".split(),\n    \"Count\": fog_occurrences\n})\n\n# Plotting\nplt.rcParams[\"figure.figsize\"] = [7.00, 4]\n\nsns.barplot(data = temp_df, x = \"FOG Events\", y = \"Count\")\nax = sns.barplot(data = temp_df, x = \"FOG Events\", y = \"Count\")\n\nfor p in ax.patches:\n    ax.annotate('{:.1f}'.format(p.get_height()), (p.get_x()+0.25, p.get_height()+2.0))\n\n    \nplt.title(\"Distribution of Different FOG event Occurrences in Parkinson Patients\")\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-12T14:18:46.900042Z","iopub.execute_input":"2023-04-12T14:18:46.900405Z","iopub.status.idle":"2023-04-12T14:18:51.392176Z","shell.execute_reply.started":"2023-04-12T14:18:46.900372Z","shell.execute_reply":"2023-04-12T14:18:51.391372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Distribution of sensor recorded acceleration values as categorized in patients experiencing StartHesitation-FOG\n# NOTE: As the classes are imablanced comparing distributions in terms of counts is not ideal so we intead normalize the data by use of the stat parameter\n\nplt.figure(figsize = (16, 7))\nplt.subplot(1,3,1)\nsns.histplot(train_df, x = 'AccV', hue = 'StartHesitation', stat = 'density', fill = True, kde = True)\nplt.xlabel('Vertical Acceleration')\nplt.title('AccV under normal conditions vs FOG conditions')\n# plt.ylim(0, 20)\n\nplt.subplot(1,3,2)\nsns.histplot(train_df, x = \"AccML\", hue = 'StartHesitation', stat = 'density', fill = True, kde = True)\nplt.xlabel('Mediolateral Acceleration')\nplt.title('AccML under normal conditions vs FOG conditions')\n\nplt.subplot(1,3,3)\nsns.histplot(train_df, x = \"AccAP\", hue = 'StartHesitation', stat = 'density', fill = True, kde = True)\nplt.xlabel('Anteroposterior Acceleration')\nplt.title('AccAP under normal conditions vs FOG conditions')\nplt.show()\n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-12T14:20:13.847563Z","iopub.execute_input":"2023-04-12T14:20:13.847890Z","iopub.status.idle":"2023-04-12T14:23:05.031467Z","shell.execute_reply.started":"2023-04-12T14:20:13.847859Z","shell.execute_reply":"2023-04-12T14:23:05.030452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Distribution of sensor recorded acceleration values as categorized in patients experiencing Walking-FOG\n\nplt.figure(figsize = (16, 7))\nplt.subplot(1,3,1)\nsns.histplot(train_df, x = 'AccV', hue = 'Walking', stat = 'density', fill = True, kde = True)\nplt.xlabel('Vertical Acceleration')\nplt.title('AccV under normal conditions vs FOG conditions')\n\nplt.subplot(1,3,2)\nsns.histplot(train_df, x = \"AccML\", hue = 'Walking', stat = 'density', fill = True,kde = True)\nplt.xlabel('Mediolateral Acceleration')\nplt.title('AccML under normal conditions vs FOG conditions')\n\nplt.subplot(1,3,3)\nsns.histplot(train_df, x = \"AccAP\", hue = 'Walking', stat = 'density', fill = True,kde = True)\nplt.xlabel('Anteroposterior Acceleration')\nplt.title('AccAP under normal conditions vs FOG conditions')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-04-12T12:39:51.847949Z","iopub.execute_input":"2023-04-12T12:39:51.848435Z","iopub.status.idle":"2023-04-12T12:42:42.079481Z","shell.execute_reply.started":"2023-04-12T12:39:51.848397Z","shell.execute_reply":"2023-04-12T12:42:42.078582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Distribution of sensor recorded acceleration values as categorized in patients experiencing Turn-FOG\n\nplt.figure(figsize = (16, 7))\nplt.subplot(1,3,1)\nsns.histplot(train_df, x = 'AccV', hue = 'Turn', stat = 'density', fill = True, kde = True)\nplt.xlabel('Vertical Acceleration')\nplt.title('AccV under normal conditions vs FOG conditions')\n\nplt.subplot(1,3,2)\nsns.histplot(train_df, x = \"AccML\", hue = 'Turn', stat = 'density', fill = True, kde = True)\nplt.xlabel('Mediolateral Acceleration')\nplt.title('AccML under normal conditions vs FOG conditions')\n\nplt.subplot(1,3,3)\nsns.histplot(train_df, x = \"AccAP\", hue = 'Turn', stat = 'density', fill = True, kde = True)\nplt.xlabel('Anteroposterior Acceleration')\nplt.title('AccAP under normal conditions vs FOG conditions')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-04-12T11:58:41.441849Z","iopub.execute_input":"2023-04-12T11:58:41.442315Z","iopub.status.idle":"2023-04-12T12:01:35.075429Z","shell.execute_reply.started":"2023-04-12T11:58:41.442261Z","shell.execute_reply":"2023-04-12T12:01:35.074151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Building ,Training & Evaluation","metadata":{}},{"cell_type":"markdown","source":"### Random Forest","metadata":{}},{"cell_type":"code","source":"# RANDOM FOREST CLASSIFICATION\n# Defining the Training Data set and Validation Data set (Traditionally called Test set)\nfeatures = ['AccV', 'AccML', 'AccAP']\n\nX = train_df[features]\ny = [train_df['StartHesitation'],train_df['Turn'],train_df['Walking']]\n\n\n# Building all the Ransvm_accuracy Forest models with the various target data in the order outlined in y\nrfc_model = []\ny_pred = []\ny_true = []\nfor i in range(3):\n    X_train, X_test, y_train, y_test = train_test_split(X, y[i], test_size = 0.3)\n    model = RandomForestClassifier(n_estimators = 100,\n                                        criterion = \"gini\",\n                                        max_depth = 5,\n                                        random_state = 5)\n    rfc_model.append(model)\n    \n    # Fitting the model \n    rfc_model[i].fit(X_train, y_train)\n    \n    # Testing the model on the validation set\n    y_prediction = rfc_model[i].predict(X_test)\n    y_pred.append(y_prediction)\n    y_true.append(y_test)\n  \n    \n","metadata":{"execution":{"iopub.status.busy":"2023-04-27T20:41:11.435054Z","iopub.execute_input":"2023-04-27T20:41:11.435639Z","iopub.status.idle":"2023-04-27T21:18:04.994263Z","shell.execute_reply.started":"2023-04-27T20:41:11.435590Z","shell.execute_reply":"2023-04-27T21:18:04.992726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Model Evaluation (Random Forest)","metadata":{}},{"cell_type":"code","source":"# Assessing Model Accuracy\nrfc_accuracy = [sklearn.metrics.accuracy_score(y_true[i].values, y_pred[i]) for i in range(3)]\nrfc_precision = [sklearn.metrics.precision_score(y_true[i].values, y_pred[i], average = 'micro', zero_division = 0) for i in range(3)] # Priroritized\nrfc_recall = [sklearn.metrics.recall_score(y_true[i].values, y_pred[i], average = 'micro', zero_division= 0) for i in range(3)]\nrfc_f1score = [sklearn.metrics.f1_score(y_true[i].values, y_pred[i], average = 'micro', zero_division= 0) for i in range(3)]\nrfc_metrics = [rfc_accuracy, rfc_precision, rfc_recall, rfc_f1score]\n\n\n# Model Metrics Dataframe\nrfc_metrics_df = pd.DataFrame(\n    data = rfc_metrics, \n    columns = [\"StartHesitation\", \"Turning\", \"Walking\"],\n    index = [\"Accuracy\", \"Precision\", \"Recall\", \"F1 Score\"]\n)\n\nrfc_metrics_df","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:16:08.319372Z","iopub.execute_input":"2023-04-28T00:16:08.321138Z","iopub.status.idle":"2023-04-28T00:16:08.342255Z","shell.execute_reply.started":"2023-04-28T00:16:08.321083Z","shell.execute_reply":"2023-04-28T00:16:08.341094Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Visualizing Key Classification Metrics","metadata":{}},{"cell_type":"code","source":"#  Exclusively Visualizing Accuracy\ntemp_df = pd.DataFrame({\n    \"FOG Event\":['StartHesitation','Turn','Walking'],\n    \"Model Prediction Accuracy\": rfc_metrics_df.loc[\"Accuracy\"]\n})\n\nsns.catplot(data = temp_df, x = \"FOG Event\", y =\"Model Prediction Accuracy\", kind =  \"bar\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T21:33:02.151199Z","iopub.execute_input":"2023-04-27T21:33:02.151630Z","iopub.status.idle":"2023-04-27T21:33:02.485421Z","shell.execute_reply.started":"2023-04-27T21:33:02.151593Z","shell.execute_reply":"2023-04-27T21:33:02.483785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Precision, Recall and F1 Score for each FoG Prediction\\\n\nplt.figure(figsize = (16, 5))\nplt.suptitle(\"RF Classifier Metrics\", fontsize=14)\n\nplt.subplot(1,3,1)\nsns.barplot(rfc_metrics_df.loc[\"Precision\":])\nplt.title('Model Prediction Precision')\nplt.ylabel(\"Score\")\n\nplt.subplot(1,3,2)\nsns.barplot(rfc_metrics_df.loc[\"Recall\":])\nplt.title('Model Prediction Recall')\n\n\nplt.subplot(1,3,3)\nsns.barplot(rfc_metrics_df.loc[\"F1 Score\":])\nplt.title('Model Prediction F1 Score')\n\n\nplt.show()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T21:33:07.169146Z","iopub.execute_input":"2023-04-27T21:33:07.169689Z","iopub.status.idle":"2023-04-27T21:33:07.705942Z","shell.execute_reply.started":"2023-04-27T21:33:07.169639Z","shell.execute_reply":"2023-04-27T21:33:07.704462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Confusion Matrix\nrfc_ConMat = []\nfor i in range(3):\n    rfc_ConMat.append(sklearn.metrics.confusion_matrix(y_true[i].values, y_pred[i]))\n\nplt.rcParams[\"figure.figsize\"] = [10.00, 6]\n\n# StartHesitation\ndisp_Starthesitation = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= rfc_ConMat[0])\ndisp_Starthesitation.plot()\nplt.title('Confusion Matrix for StartHestiation FOG Predictions')\nplt.tight_layout()\n\n\n# Turning\ndisp_Turn = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= rfc_ConMat[1])\ndisp_Turn.plot()\nplt.title('Confusion Matrix for Turning FOG Predictions')\nplt.tight_layout()\n\n# Walking\ndisp_Walking = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= rfc_ConMat[2])\ndisp_Walking.plot()\nplt.title('Confusion Matrix for Walking FOG Predictions')\nplt.tight_layout()\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T21:36:05.008398Z","iopub.execute_input":"2023-04-27T21:36:05.008858Z","iopub.status.idle":"2023-04-27T21:36:06.786003Z","shell.execute_reply.started":"2023-04-27T21:36:05.008820Z","shell.execute_reply":"2023-04-27T21:36:06.784771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Feature Importance as determined by Random Forest\nimportances = [rfc_model[i].feature_importances_ for i in range(3)]\nindicies = [np.argsort(importances[i]) for i in range(3)]\nfog_events = ['StartHesitation','Turning','Walking']\nplt.figure(figsize = (16, 5))\nfor x in range(3):\n    title_text = \"Feature Importance in predicting a \" + fog_events[x] + \" FOG event\"\n    plt.subplot(1,3,x+1)\n    plt.title(title_text)\n    plt.barh(range(len(indicies[x])), importances[x][indicies[x]], color = 'teal', align = 'center')\n    plt.yticks(range(len(indicies[x])) ,[features[i] for i in indicies[x]])\n    plt.xlabel(\"Relative Importance\")    \n    \nplt.tight_layout()\nplt.show()\n                                     \n                                    ","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:34:07.707034Z","iopub.execute_input":"2023-04-28T00:34:07.707460Z","iopub.status.idle":"2023-04-28T00:34:08.271794Z","shell.execute_reply.started":"2023-04-28T00:34:07.707424Z","shell.execute_reply":"2023-04-28T00:34:08.270394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Down Sampling the data to deal with Misclassification due to Training set imbalance\n","metadata":{}},{"cell_type":"code","source":"# Down Sampling the data\n\ntargets = [\"StartHesitation\", \"Turn\", \"Walking\"]\ndown_sampled_dfs = []\n\n# Downsampling the data for each FOG event\nfor target in targets:\n    # Segmenting\n    no_fog = train_df[train_df[target]== 0]\n    fog = train_df[train_df[target]== 1]\n\n    # Sampling the segments, NB: The largest sample number we can choose is lmited by the target variable with the smallest number of rows positive. I.E StartHesitation\n    no_fog_sampled = resample(no_fog, replace = False, n_samples = 240, random_state = 42)\n    fog_sampled = resample(fog, replace = False, n_samples = 240, random_state = 42)\n\n    # Merging the sampled segments\n    downsampled_df = pd.concat([no_fog_sampled, fog_sampled])\n    down_sampled_dfs.append(downsampled_df)\n\n# Concatenating into one final Down Sampled training Dataframe\nds_train_df = pd.concat(down_sampled_dfs)","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:56:04.193919Z","iopub.execute_input":"2023-04-29T13:56:04.194567Z","iopub.status.idle":"2023-04-29T13:56:06.177318Z","shell.execute_reply.started":"2023-04-29T13:56:04.194513Z","shell.execute_reply":"2023-04-29T13:56:06.176002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Visualizing the distribution of the resampled dataset","metadata":{}},{"cell_type":"code","source":"# Countplots of the 3 different FOG events\nplt.figure(figsize = (16, 7))\nplt.subplot(1,3,1)\nsns.countplot(ds_train_df, x = \"StartHesitation\")\nplt.title('StartHesitation FOG Occurrences')\n\nplt.subplot(1,3,2)\nsns.countplot(ds_train_df, x = \"Turn\")\nplt.title('Turning FOG Occurrences')\n\nplt.subplot(1,3,3)\nsns.countplot(ds_train_df, x = \"Walking\")\nplt.title('Walking FOG Occurrences')\nplt.show()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:56:10.506130Z","iopub.execute_input":"2023-04-29T13:56:10.507250Z","iopub.status.idle":"2023-04-29T13:56:10.957872Z","shell.execute_reply.started":"2023-04-29T13:56:10.507154Z","shell.execute_reply":"2023-04-29T13:56:10.956364Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Re-running the RF Classification Model","metadata":{}},{"cell_type":"code","source":"# RANDOM FOREST CLASSIFICATION\n# Defining the Training Data set and Validation Data set (Traditionally called Test set)\nfeatures = ['AccV', 'AccML', 'AccAP']\n\nX = ds_train_df[features]\ny = [ds_train_df['StartHesitation'],ds_train_df['Turn'],ds_train_df['Walking']]\n\n\n# Building all the Ransvm_accuracy Forest models with the various target data in the order outlined in y\nrfc_model = []\ny_pred = []\ny_true = []\nfor i in range(3):\n    X_train, X_test, y_train, y_test = train_test_split(X, y[i], test_size = 0.3)\n    model = RandomForestClassifier(n_estimators = 100,\n                                        criterion = \"gini\",\n                                        max_depth = 5,\n                                        random_state = 5)\n    rfc_model.append(model)\n    \n    # Fitting the model \n    rfc_model[i].fit(X_train, y_train)\n    \n    # Testing the model on the validation set\n    y_prediction = rfc_model[i].predict(X_test)\n    y_pred.append(y_prediction)\n    y_true.append(y_test)\n  \n    \n# Assessing Model Accuracy\nrfc2_accuracy = [sklearn.metrics.accuracy_score(y_true[i].values, y_pred[i]) for i in range(3)]\nrfc2_precision = [sklearn.metrics.precision_score(y_true[i].values, y_pred[i], average = 'micro', zero_division = 0) for i in range(3)]\nrfc2_recall = [sklearn.metrics.recall_score(y_true[i].values, y_pred[i], average = 'micro', zero_division= 0) for i in range(3)]\nrfc2_f1score = [sklearn.metrics.f1_score(y_true[i].values, y_pred[i], average = 'micro', zero_division= 0) for i in range(3)]\nrfc2_metrics = [rfc2_accuracy,rfc2_precision, rfc2_recall, rfc2_f1score]\n\n\n# Model Metrics Dataframe\nrfc2_metrics_df = pd.DataFrame(\n    data = rfc2_metrics, \n    columns = [\"StartHesitation\", \"Turning\", \"Walking\"],\n    index = [\"Accuracy\", \"Precision\", \"Recall\", \"F1 Score\"]\n)\n\nrfc2_metrics_df\n    ","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:36:19.105505Z","iopub.execute_input":"2023-04-28T00:36:19.105962Z","iopub.status.idle":"2023-04-28T00:36:19.736551Z","shell.execute_reply.started":"2023-04-28T00:36:19.105925Z","shell.execute_reply":"2023-04-28T00:36:19.735311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Precision, Recall and F1 Score for each FoG Prediction\n\nplt.figure(figsize = (16, 5))\nplt.suptitle(\"RF Classifier Metrics\", fontsize=14)\n\nplt.subplot(1,3,1)\nsns.barplot(rfc2_metrics_df.loc[\"Precision\":])\nplt.title('Model Prediction Precision')\nplt.ylabel(\"Score\")\n\nplt.subplot(1,3,2)\nsns.barplot(rfc2_metrics_df.loc[\"Recall\":])\nplt.title('Model Prediction Recall')\n\n\nplt.subplot(1,3,3)\nsns.barplot(rfc2_metrics_df.loc[\"F1 Score\":])\nplt.title('Model Prediction F1 Score')\n\n\nplt.show()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:56:10.702743Z","iopub.execute_input":"2023-04-28T00:56:10.703287Z","iopub.status.idle":"2023-04-28T00:56:11.228122Z","shell.execute_reply.started":"2023-04-28T00:56:10.703242Z","shell.execute_reply":"2023-04-28T00:56:11.226600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Feature Importance as determined by Random Forest\nimportances = [rfc_model[i].feature_importances_ for i in range(3)]\nindicies = [np.argsort(importances[i]) for i in range(3)]\nfog_events = ['StartHesitation','Turning','Walking']\nplt.figure(figsize = (16, 5))\nfor x in range(3):\n    title_text = \"Feature Importance in predicting a \" + fog_events[x] + \" FOG event\"\n    plt.subplot(1,3,x+1)\n    plt.title(title_text)\n    plt.barh(range(len(indicies[x])), importances[x][indicies[x]], color = 'teal', align = 'center')\n    plt.yticks(range(len(indicies[x])) ,[features[i] for i in indicies[x]])\n    plt.xlabel(\"Relative Importance\")    \n    \nplt.tight_layout()\nplt.show()\n                                     \n                                    ","metadata":{"execution":{"iopub.status.busy":"2023-04-28T01:19:26.652295Z","iopub.execute_input":"2023-04-28T01:19:26.652877Z","iopub.status.idle":"2023-04-28T01:19:27.186434Z","shell.execute_reply.started":"2023-04-28T01:19:26.652834Z","shell.execute_reply":"2023-04-28T01:19:27.185034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Confusion Matrix\nrfc_ConMat = []\nfor i in range(3):\n    rfc_ConMat.append(sklearn.metrics.confusion_matrix(y_true[i].values, y_pred[i]))\n\nplt.rcParams[\"figure.figsize\"] = [10.00, 6]\n\n# StartHesitation\ndisp_Starthesitation = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= rfc_ConMat[0])\ndisp_Starthesitation.plot()\nplt.title('Confusion Matrix for StartHestiation FOG Predictions')\nplt.tight_layout()\n\n\n# Turning\ndisp_Turn = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= rfc_ConMat[1])\ndisp_Turn.plot()\nplt.title('Confusion Matrix for Turning FOG Predictions')\nplt.tight_layout()\n\n# Walking\ndisp_Walking = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= rfc_ConMat[2])\ndisp_Walking.plot()\nplt.title('Confusion Matrix for Walking FOG Predictions')\nplt.tight_layout()\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:29:29.436994Z","iopub.execute_input":"2023-04-28T00:29:29.437485Z","iopub.status.idle":"2023-04-28T00:29:30.348569Z","shell.execute_reply.started":"2023-04-28T00:29:29.437444Z","shell.execute_reply":"2023-04-28T00:29:30.347286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Support Vector Machines\n\n","metadata":{}},{"cell_type":"code","source":"# SUPPORT VECTOR MACHINE CLASSIFICATION\n\n# Down Sampling the data\n# Owing to its mathematical construct, SVM is a great machine learning technique for relatively smaller datasets than it is on huge datasets.\n# With such a huge dataset, it will take a very long time to optimize parameters with Cross Validation. Therefore we downsample to a more manageable amount to train the model.\n\ntargets = [\"StartHesitation\", \"Turn\", \"Walking\"]\ndown_sampled_dfs = []\n\n# Downsampling the data for each FOG event\nfor target in targets:\n    # Segmenting\n    no_fog = train_df[train_df[target]== 0]\n    fog = train_df[train_df[target]== 1]\n\n    # Sampling the segments, NB: The highest sample number we can make is lmited by the target variable with the smallest number of rows positive. I.E StartHesitation\n    no_fog_sampled = resample(no_fog, replace = False, n_samples = 240, random_state = 42)\n    fog_sampled = resample(fog, replace = False, n_samples = 240, random_state = 42)\n\n    # Merging the sampled segments\n    downsampled_df = pd.concat([no_fog_sampled, fog_sampled])\n    down_sampled_dfs.append(downsampled_df)\n\n# Concatenating into one final Dataframe\nsvm_train_df = pd.concat(down_sampled_dfs)","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:41:39.266243Z","iopub.execute_input":"2023-04-28T00:41:39.268354Z","iopub.status.idle":"2023-04-28T00:41:41.294714Z","shell.execute_reply.started":"2023-04-28T00:41:39.268267Z","shell.execute_reply":"2023-04-28T00:41:41.293308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# SVM CLASSIFICATION\n# Defining the Training Data set and Validation Data set (Traditionally called Test set)\nfeatures = ['AccV', 'AccML', 'AccAP']\n\n# Utilizing the downsampled data\nX = ds_train_df[features]\ny = [ds_train_df['StartHesitation'],ds_train_df['Turn'],ds_train_df['Walking']]\n\n\n# Building the SVM models with the various target data in the order outlined in y\nsvm_model = []\ny_pred = []\ny_true = []\nperm_importances = []\nfor i in range(3):\n    X_train, X_test, y_train, y_test = train_test_split(X, y[i], test_size = 0.3)\n    model = SVC(random_state = 42)\n    \n    svm_model.append(model)\n    \n    # The Radial Basis Function is here employed  by default within the SVM algorithm and assumes the feature data is centered amd scale.\n    # Therefore we first perform centering and scaling on the feature data for both the training and validation set\n    X_train_scaled = scale(X_train)\n    X_test_scaled = scale(X_test)\n\n    # Fitting the model \n    svm_model[i].fit(X_train_scaled, y_train)\n    \n    # Testing the model on the validation set\n    y_prediction = svm_model[i].predict(X_test_scaled)\n    \n    # Logging predictive feature importance\n    perm_importances.append(permutation_importance(svm_model[i], X_test_scaled, y_test))\n    \n    y_pred.append(y_prediction)\n    y_true.append(y_test)\n  \n    ","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:57:56.181892Z","iopub.execute_input":"2023-04-28T00:57:56.182428Z","iopub.status.idle":"2023-04-28T00:57:56.756052Z","shell.execute_reply.started":"2023-04-28T00:57:56.182384Z","shell.execute_reply":"2023-04-28T00:57:56.754465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Model Evaluation (Support Vector Machines)","metadata":{}},{"cell_type":"code","source":"# Assessing Model Accuracy\nsvm_accuracy = [sklearn.metrics.accuracy_score(y_true[i].values, y_pred[i]) for i in range(3)]\nsvm_precision = [sklearn.metrics.precision_score(y_true[i].values, y_pred[i], average = 'micro', zero_division = 0) for i in range(3)]\nsvm_recall = [sklearn.metrics.recall_score(y_true[i].values, y_pred[i], average = 'micro', zero_division = 0) for i in range(3)]\nsvm_f1score = [sklearn.metrics.f1_score(y_true[i].values, y_pred[i], average = 'micro', zero_division = 0) for i in range(3)]\nsvm_metrics = [svm_accuracy, svm_precision, svm_recall, svm_f1score]\n\n# Model Metrics Dataframe\nsvm_metrics_df = pd.DataFrame(\n    data = svm_metrics, \n    columns = [\"StartHesitation\", \"Turning\", \"Walking\"],\n    index = [\"Accuracy\", \"Precision\", \"Recall\", \"F1 Score\"]\n)\n\nsvm_metrics_df","metadata":{"execution":{"iopub.status.busy":"2023-04-28T00:58:02.933109Z","iopub.execute_input":"2023-04-28T00:58:02.934051Z","iopub.status.idle":"2023-04-28T00:58:02.965228Z","shell.execute_reply.started":"2023-04-28T00:58:02.933982Z","shell.execute_reply":"2023-04-28T00:58:02.964016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualizing Key Classification Metrics","metadata":{}},{"cell_type":"code","source":"# Visualzing Accuracy\ntemp_df = pd.DataFrame({\n    \"FOG Event\":['StartHesitation','Turn','Walking'],\n    \"Model Prediction Accuracy\": svm_metrics_df.loc[\"Accuracy\"]\n})\n\nsns.catplot(data = temp_df, x = \"FOG Event\", y =\"Model Prediction Accuracy\", kind =  \"bar\")\nplt.yticks(np.arange(0, 1, step=0.1))\nplt.title(\"SVM Accuracy\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T01:13:52.346094Z","iopub.execute_input":"2023-04-28T01:13:52.347400Z","iopub.status.idle":"2023-04-28T01:13:52.640741Z","shell.execute_reply.started":"2023-04-28T01:13:52.347309Z","shell.execute_reply":"2023-04-28T01:13:52.638893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Intuitively Comparing the accuracy of the RF and SVM Classifiers\nRF_SVM_accuracy = pd.concat([rfc2_metrics_df.loc[\"Accuracy\"], svm_metrics_df.loc[\"Accuracy\"]] )\n\nrfc_accuracy =  np.array(rfc2_metrics_df.loc[\"Accuracy\"]).reshape(1,3)\nsvm_accuracy =  np.array(svm_metrics_df.loc[\"Accuracy\"]).reshape(1,3)\n\n\naccuracy_comp = pd.DataFrame(\n    data = np.vstack((rfc_accuracy, svm_accuracy)),\n    columns = [\"StartHesitation\", \"Turning\", \"Walking\"],\n    index = [\"Random Forest\", \"SVM\"]\n)\naccuracy_comp['model'] = accuracy_comp.index\nsns.lineplot(data = accuracy_comp)\nplt.xlabel(\"Classification Model Type\", size = 12)\nplt.ylabel(\"Accuracy (%)\", size = 12)\nplt.title(\"Relationship Between Model Type & Accuracy of Prediciting a Particular FOG Event\", size = 15)\n\nplt.rcParams[\"figure.figsize\"] = [12, 6]\nplt.tick_params(axis = 'both', labelright=True)\nplt.show()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T01:14:04.968148Z","iopub.execute_input":"2023-04-28T01:14:04.968702Z","iopub.status.idle":"2023-04-28T01:14:05.303636Z","shell.execute_reply.started":"2023-04-28T01:14:04.968655Z","shell.execute_reply":"2023-04-28T01:14:05.302270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Precision, Recall and F1 Score for each FoG Prediction\n\nplt.figure(figsize = (16, 5))\nplt.suptitle(\"SVM Classifier Metrics\", fontsize=14)\n\nplt.subplot(1,3,1)\nsns.barplot(svm_metrics_df.loc[\"Precision\":])\nplt.title('Model Prediction Precision')\nplt.ylabel(\"Score\")\n\nplt.subplot(1,3,2)\nsns.barplot(svm_metrics_df.loc[\"Recall\":])\nplt.title('Model Prediction Recall')\n\n\nplt.subplot(1,3,3)\nsns.barplot(svm_metrics_df.loc[\"F1 Score\":])\nplt.title('Model Prediction F1 Score')\n\n\nplt.show()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-04-28T01:13:36.709769Z","iopub.execute_input":"2023-04-28T01:13:36.711223Z","iopub.status.idle":"2023-04-28T01:13:37.238092Z","shell.execute_reply.started":"2023-04-28T01:13:36.711171Z","shell.execute_reply":"2023-04-28T01:13:37.236676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Confusion Matrix\nsvm_ConMat = []\nfor i in range(3):\n    svm_ConMat.append(sklearn.metrics.confusion_matrix(y_true[i].values, y_pred[i]))\n\nplt.rcParams[\"figure.figsize\"] = [10.00, 6]\n\n# StartHesitation\ndisp_Starthesitation = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= svm_ConMat[0])\ndisp_Starthesitation.plot()\nplt.title('Confusion Matrix for StartHestiation FOG Predictions')\nplt.tight_layout()\n\n\n# Turning\ndisp_Turn = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= svm_ConMat[1])\ndisp_Turn.plot()\nplt.title('Confusion Matrix for Turning FOG Predictions')\nplt.tight_layout()\n\n# Walking\ndisp_Walking = sklearn.metrics.ConfusionMatrixDisplay(confusion_matrix= svm_ConMat[2])\ndisp_Walking.plot()\nplt.title('Confusion Matrix for Walking FOG Predictions')\nplt.tight_layout()\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-27T18:51:05.902237Z","iopub.execute_input":"2023-04-27T18:51:05.902970Z","iopub.status.idle":"2023-04-27T18:51:06.807896Z","shell.execute_reply.started":"2023-04-27T18:51:05.902889Z","shell.execute_reply":"2023-04-27T18:51:06.806547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing Feature Importance as determined by SVM\n\nfog_events = ['StartHesitation','Turning','Walking']\nfeatures = np.array(features)\nsorted_idx = [perm_importances[i].importances_mean.argsort() for i in range(3)]\n\nplt.figure(figsize = (18, 5))\nfor x in range(3):\n    title_text = \"Feature Importance in predicting a \" + fog_events[x] + \" FOG event\"\n    plt.subplot(1,3,x+1)\n    plt.title(title_text)\n#     plt.barh(range(len(sorted_idx[x])), perm_importances[x].importances_mean[sorted_idx[x]], color = 'teal', align = 'center')\n    plt.barh(features[sorted_idx[x]], perm_importances[x].importances_mean[sorted_idx[x]], color = 'teal')\n    plt.yticks(range(len(sorted_idx[x])) ,[features[i] for i in sorted_idx[x]])\n    plt.xlabel(\"Permutation Feature Importance\")    \n    \nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-04-28T01:19:56.535657Z","iopub.execute_input":"2023-04-28T01:19:56.537320Z","iopub.status.idle":"2023-04-28T01:19:57.077002Z","shell.execute_reply.started":"2023-04-28T01:19:56.537259Z","shell.execute_reply":"2023-04-28T01:19:57.075873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Comparing Model Performances","metadata":{}},{"cell_type":"code","source":"\ncomp_metrics = pd.concat([rfc2_metrics_df,svm_metrics_df])\n\nlabels = [\n    (\"Random Forest-\" * 4).split('-')[:-1] + (\"SVM-\" * 4).split('-')[:-1],\n    [\"Accuracy\", \"Precision\", \"Recall\", \"F1 Score\"] * 2\n] \n\ntuples = list(zip(*labels))\nindex = pd.MultiIndex.from_tuples(tuples, names=[\"Machine Learning Algorithm\", \"Classification Metric\"])\n\n# Create dataframe\nmetrics_final = pd.DataFrame(\n   comp_metrics.values,\n   index = index,\n   columns=[\"StartHesitation\", \"Turning\", \"Walking\"]\n)\n\n\nmetrics_final\n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-28T01:49:06.515547Z","iopub.execute_input":"2023-04-28T01:49:06.517400Z","iopub.status.idle":"2023-04-28T01:49:06.543860Z","shell.execute_reply.started":"2023-04-28T01:49:06.517328Z","shell.execute_reply":"2023-04-28T01:49:06.542139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Selection (Cross Validation Accuracy Assessment)","metadata":{}},{"cell_type":"markdown","source":"#### Performing Model Optimization & Selection via K-Fold Cross Validation metrics","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import cross_val_score\nfrom sklearn.model_selection import KFold","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:56:20.357692Z","iopub.execute_input":"2023-04-29T13:56:20.358969Z","iopub.status.idle":"2023-04-29T13:56:20.382232Z","shell.execute_reply.started":"2023-04-29T13:56:20.358921Z","shell.execute_reply":"2023-04-29T13:56:20.380898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Random Forest Cross Validation Scoring","metadata":{}},{"cell_type":"code","source":"# Setting up the Random Forest Cross Val Score model\nfeatures = ['AccV', 'AccML', 'AccAP']\n\n# Defining the x & y\nX = ds_train_df[features]\ny = [ds_train_df['StartHesitation'],ds_train_df['Turn'],ds_train_df['Walking']]\n\nk = 5\nkf = KFold(n_splits=k, random_state=None)\nrfc_model = RandomForestClassifier(n_estimators = 100,\n                                        criterion = \"gini\",\n                                        max_depth = 5,\n                                        random_state = 5)\n \nresult_RF = [cross_val_score(rfc_model , X, y[i], cv = kf).mean() for i in range(3)]","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:56:22.926268Z","iopub.execute_input":"2023-04-29T13:56:22.926685Z","iopub.status.idle":"2023-04-29T13:56:26.067994Z","shell.execute_reply.started":"2023-04-29T13:56:22.926648Z","shell.execute_reply":"2023-04-29T13:56:26.066569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Avg Cross Val Score: {}\".format(result_RF))\n# Avg Cross Val Score: [0.8645833333333334, 0.8208333333333332, 0.8125]","metadata":{"execution":{"iopub.status.busy":"2023-04-29T13:56:32.408125Z","iopub.execute_input":"2023-04-29T13:56:32.408697Z","iopub.status.idle":"2023-04-29T13:56:32.415447Z","shell.execute_reply.started":"2023-04-29T13:56:32.408645Z","shell.execute_reply":"2023-04-29T13:56:32.414006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### SVM Cross Validation Scoring","metadata":{}},{"cell_type":"code","source":"# Setting up the SVM cross val score model\nfeatures = ['AccV', 'AccML', 'AccAP']\n\n# Defining the downsampled x & y (Previously defined)\nX = svm_train_df[features]\ny = [svm_train_df['StartHesitation'],svm_train_df['Turn'],svm_train_df['Walking']]\n\nk = 5\nkf = KFold(n_splits=k, random_state=None)\nsvm_model = SVC(random_state = 42)\n \nresult_SVM = [cross_val_score(svm_model , X, y[i], cv = kf).mean() for i in range(3)]","metadata":{"execution":{"iopub.status.busy":"2023-04-27T21:46:06.352198Z","iopub.execute_input":"2023-04-27T21:46:06.352641Z","iopub.status.idle":"2023-04-27T21:46:07.086761Z","shell.execute_reply.started":"2023-04-27T21:46:06.352603Z","shell.execute_reply":"2023-04-27T21:46:07.085708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Avg Cross Val Score: {}\".format(result_SVM))\n# Avg Cross Val Score: [0.8333333333333334, 0.81875, 0.826388888888889]  ","metadata":{"execution":{"iopub.status.busy":"2023-04-27T21:46:09.591637Z","iopub.execute_input":"2023-04-27T21:46:09.592500Z","iopub.status.idle":"2023-04-27T21:46:09.601643Z","shell.execute_reply.started":"2023-04-27T21:46:09.592438Z","shell.execute_reply":"2023-04-27T21:46:09.599697Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Deployment","metadata":{}},{"cell_type":"code","source":"\ntest_labels_df = pd.read_csv('/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/test/defog/02ab235146.csv')\ntest_labels = test_labels_df[['StartHesitation', 'Turn', 'Walking']].values\n\ntest_labels = np.array(test_df[['Time', 'AccV', 'AccML', 'AccAP']])\n","metadata":{"execution":{"iopub.status.busy":"2023-04-09T02:54:50.771971Z","iopub.execute_input":"2023-04-09T02:54:50.772439Z","iopub.status.idle":"2023-04-09T02:54:50.794000Z","shell.execute_reply.started":"2023-04-09T02:54:50.772400Z","shell.execute_reply":"2023-04-09T02:54:50.792495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define the rolling window size and step\nwindow_size = 100\nstep_size = 50\n\n# Define a function to generate rolling windows\ndef generate_windows(data, window_size, step_size):\n    num_samples, num_features = data.shape\n    windows = []\n    for i in range(0, num_samples - window_size + 1, step_size):\n        window = data[i:i+window_size]\n        windows.append(window)\n    return np.array(windows)\n\n# Generate the rolling windows for the test data\ntest_windows = generate_windows(test_data, window_size, step_size)","metadata":{"execution":{"iopub.status.busy":"2023-04-09T01:13:28.154021Z","iopub.status.idle":"2023-04-09T01:13:28.154420Z","shell.execute_reply.started":"2023-04-09T01:13:28.154214Z","shell.execute_reply":"2023-04-09T01:13:28.154234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_data.shape)\nprint(test_labels.shape)\n","metadata":{"execution":{"iopub.status.busy":"2023-04-09T02:54:58.138297Z","iopub.execute_input":"2023-04-09T02:54:58.138777Z","iopub.status.idle":"2023-04-09T02:54:58.146160Z","shell.execute_reply.started":"2023-04-09T02:54:58.138739Z","shell.execute_reply":"2023-04-09T02:54:58.144806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''def generate_windows(data, labels, window_size, step_size):\n    num_samples, num_features = data.shape\n    windows = []\n    labels_list = []\n    for i in range(0, num_samples - window_size + 1, step_size):\n        window = data[i:i+window_size]\n        label1 = labels[i+window_size-1][0]\n        label2 = labels[i+window_size-1][1]\n        label3 = labels[i+window_size-1][2]\n        windows.append(window)\n        labels_list.append([label1, label2, label3])\n    return np.array(windows), np.array(labels_list)\n\n# Generate the rolling windows for the test data\ntest_windows, test_labels = generate_windows(test_data, test_labels, window_size, step_size)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Make predictions for each window and output to a CSV file\n'''with open('predictions.csv', 'w') as f:\n    f.write('Id,StartHesitation,Turn,Walking,Task\\n')\n    for i, window in enumerate(test_windows):\n        # Make a prediction for the window\n        window_pred = rf.predict(window.reshape(1,-1))\n        # Compute the ID, StartHesitation, Turn, and Walking for the prediction\n        pred_id = f'{i*step_size+window_size//2:05d}'\n        start_hesitation = window[0][0]\n        turn = window[0][1]\n        walking = window[0][2]\n        task = test_df.iloc[i*step_size+window_size//2]['Task']\n        # Write the prediction to the CSV file\n        f.write(f'{pred_id},{start_hesitation},{turn},{walking},{task},{window_pred[0]}\\n')'''\n    ","metadata":{"execution":{"iopub.status.busy":"2023-04-09T01:13:28.156838Z","iopub.status.idle":"2023-04-09T01:13:28.157281Z","shell.execute_reply.started":"2023-04-09T01:13:28.157072Z","shell.execute_reply":"2023-04-09T01:13:28.157095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# can try this\n''' with open('predictions.csv', 'w') as f:\n    f.write('Id,StartHesitation,Turn,Walking\\n')\n    for i, window in enumerate(test_windows):\n        # Make a prediction for the window\n        window_pred1 = rf1.predict(window.reshape(1,-1))\n        window_pred2 = rf2.predict(window.reshape(1,-1))\n        window_pred3 = rf3.predict(window.reshape(1,-1))\n        # Compute the ID for the prediction\n        pred_id = f'{i*step_size+window_size//2:05d}'\n        # Write the prediction to the CSV file\n        f.write(f'{pred_id},{window_pred1[0]},{window_pred2[0]},{window_pred3[0]}\\n')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('submission.csv', 'w') as f:\n    f.write('Id,StartHesitation,Turn,Walking\\n')\n    for i, window in enumerate(test_windows):\n        # Make a prediction for the window\n        window_pred = rf.predict(window.reshape(1,-1))\n        # Compute the ID for the prediction\n        pred_id = f'{i*step_size+window_size//2:05d}'\n        # Write the prediction to the CSV file\n        f.write(f'{pred_id},{window_pred[0][0]},{window_pred[0][1]},{window_pred[0][2]}\\n')\n","metadata":{"execution":{"iopub.status.busy":"2023-04-09T02:39:36.068408Z","iopub.status.idle":"2023-04-09T02:39:36.068876Z","shell.execute_reply.started":"2023-04-09T02:39:36.068663Z","shell.execute_reply":"2023-04-09T02:39:36.068686Z"},"trusted":true},"execution_count":null,"outputs":[]}]}