{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"This notebook builds upon https://www.kaggle.com/code/carlmcbrideellis/zzzs-random-forest-model-starter/comments\n\nNOTE: The notebook fails to score when submitted (still finding the bug..)","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom itertools import groupby","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2023-09-11T08:15:31.892736Z","iopub.execute_input":"2023-09-11T08:15:31.893590Z","iopub.status.idle":"2023-09-11T08:15:32.285388Z","shell.execute_reply.started":"2023-09-11T08:15:31.893530Z","shell.execute_reply":"2023-09-11T08:15:32.283932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:15:32.287682Z","iopub.execute_input":"2023-09-11T08:15:32.288324Z","iopub.status.idle":"2023-09-11T08:15:32.295106Z","shell.execute_reply.started":"2023-09-11T08:15:32.288282Z","shell.execute_reply":"2023-09-11T08:15:32.293845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_parquet(\"/kaggle/input/zzzs-lightweight-training-dataset-target/Zzzs_train.parquet\")\ntest  = pd.read_parquet(\"/kaggle/input/child-mind-institute-detect-sleep-states/test_series.parquet\")\n\n# parse the timestamp and create an \"hour\" feature\ntrain[\"date\"] = pd.to_datetime(train[\"timestamp\"],utc=True)\ntrain[\"hour\"] = train[\"date\"].dt.hour\n\ntest[\"date\"] = pd.to_datetime(test[\"timestamp\"],utc=True)\ntest[\"hour\"] = test[\"date\"].dt.hour","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:15:32.296900Z","iopub.execute_input":"2023-09-11T08:15:32.297825Z","iopub.status.idle":"2023-09-11T08:16:55.958378Z","shell.execute_reply.started":"2023-09-11T08:15:32.297775Z","shell.execute_reply":"2023-09-11T08:16:55.957512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# group by 'series_id' and 'hour'\ngrouped = train.groupby(['series_id', 'hour'])\n\n# kurtosis\ntrain['anglez_kurtosis'] = grouped['anglez'].apply(lambda x: x.kurt()).reset_index(level=['series_id', 'hour'], drop=True)\ntrain['enmo_kurtosis'] = grouped['enmo'].apply(lambda x: x.kurt()).reset_index(level=['series_id', 'hour'], drop=True)\n\n\n# Compute aggregated features for 'anglez'\ntrain['anglez_mean'] = grouped['anglez'].transform('mean')\ntrain['anglez_std'] = grouped['anglez'].transform('std')\ntrain['anglez_min'] = grouped['anglez'].transform('min')\ntrain['anglez_max'] = grouped['anglez'].transform('max')\ntrain['anglez_skew'] = grouped['anglez'].transform('skew')\n\ntrain['anglez_q25'] = grouped['anglez'].transform('quantile', 0.25)\ntrain['anglez_q75'] = grouped['anglez'].transform('quantile', 0.75)\n\n# Compute aggregated features for 'enmo'\ntrain['enmo_mean'] = grouped['enmo'].transform('mean')\ntrain['enmo_std'] = grouped['enmo'].transform('std')\ntrain['enmo_min'] = grouped['enmo'].transform('min')\ntrain['enmo_max'] = grouped['enmo'].transform('max')\ntrain['enmo_skew'] = grouped['enmo'].transform('skew')\n\ntrain['enmo_q25'] = grouped['enmo'].transform('quantile', 0.25)\ntrain['enmo_q75'] = grouped['enmo'].transform('quantile', 0.75)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:16:59.624884Z","iopub.execute_input":"2023-09-11T08:16:59.626348Z","iopub.status.idle":"2023-09-11T08:17:22.377870Z","shell.execute_reply.started":"2023-09-11T08:16:59.626270Z","shell.execute_reply":"2023-09-11T08:17:22.376962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\nfrom xgboost import XGBClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.ensemble import RandomForestClassifier\n\n# Initialize XGBoost classifier\nclassifier = XGBClassifier(n_estimators=10, verbose_eval=False)\n\nfeatures = [\"hour\", \"anglez_std\", \"anglez_skew\", \"anglez_q25\", \"anglez_q75\",'enmo_mean', 'enmo_std',\n           'enmo_min', 'enmo_max', 'enmo_skew', 'enmo_q25', 'enmo_q75']\n\nX = train[features]\ny = train[\"awake\"]\n\n\nclassifier.fit(X, y)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:18:07.214922Z","iopub.execute_input":"2023-09-11T08:18:07.215313Z","iopub.status.idle":"2023-09-11T08:19:02.616755Z","shell.execute_reply.started":"2023-09-11T08:18:07.215281Z","shell.execute_reply":"2023-09-11T08:19:02.615502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train\n\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:29.434108Z","iopub.execute_input":"2023-09-11T08:19:29.434591Z","iopub.status.idle":"2023-09-11T08:19:29.441303Z","shell.execute_reply.started":"2023-09-11T08:19:29.434555Z","shell.execute_reply":"2023-09-11T08:19:29.439635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Make predictions \n#y_pred = classifier.predict(X_val)\n\n# Evaluate \n#accuracy = accuracy_score(y_val, y_pred)\n#accuracy","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:30.150998Z","iopub.execute_input":"2023-09-11T08:19:30.151438Z","iopub.status.idle":"2023-09-11T08:19:30.156868Z","shell.execute_reply.started":"2023-09-11T08:19:30.151407Z","shell.execute_reply":"2023-09-11T08:19:30.155479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Clearing memory cache in Python\nimport gc\n\n# Explicitly run garbage collection\ngc.collect()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:30.479803Z","iopub.execute_input":"2023-09-11T08:19:30.480226Z","iopub.status.idle":"2023-09-11T08:19:30.616724Z","shell.execute_reply.started":"2023-09-11T08:19:30.480193Z","shell.execute_reply":"2023-09-11T08:19:30.615570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# group by 'series_id' and 'hour'\ngrouped = test.groupby(['series_id', 'hour'])\n\n\ntest['anglez_kurtosis'] = grouped['anglez'].apply(lambda x: x.kurt()).reset_index(level=['series_id', 'hour'], drop=True)\ntest['enmo_kurtosis'] = grouped['enmo'].apply(lambda x: x.kurt()).reset_index(level=['series_id', 'hour'], drop=True)\n\n\n# Compute aggregated features for 'anglez'\ntest['anglez_mean'] = grouped['anglez'].transform('mean')\ntest['anglez_std'] = grouped['anglez'].transform('std')\n#test['anglez_min'] = grouped['anglez'].transform('min')\n#test['anglez_max'] = grouped['anglez'].transform('max')\ntest['anglez_skew'] = grouped['anglez'].transform('skew')\n\ntest['anglez_q25'] = grouped['anglez'].transform('quantile', 0.25)\ntest['anglez_q75'] = grouped['anglez'].transform('quantile', 0.75)\n\n# Compute aggregated features for 'enmo'\n\ntest['enmo_mean'] = grouped['enmo'].transform('mean')\ntest['enmo_std'] = grouped['enmo'].transform('std')\ntest['enmo_min'] = grouped['enmo'].transform('min')\ntest['enmo_max'] = grouped['enmo'].transform('max')\ntest['enmo_skew'] = grouped['enmo'].transform('skew')\n\ntest['enmo_q25'] = grouped['enmo'].transform('quantile', 0.25)\ntest['enmo_q75'] = grouped['enmo'].transform('quantile', 0.75)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:44.040485Z","iopub.execute_input":"2023-09-11T08:19:44.040849Z","iopub.status.idle":"2023-09-11T08:19:44.071205Z","shell.execute_reply.started":"2023-09-11T08:19:44.040820Z","shell.execute_reply":"2023-09-11T08:19:44.069819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:45.680307Z","iopub.execute_input":"2023-09-11T08:19:45.681895Z","iopub.status.idle":"2023-09-11T08:19:45.866453Z","shell.execute_reply.started":"2023-09-11T08:19:45.681834Z","shell.execute_reply":"2023-09-11T08:19:45.864949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = test[features]\ntest[\"awake\"] = classifier.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:48.096157Z","iopub.execute_input":"2023-09-11T08:19:48.097223Z","iopub.status.idle":"2023-09-11T08:19:48.117078Z","shell.execute_reply.started":"2023-09-11T08:19:48.097167Z","shell.execute_reply":"2023-09-11T08:19:48.115806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the predicted probabilities for the positive class (awake = 1)\npredicted_proba = classifier.predict_proba(X_test)\n\n# Append this to the test DataFrame as a new column\ntest['score'] = predicted_proba[:, 1]","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:49.069597Z","iopub.execute_input":"2023-09-11T08:19:49.070025Z","iopub.status.idle":"2023-09-11T08:19:49.083364Z","shell.execute_reply.started":"2023-09-11T08:19:49.069993Z","shell.execute_reply":"2023-09-11T08:19:49.081291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[\"not_awake\"] = test[\"awake\"].replace({0:1, 1:0})\n# exponential smoothing of the predictions\ntest[\"smooth\"] = test[\"not_awake\"].ewm(span = 100).mean()\n# re-binarize\ntest[\"smooth\"] = test[\"smooth\"].round()\n\n# https://stackoverflow.com/questions/73777727/how-to-mark-start-end-of-a-series-of-non-null-and-non-0-values-in-a-column-of-a\ndef get_event(df):\n    lstCV = zip(df.series_id, df.smooth)\n    lstPOI = []\n    for (c, v), g in groupby(lstCV, lambda cv: \n                            (cv[0], cv[1]!=0 and not pd.isnull(cv[1]))):\n        llg = sum(1 for item in g)\n        if v is False: \n            lstPOI.extend([0]*llg)\n        else: \n            lstPOI.extend(['onset']+(llg-2)*[0]+['wakeup'] if llg > 1 else [0])\n    return lstPOI\n\ntest[\"event\"] = get_event(test)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:49.995499Z","iopub.execute_input":"2023-09-11T08:19:49.995943Z","iopub.status.idle":"2023-09-11T08:19:50.011042Z","shell.execute_reply.started":"2023-09-11T08:19:49.995910Z","shell.execute_reply":"2023-09-11T08:19:50.009861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission = test.loc[test[\"event\"] != 0][[\"series_id\",\"step\",\"event\", \"score\"]].copy().reset_index(drop=True).reset_index(names=\"row_id\")\n# for the moment simply set \"score\" to be 0.7 globally\n#sample_submission['score'] = \nsample_submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:50.556204Z","iopub.execute_input":"2023-09-11T08:19:50.557178Z","iopub.status.idle":"2023-09-11T08:19:50.580607Z","shell.execute_reply.started":"2023-09-11T08:19:50.557093Z","shell.execute_reply":"2023-09-11T08:19:50.578703Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission","metadata":{"execution":{"iopub.status.busy":"2023-09-11T08:19:51.109043Z","iopub.execute_input":"2023-09-11T08:19:51.110281Z","iopub.status.idle":"2023-09-11T08:19:51.129698Z","shell.execute_reply.started":"2023-09-11T08:19:51.110196Z","shell.execute_reply":"2023-09-11T08:19:51.128436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}],"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"}}