{"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":"Credit to 此般浅薄 for the initial inspiration","metadata":{}},{"cell_type":"markdown","source":"[Create By](https://www.kaggle.com/code/allenwpr/gait-prediction)\n\n![image.png](attachment:facc5020-3720-4178-a663-63036d29d175.png)","metadata":{},"attachments":{"facc5020-3720-4178-a663-63036d29d175.png":{"image/png":"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"}}},{"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":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":26.425736,"end_time":"2023-04-16T22:41:22.382325","exception":false,"start_time":"2023-04-16T22:40:55.956589","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:30:41.242724Z","iopub.execute_input":"2023-04-21T01:30:41.243137Z","iopub.status.idle":"2023-04-21T01:31:05.875275Z","shell.execute_reply.started":"2023-04-21T01:30:41.243099Z","shell.execute_reply":"2023-04-21T01:31:05.873632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn import *\nimport glob\nfrom tqdm.auto import tqdm\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom os import path\nfrom pathlib import Path\nfrom seglearn.feature_functions import base_features, emg_features\nfrom tsflex.features import FeatureCollection, MultipleFeatureDescriptors\nfrom tsflex.features.integrations import seglearn_feature_dict_wrapper\nfrom sklearn.model_selection import GroupKFold\nimport lightgbm as lgb\nfrom sklearn.multioutput import MultiOutputRegressor\nfrom sklearn.base import clone\nfrom sklearn.metrics import average_precision_score","metadata":{"papermill":{"duration":2.755431,"end_time":"2023-04-16T22:41:25.148066","exception":false,"start_time":"2023-04-16T22:41:22.392635","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:05.877797Z","iopub.execute_input":"2023-04-21T01:31:05.87828Z","iopub.status.idle":"2023-04-21T01:31:08.601308Z","shell.execute_reply.started":"2023-04-21T01:31:05.878239Z","shell.execute_reply":"2023-04-21T01:31:08.600294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Grab important files","metadata":{"papermill":{"duration":0.009576,"end_time":"2023-04-16T22:41:25.16752","exception":false,"start_time":"2023-04-16T22:41:25.157944","status":"completed"},"tags":[]}},{"cell_type":"code","source":"root = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/'\n\ntrain = glob.glob(path.join(root, 'train/**/**'))\ntest = glob.glob(path.join(root, 'test/**/**'))\n\nsubjects = pd.read_csv(path.join(root, 'subjects.csv'))\ntasks = pd.read_csv(path.join(root, 'tasks.csv'))\nevents = pd.read_csv(path.join(root, 'events.csv'))\n\ntdcsfog_metadata = pd.read_csv(path.join(root, 'tdcsfog_metadata.csv'))\ndefog_metadata = pd.read_csv(path.join(root, 'defog_metadata.csv')) \n\ntdcsfog_metadata['Module'] = 'tdcsfog'\ndefog_metadata['Module'] = 'defog'\n\nfull_metadata = pd.concat([tdcsfog_metadata, defog_metadata])","metadata":{"papermill":{"duration":0.170669,"end_time":"2023-04-16T22:41:25.347896","exception":false,"start_time":"2023-04-16T22:41:25.177227","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.602597Z","iopub.execute_input":"2023-04-21T01:31:08.602929Z","iopub.status.idle":"2023-04-21T01:31:08.749108Z","shell.execute_reply.started":"2023-04-21T01:31:08.602897Z","shell.execute_reply":"2023-04-21T01:31:08.748115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"subjects.loc[subjects['Subject'] == 'fe5d84', 'Sex'] = 'F'","metadata":{"execution":{"iopub.status.busy":"2023-04-21T01:31:08.751967Z","iopub.execute_input":"2023-04-21T01:31:08.752315Z","iopub.status.idle":"2023-04-21T01:31:08.758469Z","shell.execute_reply.started":"2023-04-21T01:31:08.752281Z","shell.execute_reply":"2023-04-21T01:31:08.757339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 100\ncluster_size = 8","metadata":{"papermill":{"duration":0.02392,"end_time":"2023-04-16T22:41:25.577077","exception":false,"start_time":"2023-04-16T22:41:25.553157","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.760314Z","iopub.execute_input":"2023-04-21T01:31:08.761109Z","iopub.status.idle":"2023-04-21T01:31:08.776238Z","shell.execute_reply.started":"2023-04-21T01:31:08.761062Z","shell.execute_reply":"2023-04-21T01:31:08.775046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"subjects['Sex'] = subjects['Sex'].factorize()[0]\nsubjects = subjects.fillna(0).groupby('Subject').median()\nsubjects['s_group'] = cluster.KMeans(n_clusters = cluster_size, random_state = seed).fit_predict(subjects[subjects.columns[1:]])\nnew_names = {'Visit':'s_visit','Age':'s_age','YearsSinceDx':'s_years','UPDRSIII_On':'s_on','UPDRSIII_Off':'s_off','NFOGQ':'s_NFOGQ', 'Sex': 's_sex'}\nsubjects = subjects.rename(columns = new_names)\nsubjects","metadata":{"papermill":{"duration":0.110973,"end_time":"2023-04-16T22:41:25.698532","exception":false,"start_time":"2023-04-16T22:41:25.587559","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.777921Z","iopub.execute_input":"2023-04-21T01:31:08.779552Z","iopub.status.idle":"2023-04-21T01:31:08.870787Z","shell.execute_reply.started":"2023-04-21T01:31:08.779514Z","shell.execute_reply":"2023-04-21T01:31:08.869562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tasks['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_group'] = cluster.KMeans(n_clusters = cluster_size, random_state = seed).fit_predict(tasks[tasks.columns[1:]])","metadata":{"papermill":{"duration":0.108699,"end_time":"2023-04-16T22:41:25.903139","exception":false,"start_time":"2023-04-16T22:41:25.79444","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.872068Z","iopub.execute_input":"2023-04-21T01:31:08.872422Z","iopub.status.idle":"2023-04-21T01:31:08.948153Z","shell.execute_reply.started":"2023-04-21T01:31:08.872362Z","shell.execute_reply":"2023-04-21T01:31:08.946914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# merge the subjects with the metadata\nmetadata_w_subjects = full_metadata.merge(subjects, how='left', on='Subject').copy()\nfeatures = metadata_w_subjects.columns","metadata":{"papermill":{"duration":0.060364,"end_time":"2023-04-16T22:41:26.141472","exception":false,"start_time":"2023-04-16T22:41:26.081108","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.949542Z","iopub.execute_input":"2023-04-21T01:31:08.950104Z","iopub.status.idle":"2023-04-21T01:31:08.962007Z","shell.execute_reply.started":"2023-04-21T01:31:08.950064Z","shell.execute_reply":"2023-04-21T01:31:08.960776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata_w_subjects['Medication'] = metadata_w_subjects['Medication'].factorize()[0]","metadata":{"execution":{"iopub.status.busy":"2023-04-21T01:31:08.963763Z","iopub.execute_input":"2023-04-21T01:31:08.964093Z","iopub.status.idle":"2023-04-21T01:31:08.970239Z","shell.execute_reply.started":"2023-04-21T01:31:08.96406Z","shell.execute_reply":"2023-04-21T01:31:08.968995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extract 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 from the time series data itself","metadata":{"papermill":{"duration":0.021931,"end_time":"2023-04-16T22:41:26.370019","exception":false,"start_time":"2023-04-16T22:41:26.348088","status":"completed"},"tags":[]}},{"cell_type":"code","source":"basic_feats = MultipleFeatureDescriptors(\n    functions=seglearn_feature_dict_wrapper(base_features()),\n    series_names=['AccV', 'AccML', 'AccAP'],\n    windows=[5000],\n    strides=[5000],\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=[5000],\n    strides=[5000],\n)\n\nfc = FeatureCollection([basic_feats, emg_feats])","metadata":{"papermill":{"duration":0.032203,"end_time":"2023-04-16T22:41:26.517639","exception":false,"start_time":"2023-04-16T22:41:26.485436","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.974165Z","iopub.execute_input":"2023-04-21T01:31:08.974543Z","iopub.status.idle":"2023-04-21T01:31:08.9843Z","shell.execute_reply.started":"2023-04-21T01:31:08.974497Z","shell.execute_reply":"2023-04-21T01:31:08.983112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def reader(file):\n    try:\n        df = pd.read_csv(file, index_col='Time', usecols=['Time', 'AccV', 'AccML', 'AccAP', 'StartHesitation', 'Turn' , 'Walking'])\n\n        path_split = file.split('/')\n        df['Id'] = path_split[-1].split('.')[0]\n        dataset = Path(file).parts[-2]\n        df['Module'] = dataset\n        \n        # this is done because the speeds are at different rates for the datasets\n#         if dataset == 'tdcsfog':\n#             df.AccV = df.AccV / 9.80665\n#             df.AccML = df.AccML / 9.80665\n#             df.AccAP = df.AccAP / 9.80665\n\n        df['Time_frac']=(df.index/df.index.max()).values\n        \n        df = pd.merge(df, tasks[['Id','t_group']], how='left', on='Id').fillna(-1)\n        \n        df = pd.merge(df, metadata_w_subjects[['Id','Subject', 'Visit','Test','Medication','s_group']], how='left', on='Id').fillna(-1)\n        \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        \n#         # stride\n#         df[\"Stride\"] = df[\"AccV\"] + df[\"AccML\"] + df[\"AccAP\"]\n\n#         # step\n#         df[\"Step\"] = np.sqrt(abs(df[\"Stride\"]))\n    \n        df.fillna(method=\"ffill\", inplace=True)\n        \n        return df\n    except: pass\n\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','Subject','Module', 'Time', 'StartHesitation', 'Turn' , 'Walking', 'Valid', 'Task','Event']]\npcols = ['StartHesitation', 'Turn' , 'Walking']\nscols = ['Id', 'StartHesitation', 'Turn' , 'Walking']\ntrain=train.reset_index(drop=True)","metadata":{"papermill":{"duration":533.977331,"end_time":"2023-04-16T22:50:20.513889","exception":false,"start_time":"2023-04-16T22:41:26.536558","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:31:08.985904Z","iopub.execute_input":"2023-04-21T01:31:08.98627Z","iopub.status.idle":"2023-04-21T01:39:16.081832Z","shell.execute_reply.started":"2023-04-21T01:31:08.986236Z","shell.execute_reply":"2023-04-21T01:39:16.079813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"papermill":{"duration":0.048438,"end_time":"2023-04-16T22:50:20.575881","exception":false,"start_time":"2023-04-16T22:50:20.527443","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:39:16.085905Z","iopub.execute_input":"2023-04-21T01:39:16.086577Z","iopub.status.idle":"2023-04-21T01:39:16.122094Z","shell.execute_reply.started":"2023-04-21T01:39:16.086495Z","shell.execute_reply":"2023-04-21T01:39:16.120863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"best_params_ = {'colsample_bytree': 0.5,\n 'learning_rate': 0.1,\n 'max_depth': 7,\n 'min_child_weight': 3,\n 'n_estimators': 555,\n 'subsample': 0.9961057796456088,\n }\n\ndef custom_average_precision(y_true, y_pred):\n    score = average_precision_score(y_true, y_pred)\n    return 'average_precision', score, True\n\nclass LGBMMultiOutputRegressor(MultiOutputRegressor):\n    def fit(self, X, y, eval_set=None, **fit_params):\n        self.estimators_ = [clone(self.estimator) for _ in range(y.shape[1])]\n        \n        for i, estimator in enumerate(self.estimators_):\n            if eval_set:\n                fit_params['eval_set'] = [(eval_set[0], eval_set[1][:, i])]\n            estimator.fit(X, y[:, i], **fit_params)\n        \n        return self","metadata":{"papermill":{"duration":0.031497,"end_time":"2023-04-16T22:50:29.071479","exception":false,"start_time":"2023-04-16T22:50:29.039982","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:39:16.134463Z","iopub.execute_input":"2023-04-21T01:39:16.134812Z","iopub.status.idle":"2023-04-21T01:39:16.145204Z","shell.execute_reply.started":"2023-04-21T01:39:16.134779Z","shell.execute_reply":"2023-04-21T01:39:16.143994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"kfold = GroupKFold(5)\ngroups=kfold.split(train, groups=train.Subject)\n\nregs = []\ncvs = []\n\nfor _, (tr_idx, te_idx) in enumerate(tqdm(groups, total=5, desc=\"Folds\")):\n    \n    tr_idx = pd.Series(tr_idx).sample(n=2000000,random_state=42).values\n\n    multioutput_regressor = LGBMMultiOutputRegressor(lgb.LGBMRegressor(**best_params_))\n\n    x_train = train.loc[tr_idx, cols].to_numpy()\n    y_train = train.loc[tr_idx, pcols].to_numpy()\n    \n    x_test = train.loc[te_idx, cols].to_numpy()\n    y_test = train.loc[te_idx, pcols].to_numpy()\n\n    multioutput_regressor.fit(\n        x_train, y_train,\n        eval_set=(x_test, y_test),\n        eval_metric=custom_average_precision,\n        early_stopping_rounds=15,\n        verbose = 0,\n    )\n    \n    regs.append(multioutput_regressor)\n    \n    cv = metrics.average_precision_score(y_test, multioutput_regressor.predict(x_test).clip(0.0,1.0))\n    \n    cvs.append(cv)\n    \nprint(cvs)\nprint(np.mean(cvs))","metadata":{"papermill":{"duration":943.279901,"end_time":"2023-04-16T23:06:12.366865","exception":false,"start_time":"2023-04-16T22:50:29.086964","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:39:16.146814Z","iopub.execute_input":"2023-04-21T01:39:16.147155Z","iopub.status.idle":"2023-04-21T01:51:08.031261Z","shell.execute_reply.started":"2023-04-21T01:39:16.147123Z","shell.execute_reply":"2023-04-21T01:51:08.029721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv(path.join(root, 'sample_submission.csv'))\nsubmission = []\n\nfor f in test:\n    df = pd.read_csv(f)\n    df.set_index('Time', drop=True, inplace=True)\n\n    df['Id'] = f.split('/')[-1].split('.')[0]\n\n    dataset = Path(f).parts[-2]\n        \n#     if dataset == 'tdcsfog':\n#         df.AccV = df.AccV / 9.80665\n#         df.AccML = df.AccML / 9.80665\n#         df.AccAP = df.AccAP / 9.80665\n            \n    df['Time_frac']=(df.index/df.index.max()).values\n    df = pd.merge(df, tasks[['Id','t_group']], how='left', on='Id').fillna(-1)\n\n    df = pd.merge(df, metadata_w_subjects[['Id','Subject', 'Visit','Test','Medication','s_group']], 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\n#     # stride\n#     df[\"Stride\"] = df[\"AccV\"] + df[\"AccML\"] + df[\"AccAP\"]\n\n#     # step\n#     df[\"Step\"] = np.sqrt(abs(df[\"Stride\"]))\n        \n    res_vals = []\n    \n    for i_fold in range(5):\n        \n        pred = regs[i_fold].predict(df[cols]).clip(0.0,1.0)\n        res_vals.append(np.expand_dims(np.round(pred, 3), axis = 2))\n        \n    res_vals = np.mean(np.concatenate(res_vals, axis = 2), axis = 2)\n    res = pd.DataFrame(res_vals, columns=pcols)\n    \n    df = pd.concat([df,res], axis=1)\n    df['Id'] = df['Id'].astype(str) + '_' + df.index.astype(str)\n    submission.append(df[scols])\n    \nsubmission = pd.concat(submission)\nsubmission = pd.merge(sub[['Id']], submission, how='left', on='Id').fillna(0.0)\nsubmission[scols].to_csv('submission.csv', index=False)","metadata":{"papermill":{"duration":10.790056,"end_time":"2023-04-16T23:06:23.20594","exception":false,"start_time":"2023-04-16T23:06:12.415884","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:51:08.033808Z","iopub.execute_input":"2023-04-21T01:51:08.034312Z","iopub.status.idle":"2023-04-21T01:51:16.946572Z","shell.execute_reply.started":"2023-04-21T01:51:08.034249Z","shell.execute_reply":"2023-04-21T01:51:16.945259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"papermill":{"duration":0.076052,"end_time":"2023-04-16T23:06:23.331235","exception":false,"start_time":"2023-04-16T23:06:23.255183","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2023-04-21T01:51:16.948492Z","iopub.execute_input":"2023-04-21T01:51:16.949566Z","iopub.status.idle":"2023-04-21T01:51:16.967779Z","shell.execute_reply.started":"2023-04-21T01:51:16.949502Z","shell.execute_reply":"2023-04-21T01:51:16.966552Z"},"trusted":true},"execution_count":null,"outputs":[]}]}