{"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":"none","dataSources":[{"sourceId":53666,"databundleVersionId":6589269,"sourceType":"competition"},{"sourceId":6507308,"sourceType":"datasetVersion","datasetId":3706667},{"sourceId":6963222,"sourceType":"datasetVersion","datasetId":4000101}],"dockerImageVersionId":30579,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport gc\nfrom sklearn.metrics import recall_score, accuracy_score, average_precision_score, f1_score\nfrom imblearn.over_sampling import SMOTE\nfrom sklearn.model_selection import train_test_split\nimport random","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-17T22:54:41.028387Z","iopub.execute_input":"2023-11-17T22:54:41.028974Z","iopub.status.idle":"2023-11-17T22:54:43.365722Z","shell.execute_reply.started":"2023-11-17T22:54:41.028907Z","shell.execute_reply":"2023-11-17T22:54:43.364300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = pd.read_csv('/kaggle/input/post-preprocessed-data-sample/training_data.csv')\nY = pd.read_csv('/kaggle/input/post-preprocessed-data-sample/training_results.csv')\nX = pd.concat([X, Y], axis=1)\n\n#get random subset of 1000 values from each\nindexes = list(range(len(X)))\nrandom.shuffle(indexes)\nselected_indexes = indexes[:1000]\n\nX = X.iloc[selected_indexes]\nY = Y.iloc[selected_indexes]\nX, Y = SMOTE(random_state=42).fit_resample(X, Y)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:43.368070Z","iopub.execute_input":"2023-11-17T22:54:43.368694Z","iopub.status.idle":"2023-11-17T22:54:47.788893Z","shell.execute_reply.started":"2023-11-17T22:54:43.368654Z","shell.execute_reply":"2023-11-17T22:54:47.787826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y.info()","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:47.790304Z","iopub.execute_input":"2023-11-17T22:54:47.790611Z","iopub.status.idle":"2023-11-17T22:54:47.813389Z","shell.execute_reply.started":"2023-11-17T22:54:47.790585Z","shell.execute_reply":"2023-11-17T22:54:47.811770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:47.815615Z","iopub.execute_input":"2023-11-17T22:54:47.815964Z","iopub.status.idle":"2023-11-17T22:54:47.842044Z","shell.execute_reply.started":"2023-11-17T22:54:47.815937Z","shell.execute_reply":"2023-11-17T22:54:47.840665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n#consider season as well\n\n#log style penalty to address zangle values/magnitude\ndef zAnglePenaltyMetric(value):\n    value = abs(value) + 1\n    return (np.log(value) / np.log(90)) ** 2\n\n#sigmoid penalty to address positive values where lower values are bad (ie: enmo)\ndef sigmoidLowPenalty(value, penaltyCoeff, lowerRange):\n    lowerRange += 1\n    value += 1 #to address 0 indexing\n    penalty = 1 / (1 + np.exp(-1 * (penaltyCoeff * (value - lowerRange)) ))\n    return ((penalty - 1) / (-1)) #regularize penalty to be between 0-1\n    #return penalty\n\n#sigmoid penalty to address positive values where higher values are bad (ie: time)\ndef sigmoidHighPenalty(value, penaltyCoeff, higherRange):\n    higherRange += 1\n    value += 1 #to address 0 indexing\n    penalty = 1 / (1 + np.exp(-1 * (penaltyCoeff * (higherRange - value)) ))\n    return ((penalty - 1) / (-1)) #regularize penalty to be between 0-1\n    #return penalty\ndef timePenalty(hour, minute, second):\n    if (hour in [21, 22, 23]): \n        return 0.7 * sigmoidHighPenalty(hour, 0.45, 23) + 0.075 * sigmoidHighPenalty(minute, 0.25, 1) + 0.005 * sigmoidHighPenalty(second, 0.1, 1)\n    elif (hour in [0, 1, 2, 3, 4, 5, 6, 7]): \n        return 0.775 * (1-0.075 * (hour == 7)) * sigmoidLowPenalty(hour, 0.5, 4) + 0.05 * sigmoidLowPenalty(minute, 0.2, 1) + 0.006 * sigmoidLowPenalty(second, 0.1, 1)\n    else:\n        return 0.15  * sigmoidHighPenalty(hour, 0.25, 18) + 0.025 * sigmoidHighPenalty(minute, 0.2, 1) + 0.001 * sigmoidHighPenalty(second, 0.1, 1)\n    \n\ndef sleep_predictor(entry):\n    if((entry['moderateExertionENMO'] or entry['highExertionENMO']) and entry['wakefulZAngle'] and ((not entry['commonWakeTime']) or (not entry['commonSleepTime']))):\n        return 1\n    if(( entry['veryLowENMO']) and (not entry['wakefulZAngle']) and (( (entry['hour'] in [22, 23, 0, 1, 2, 3, 4, 5])))):\n        return 0\n    if((not entry['lowExertionENMO']) and (not entry['veryLowENMO']) and (not entry['moderateExertionENMO']) and (not entry['highExertionENMO'])):\n        return 0\n    seasonModifier = 0.875 if entry['season'] in [1,4] else 1\n    lateDayModifier = 0.875 if entry['lateDays'] else 1\n    \n    timeWeight = seasonModifier * lateDayModifier * timePenalty(entry['hour'], entry['minute'], entry['second'])\n    if (entry['veryLowENMO']):\n        enmoPenalty = 0.275 * (sigmoidLowPenalty(entry['enmo'], 0.25, 0))\n        timePenaltyVal = 0.5 * timeWeight * zAnglePenaltyMetric(entry['anglez'])\n        zAnglePenalty = 0.025 * (not entry['wakefulZAngle']) + 0.1 * zAnglePenaltyMetric(entry['anglez'])\n        weightedEquation = 0.65 - enmoPenalty - timePenaltyVal - zAnglePenalty\n    elif (entry['lowExertionENMO']):\n        enmoPenalty = 0.325 * (sigmoidLowPenalty(entry['enmo'], 0.3, 0))\n        timePenaltyVal = 0.475 * timeWeight \n        zAnglePenalty = 0.025 * (not entry['wakefulZAngle']) + 0.05 * zAnglePenaltyMetric(entry['anglez'])\n        weightedEquation = 0.725 - enmoPenalty - timePenaltyVal - zAnglePenalty\n    elif (entry['moderateExertionENMO']):\n        enmoPenalty = 0.3 * (sigmoidLowPenalty(entry['enmo'], 0.3, 0))\n        timePenaltyVal = 0.575 * timeWeight \n        zAnglePenalty = 0.025 * (not entry['wakefulZAngle']) + 0.05 * zAnglePenaltyMetric(entry['anglez'])\n        weightedEquation = 0.775 - enmoPenalty - timePenaltyVal - zAnglePenalty\n    else:\n        enmoPenalty = 0.125 * (sigmoidLowPenalty(entry['enmo'], 0.25, 0))\n        timePenaltyVal = 0.4 * timeWeight \n        zAnglePenalty = 0.025 * (not entry['wakefulZAngle']) + 0.08 * zAnglePenaltyMetric(entry['anglez'])\n        weightedEquation = 0.825 - enmoPenalty - timePenaltyVal - zAnglePenalty\n    if (((weightedEquation > 0.5) and (entry['awake'] == 0)) or ((weightedEquation < 0.5) and (entry['awake'] == 1))):\n        print(entry)\n        print(f\"ENMO Penalty is: {enmoPenalty}\")\n        print(f\"Time Penalty is: {timePenaltyVal}\")\n        print(f\"Z Angle Penalty is: {zAnglePenalty}\")\n        print(f\"Total Penalty is: {enmoPenalty+timePenaltyVal+zAnglePenalty}\")\n        print(f\"Weighted Value is: {weightedEquation}\")\n    return weightedEquation > 0.5;\n    \n\nY_pred = pd.DataFrame(columns=['Prediction'])\nfor index, row in X.iterrows():\n    prediction = sleep_predictor(row)\n    Y_pred.loc[index] = [prediction]","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:47.844276Z","iopub.execute_input":"2023-11-17T22:54:47.844702Z","iopub.status.idle":"2023-11-17T22:54:48.806133Z","shell.execute_reply.started":"2023-11-17T22:54:47.844664Z","shell.execute_reply":"2023-11-17T22:54:48.804588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\n# Model Evaluation\naccuracy = accuracy_score(Y, Y_pred)\naverage_precision = average_precision_score(Y, Y_pred)\nrecall = recall_score(Y, Y_pred)\nf1 = f1_score(Y, Y_pred)\n\nprint(\"Validation Accuracy: \", accuracy)\nprint(\"Average Precision: \", average_precision)\nprint(\"Recall:\", recall)\nprint(\"F1 Score:\", f1)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:48.807761Z","iopub.execute_input":"2023-11-17T22:54:48.808155Z","iopub.status.idle":"2023-11-17T22:54:48.854999Z","shell.execute_reply.started":"2023-11-17T22:54:48.808121Z","shell.execute_reply":"2023-11-17T22:54:48.853598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sklearn.linear_model import LogisticRegression\nX = pd.read_csv('/kaggle/input/post-preprocessed-data-sample/training_data.csv')\nY = pd.read_csv('/kaggle/input/post-preprocessed-data-sample/training_results.csv')\nindexes = list(range(len(X)))\nrandom.shuffle(indexes)\nselected_indexes = indexes[:1000]\n\nX = X.iloc[selected_indexes]\nY = Y.iloc[selected_indexes]\nX, Y = SMOTE(random_state=42).fit_resample(X, Y)\nX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:48.856429Z","iopub.execute_input":"2023-11-17T22:54:48.856737Z","iopub.status.idle":"2023-11-17T22:54:51.745639Z","shell.execute_reply.started":"2023-11-17T22:54:48.856710Z","shell.execute_reply":"2023-11-17T22:54:51.744135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nlr = LogisticRegression()\nlr.fit(X_train, Y_train['awake'].values)\nY_prob = lr.predict_proba(X_test)[:, 1]\nY_pred = (Y_prob > 0.5).astype('int8')\n# Model Evaluation\naccuracy = accuracy_score(Y_test, Y_pred)\naverage_precision = average_precision_score(Y_test, Y_pred)\nrecall = recall_score(Y_test, Y_pred)\nf1 = f1_score(Y_test, Y_pred)\nprint(\"Validation Accuracy: \", accuracy)\nprint(\"Average Precision: \", average_precision)\nprint(\"Recall:\", recall)\nprint(\"F1 Score:\", f1)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:51.748431Z","iopub.execute_input":"2023-11-17T22:54:51.749156Z","iopub.status.idle":"2023-11-17T22:54:51.797702Z","shell.execute_reply.started":"2023-11-17T22:54:51.749117Z","shell.execute_reply":"2023-11-17T22:54:51.796818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sklearn.neighbors import KNeighborsClassifier\nknn = KNeighborsClassifier()\nknn.fit(X_train, Y_train)\nY_pred = knn.predict(X_test)\n\n# Model Evaluation\naccuracy = accuracy_score(Y_test, Y_pred)\naverage_precision = average_precision_score(Y_test, Y_pred)\nrecall = recall_score(Y_test, Y_pred)\nf1 = f1_score(Y_test, Y_pred)\n\nprint(\"Validation Accuracy: \", accuracy)\nprint(\"Average Precision: \", average_precision)\nprint(\"Recall:\", recall)\nprint(\"F1 Score:\", f1)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:51.798928Z","iopub.execute_input":"2023-11-17T22:54:51.799891Z","iopub.status.idle":"2023-11-17T22:54:51.871598Z","shell.execute_reply.started":"2023-11-17T22:54:51.799859Z","shell.execute_reply":"2023-11-17T22:54:51.869450Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sklearn.naive_bayes import GaussianNB\ngaussianNB = GaussianNB()\ngaussianNB.fit(X_train, Y_train)\nY_pred = gaussianNB.predict(X_test)\n\n# Model Evaluation\naccuracy = accuracy_score(Y_test, Y_pred)\naverage_precision = average_precision_score(Y_test, Y_pred)\nrecall = recall_score(Y_test, Y_pred)\nf1 = f1_score(Y_test, Y_pred)\n\nprint(\"Validation Accuracy: \", accuracy)\nprint(\"Average Precision: \", average_precision)\nprint(\"Recall:\", recall)\nprint(\"F1 Score:\", f1)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:51.875503Z","iopub.execute_input":"2023-11-17T22:54:51.876197Z","iopub.status.idle":"2023-11-17T22:54:51.922200Z","shell.execute_reply.started":"2023-11-17T22:54:51.876167Z","shell.execute_reply":"2023-11-17T22:54:51.920794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sklearn.svm import SVC\nsvc = SVC()\nsvc.fit(X_train, Y_train)\nY_pred = svc.predict(X_test)\n\n# Model Evaluation\naccuracy = accuracy_score(Y_test, Y_pred)\naverage_precision = average_precision_score(Y_test, Y_pred)\nrecall = recall_score(Y_test, Y_pred)\nf1 = f1_score(Y_test, Y_pred)\n\nprint(\"Validation Accuracy: \", accuracy)\nprint(\"Average Precision: \", average_precision)\nprint(\"Recall:\", recall)\nprint(\"F1 Score:\", f1)\n","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:51.923838Z","iopub.execute_input":"2023-11-17T22:54:51.924514Z","iopub.status.idle":"2023-11-17T22:54:51.984890Z","shell.execute_reply.started":"2023-11-17T22:54:51.924478Z","shell.execute_reply":"2023-11-17T22:54:51.983875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sklearn.tree import DecisionTreeClassifier\ndt = DecisionTreeClassifier(random_state=42)\ndt.fit(X_train, Y_train)\nY_pred = dt.predict(X_test)\n\n# Model Evaluation\naccuracy = accuracy_score(Y_test, Y_pred)\naverage_precision = average_precision_score(Y_test, Y_pred)\nrecall = recall_score(Y_test, Y_pred)\nf1 = f1_score(Y_test, Y_pred)\n\nprint(\"Validation Accuracy: \", accuracy)\nprint(\"Average Precision: \", average_precision)\nprint(\"Recall:\", recall)\nprint(\"F1 Score:\", f1)","metadata":{"execution":{"iopub.status.busy":"2023-11-17T22:54:51.985925Z","iopub.execute_input":"2023-11-17T22:54:51.986162Z","iopub.status.idle":"2023-11-17T22:54:52.029784Z","shell.execute_reply.started":"2023-11-17T22:54:51.986140Z","shell.execute_reply":"2023-11-17T22:54:52.028142Z"},"trusted":true},"execution_count":null,"outputs":[]}]}