{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# GAIT Submission","metadata":{}},{"cell_type":"code","source":"# Install tsflex and seglearn\n!pip install tsflex --no-index --find-links=file:///kaggle/input/time-series-tools\n!pip install seglearn --no-index --find-links=file:///kaggle/input/time-series-tools","metadata":{"execution":{"iopub.status.busy":"2023-04-17T02:55:43.981664Z","iopub.execute_input":"2023-04-17T02:55:43.982805Z","iopub.status.idle":"2023-04-17T02:56:10.071053Z","shell.execute_reply.started":"2023-04-17T02:55:43.982716Z","shell.execute_reply":"2023-04-17T02:56:10.069751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom tqdm.auto import tqdm\nfrom sklearn import *\nimport glob\n\np = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/'\n\ntrain = glob.glob(p+'train/**/**')\ntest = glob.glob(p+'test/**/**')\nsubjects = pd.read_csv(p+'subjects.csv')\ntasks = pd.read_csv(p+'tasks.csv')\nsub = pd.read_csv(p+'sample_submission.csv')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-17T02:56:10.074551Z","iopub.execute_input":"2023-04-17T02:56:10.075073Z","iopub.status.idle":"2023-04-17T02:56:11.919034Z","shell.execute_reply.started":"2023-04-17T02:56:10.075016Z","shell.execute_reply":"2023-04-17T02:56:11.917647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://www.kaggle.com/code/jazivxt/familiar-solvs\ntasks['Duration'] = tasks['End'] - tasks['Begin']\ntasks = pd.pivot_table(tasks, values=['Duration'], index=['Id'], columns=['Task'], aggfunc='sum', fill_value=0)\ntasks.columns = [c[-1] for c in tasks.columns]\ntasks = tasks.reset_index()\ntasks['t_kmeans'] = cluster.KMeans(n_clusters=10, random_state=3).fit_predict(tasks[tasks.columns[1:]])\n\nsubjects = subjects.fillna(0).groupby('Subject').median()\nsubjects = subjects.reset_index()\nsubjects.rename(columns={'Subject':'Id'}, inplace=True)\nsubjects['s_kmeans'] = cluster.KMeans(n_clusters=10, random_state=3).fit_predict(subjects[subjects.columns[1:]])","metadata":{"execution":{"iopub.status.busy":"2023-04-17T02:56:11.922483Z","iopub.execute_input":"2023-04-17T02:56:11.923314Z","iopub.status.idle":"2023-04-17T02:56:12.078948Z","shell.execute_reply.started":"2023-04-17T02:56:11.923261Z","shell.execute_reply":"2023-04-17T02:56:12.077815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create a tsflex feature collection","metadata":{}},{"cell_type":"code","source":"from seglearn.feature_functions import base_features, emg_features\n\nfrom tsflex.features import FeatureCollection, MultipleFeatureDescriptors\nfrom tsflex.features.integrations import seglearn_feature_dict_wrapper\n\n\nbasic_feats = MultipleFeatureDescriptors(\n    functions=seglearn_feature_dict_wrapper(base_features()),\n    series_names=['AccV', 'AccML', 'AccAP'],\n    windows=[5_000],\n    strides=[5_000],\n)\n\nemg_feats = emg_features()\ndel emg_feats['simple square integral'] # is same as abs_energy (which is in base_features)\n\nemg_feats = MultipleFeatureDescriptors(\n    functions=seglearn_feature_dict_wrapper(emg_feats),\n    series_names=['AccV', 'AccML', 'AccAP'],\n    windows=[5_000],\n    strides=[5_000],\n)\n\nfc = FeatureCollection([basic_feats, emg_feats])","metadata":{"execution":{"iopub.status.busy":"2023-04-17T02:56:12.081757Z","iopub.execute_input":"2023-04-17T02:56:12.082570Z","iopub.status.idle":"2023-04-17T02:56:12.142300Z","shell.execute_reply.started":"2023-04-17T02:56:12.082518Z","shell.execute_reply":"2023-04-17T02:56:12.140893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Extract the features","metadata":{}},{"cell_type":"code","source":"def reader(f):\n    try:\n        df = pd.read_csv(f, index_col=\"Time\", usecols=['Time', 'AccV', 'AccML', 'AccAP', 'StartHesitation', 'Turn' , 'Walking'])\n        df['Id'] = f.split('/')[-1].split('.')[0]\n        df = pd.merge(df, tasks[['Id','t_kmeans']], how='left', on='Id').fillna(-1)\n        df = pd.merge(df, subjects[['Id','s_kmeans']], how='left', on='Id').fillna(-1)\n        df_feats = fc.calculate(df, return_df=True, include_final_window=True, approve_sparsity=True, window_idx=\"begin\").astype(np.float32)\n        df = df.merge(df_feats, how=\"left\", left_index=True, right_index=True)\n        df.fillna(method=\"ffill\", inplace=True)\n        return df\n    except: pass\ntrain = pd.concat([reader(f) for f in tqdm(train)]).fillna(0); print(train.shape)\ncols = [c for c in train.columns if c not in ['Id', 'Time', 'StartHesitation', 'Turn' , 'Walking', 'Valid', 'Task','Event']]\npcols = ['StartHesitation', 'Turn' , 'Walking']\nscols = ['Id', 'StartHesitation', 'Turn' , 'Walking']","metadata":{"execution":{"iopub.status.busy":"2023-04-17T03:06:54.758307Z","iopub.execute_input":"2023-04-17T03:06:54.758838Z","iopub.status.idle":"2023-04-17T03:14:22.155804Z","shell.execute_reply.started":"2023-04-17T03:06:54.758789Z","shell.execute_reply":"2023-04-17T03:14:22.154362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train the model","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# This should be some proper cross validation..\nx1, x2, y1, y2 = model_selection.train_test_split(train[cols], train[pcols], test_size=.10, random_state=3, stratify=train[pcols])\n","metadata":{"execution":{"iopub.status.busy":"2023-04-17T03:16:42.933678Z","iopub.execute_input":"2023-04-17T03:16:42.934053Z","iopub.status.idle":"2023-04-17T03:19:07.754736Z","shell.execute_reply.started":"2023-04-17T03:16:42.934016Z","shell.execute_reply":"2023-04-17T03:19:07.753604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nbest_params = {\n    'n_estimators': 200,\n    'max_depth':  40,\n    'min_samples_split':  10,\n    'min_samples_leaf': 4,\n    'max_features': 'sqrt',\n    'random_state': 42\n}\n\nreg = ensemble.ExtraTreesRegressor(**best_params)\nreg.fit(x2,y2)\nprint(metrics.average_precision_score(y1[:1_000_000], reg.predict(x1[:1_000_000]).clip(0.0,1.0)))","metadata":{"execution":{"iopub.status.busy":"2023-04-17T03:19:07.757333Z","iopub.execute_input":"2023-04-17T03:19:07.757758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import numpy as np\n# from sklearn.ensemble import ExtraTreesRegressor\n# from sklearn.model_selection import RandomizedSearchCV, train_test_split\n# from tqdm.auto import tqdm\n# from functools import partial\n# import itertools\n\n# etr = ExtraTreesRegressor(random_state=42)\n\n# param_dist = {\n#     'n_estimators': [50, 100, 200],\n#     'max_depth': [7,10, 20],\n#     'min_samples_split': [5, 10],\n#     'min_samples_leaf': [2, 4],\n#     'max_features': [ 'sqrt', 'log2']\n# }\n\n# n_iterations = 30\n\n# random_search = RandomizedSearchCV(\n#     estimator=etr,\n#     param_distributions=param_dist,\n#     n_iter=n_iterations,\n#     cv=2,\n#     scoring='neg_mean_squared_error',\n#     n_jobs=-1,\n#     verbose=2,\n#     random_state=42\n# )\n\n# random_search.fit(x2, y2)\n\n# best_params = random_search.best_params_\n# print(\"Best parameters found: \", best_params)\n\n# best_etr = ExtraTreesRegressor(**best_params)\n# best_etr.fit(x2, y2)\n\n# train_score = best_etr.score(x2, y2)\n# test_score = best_etr.score(x1, y1)\n\n# print(\"Train score: \", train_score)\n# print(\"Test score: \", test_score)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T21:21:14.166228Z","iopub.execute_input":"2023-04-16T21:21:14.167136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Predict for test","metadata":{}},{"cell_type":"code","source":"sub['t'] = 0\nsubmission = []\nfor f in test:\n    df = pd.read_csv(f)\n    df.set_index('Time', drop=True, inplace=True)\n    df['Id'] = f.split('/')[-1].split('.')[0]\n#     df = df.fillna(0).reset_index(drop=True)\n    df = pd.merge(df, tasks[['Id','t_kmeans']], how='left', on='Id').fillna(-1)\n    df = pd.merge(df, subjects[['Id','s_kmeans']], how='left', on='Id').fillna(-1)\n    df_feats = fc.calculate(df, return_df=True, include_final_window=True, approve_sparsity=True, window_idx=\"begin\")\n    df = df.merge(df_feats, how=\"left\", left_index=True, right_index=True)\n    df.fillna(method=\"ffill\", inplace=True)\n    res = pd.DataFrame(np.round(reg.predict(df[cols]).clip(0.0,1.0),3), columns=pcols)\n    df = pd.concat([df,res], axis=1)\n    df['Id'] = df['Id'].astype(str) + '_' + df.index.astype(str)\n    submission.append(df[scols])\nsubmission = pd.concat(submission)\nsubmission = pd.merge(sub[['Id','t']], submission, how='left', on='Id').fillna(0.0)\nsubmission[scols].to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-04-16T21:10:20.538341Z","iopub.status.idle":"2023-04-16T21:10:20.539128Z","shell.execute_reply.started":"2023-04-16T21:10:20.538792Z","shell.execute_reply":"2023-04-16T21:10:20.538831Z"},"trusted":true},"execution_count":null,"outputs":[]}]}