{"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":"import os\nimport numpy as np \nimport pandas as pd\nimport os\nfrom tqdm import tqdm\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader\nfrom torch.nn import CrossEntropyLoss\nimport torch.nn.functional as F\n\nMAIN_DIR = \"/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/\"\nDEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nFEATURES = [\"AccV\", \"AccML\", \"AccAP\"]\nTARGETS = [\"StartHesitation\", \"Turn\", \"Walking\"]\n\nN_EPOCHS = 1","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-06-08T21:13:38.274873Z","iopub.execute_input":"2023-06-08T21:13:38.275438Z","iopub.status.idle":"2023-06-08T21:13:38.28593Z","shell.execute_reply.started":"2023-06-08T21:13:38.275393Z","shell.execute_reply":"2023-06-08T21:13:38.284479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reduce Memory Usage\n# reference : https://www.kaggle.com/code/arjanso/reducing-dataframe-memory-size-by-65 @ARJANGROEN\n\ndef reduce_memory_usage(df):\n    \n    start_mem = df.memory_usage().sum() / 1024**2\n    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))\n    \n    for col in df.columns:\n        col_type = df[col].dtype.name\n        if ((col_type != 'datetime64[ns]') & (col_type != 'category')):\n            if (col_type != 'object'):\n                c_min = df[col].min()\n                c_max = df[col].max()\n\n                if str(col_type)[:3] == 'int':\n                    if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                        df[col] = df[col].astype(np.int8)\n                    elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                        df[col] = df[col].astype(np.int16)\n                    elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                        df[col] = df[col].astype(np.int32)\n                    elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                        df[col] = df[col].astype(np.int64)\n\n                else:\n                    if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                        df[col] = df[col].astype(np.float16)\n                    elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                        df[col] = df[col].astype(np.float32)\n                    else:\n                        pass\n            else:\n                df[col] = df[col].astype('category')\n    mem_usg = df.memory_usage().sum() / 1024**2 \n    print(\"Memory usage became: \",mem_usg,\" MB\")\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:13:38.288221Z","iopub.execute_input":"2023-06-08T21:13:38.288698Z","iopub.status.idle":"2023-06-08T21:13:38.305789Z","shell.execute_reply.started":"2023-06-08T21:13:38.288666Z","shell.execute_reply":"2023-06-08T21:13:38.304294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_data(\n    dataset,\n    datatype,\n    subject_id = None):\n    \n    metadata = pd.read_csv(MAIN_DIR + dataset + \"_metadata.csv\")\n    \n    DATA_ROOT = MAIN_DIR + datatype + \"/\" + dataset\n    \n    if subject_id is not None:\n        files = [file for file in files if subject_id in file]\n    \n    df_res = pd.DataFrame()\n    for root, dirs, files in os.walk(DATA_ROOT):\n        for name in tqdm(files):\n            f = os.path.join(root, name)\n            query_datatype = pd.read_csv(f)\n            query_datatype[\"file\"] = name.replace(\".csv\", \"\")\n            df_res = pd.concat([df_res,query_datatype])\n    \n    df_res = metadata.merge(df_res,\n                          how = 'inner',\n                          left_on = 'Id',\n                          right_on = 'file')\n    df_res = df_res.drop([\"file\"], axis = 1)\n\n    df_res = reduce_memory_usage(df_res)\n        \n    return df_res\n    ","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:13:38.307718Z","iopub.execute_input":"2023-06-08T21:13:38.308948Z","iopub.status.idle":"2023-06-08T21:13:38.325275Z","shell.execute_reply.started":"2023-06-08T21:13:38.308909Z","shell.execute_reply":"2023-06-08T21:13:38.323731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class FOGDataset(Dataset):\n         \n    @staticmethod\n    def encode_target(data, targets_list):\n        conditions = []\n        for target in targets_list:\n            conditions.append((data[target] == 1))\n\n        event = np.select(conditions, targets_list, default='Normal')\n        le = LabelEncoder()\n        return le.fit_transform(event)\n\n    @staticmethod\n    def get_features_target(data, features_list, datatype):\n        if datatype == \"train\":\n            features, target = data[features_list], data[\"target\"]\n            return features, target\n        else:\n            features = data[features_list]\n            return features\n    \n    def __init__(self, dataset, datatype, features_list, targets_list, lookback):\n        self.datatype = datatype\n        self.data = read_data(dataset = dataset, datatype = datatype)\n        self.features = features_list\n        self.targets = targets_list\n        self.data[\"Id_encoded\"], _ = pd.factorize(self.data[\"Id\"])\n        self.lookback = lookback\n        \n        if datatype == \"train\":\n            self.data = self.data[:1_000]\n            self.data[\"target\"] = FOGDataset.encode_target(self.data, self.targets)\n    \n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        if self.datatype == \"train\":            \n            features, targets = FOGDataset.get_features_target(self.data,\n                                               self.features,\n                                               self.datatype\n                                              )\n            \n            if idx < self.lookback :\n                features = features[0: self.lookback]\n                targets = targets[self.lookback]\n            \n            else:\n                features = features[idx - self.lookback: idx]\n                targets = targets[idx]\n                \n            features = torch.tensor(features.to_numpy(), dtype=torch.float32)\n            targets = torch.tensor(targets, dtype=torch.float32)\n            \n            return features, targets\n        else:\n            features = FOGDataset.get_features_target(self.data,\n                                               self.features,\n                                               self.datatype\n                                              )\n            \n            if idx < self.lookback :\n                features = features[0: self.lookback]\n            \n            else:\n                features = features[idx - self.lookback: idx]\n                \n            features = torch.tensor(features.to_numpy(), dtype=torch.float32)\n            \n            return features","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:13:38.327289Z","iopub.execute_input":"2023-06-08T21:13:38.328254Z","iopub.status.idle":"2023-06-08T21:13:38.348187Z","shell.execute_reply.started":"2023-06-08T21:13:38.328218Z","shell.execute_reply":"2023-06-08T21:13:38.34674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_train = FOGDataset(\n    dataset = \"tdcsfog\",\n    datatype = \"train\",\n    features_list = FEATURES,\n    targets_list = TARGETS,\n    lookback = 2\n)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:13:38.35089Z","iopub.execute_input":"2023-06-08T21:13:38.351824Z","iopub.status.idle":"2023-06-08T21:16:10.772523Z","shell.execute_reply.started":"2023-06-08T21:13:38.351789Z","shell.execute_reply":"2023-06-08T21:16:10.770924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_test = FOGDataset(\n    dataset = \"tdcsfog\",\n    datatype = \"test\",\n    features_list = FEATURES,\n    targets_list = TARGETS,\n    lookback = 2\n)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:10.774687Z","iopub.execute_input":"2023-06-08T21:16:10.775036Z","iopub.status.idle":"2023-06-08T21:16:10.836651Z","shell.execute_reply.started":"2023-06-08T21:16:10.775005Z","shell.execute_reply":"2023-06-08T21:16:10.83517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataloader_train = DataLoader(dataset_train, batch_size = 8, shuffle = False)\ndataloader_test = DataLoader(dataset_test, batch_size = 1000, shuffle = False)\n\ncount = 0\n\nfor batch in dataloader_train:\n    features, target = batch\n    print(\"FEATURES EXAMPLES\")\n    print(features.shape)\n    print(features)\n    print(\"TARGET EXAMPLES\")\n    print(target)\n    print(\"\\n\")\n    if count > 1:  \n        break\n    count += 1","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:10.838546Z","iopub.execute_input":"2023-06-08T21:16:10.838967Z","iopub.status.idle":"2023-06-08T21:16:11.02182Z","shell.execute_reply.started":"2023-06-08T21:16:10.838933Z","shell.execute_reply":"2023-06-08T21:16:11.020152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class LSTMNet(nn.Module):\n    def __init__(self, input_size, hidden_size, num_layers, num_classes):\n        super().__init__()\n        self.hidden_size = hidden_size\n        self.num_layers = num_layers\n        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)\n        self.fc1 = nn.Linear(hidden_size, num_classes)\n\n    def forward(self, x):\n\n        hidden_state = torch.zeros((self.num_layers, x.size(0), self.hidden_size), dtype=torch.float32)\n        cell_state = torch.zeros((self.num_layers, x.size(0), self.hidden_size), dtype=torch.float32)\n\n        out, _ = self.lstm(x, (hidden_state, cell_state))\n        out = out[:, -1,:]\n        out = self.fc1(out)\n        return out","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:11.025155Z","iopub.execute_input":"2023-06-08T21:16:11.025612Z","iopub.status.idle":"2023-06-08T21:16:11.036044Z","shell.execute_reply.started":"2023-06-08T21:16:11.025577Z","shell.execute_reply":"2023-06-08T21:16:11.034845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(model, dataloader, loss_fn, optimizer):\n    model.train()\n    total_loss = 0\n    for epoch in range(N_EPOCHS):\n        mean_precision = []\n        for (features, targets) in tqdm(dataloader):\n            optimizer.zero_grad()\n            preds = model(features)\n            loss = loss_fn(preds, targets.long())\n            mean_precision.append(loss.item())\n            loss.backward()\n            optimizer.step()\n        \n        print(\"Average Precision : \", np.mean(mean_precision))\n    \n    return model\n\ndef predict(model, dataloader): \n    model.eval()\n    predictions = np.empty(len(dataset_test))\n    count = 0\n    for features in tqdm(dataloader):\n        preds = model(features)\n        preds = torch.argmax(preds, dim = 1)\n        preds = preds.numpy()\n        predictions[count : count + len(preds)] = preds\n        count += len(preds)\n            \n    return predictions","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:11.037792Z","iopub.execute_input":"2023-06-08T21:16:11.038869Z","iopub.status.idle":"2023-06-08T21:16:11.052852Z","shell.execute_reply.started":"2023-06-08T21:16:11.038831Z","shell.execute_reply":"2023-06-08T21:16:11.051819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"INPUT_SIZE = len(FEATURES)\nHIDDEN_SIZE = 10\nNUM_LAYERS = 1\nNUM_CLASSES = 4\nPARAMS = {\n    \"input_size\" : INPUT_SIZE,\n    \"hidden_size\" : HIDDEN_SIZE,\n    \"num_layers\" : NUM_LAYERS,\n    \"num_classes\" : NUM_CLASSES\n}\nmodel = LSTMNet(**PARAMS)\n\nloss_fn = CrossEntropyLoss()\n\noptimizer = optim.Adam(model.parameters(), lr=0.001)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:11.054389Z","iopub.execute_input":"2023-06-08T21:16:11.054746Z","iopub.status.idle":"2023-06-08T21:16:11.074548Z","shell.execute_reply.started":"2023-06-08T21:16:11.054717Z","shell.execute_reply":"2023-06-08T21:16:11.072943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = train(\n    model, \n    dataloader_train,\n    loss_fn,\n    optimizer\n)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:11.076288Z","iopub.execute_input":"2023-06-08T21:16:11.076691Z","iopub.status.idle":"2023-06-08T21:16:12.389039Z","shell.execute_reply.started":"2023-06-08T21:16:11.07666Z","shell.execute_reply":"2023-06-08T21:16:12.38793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_tdcsfog = predict(model, dataloader_test)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:12.390622Z","iopub.execute_input":"2023-06-08T21:16:12.391638Z","iopub.status.idle":"2023-06-08T21:16:15.922559Z","shell.execute_reply.started":"2023-06-08T21:16:12.391597Z","shell.execute_reply":"2023-06-08T21:16:15.921686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_tdcsfog","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:15.923996Z","iopub.execute_input":"2023-06-08T21:16:15.924737Z","iopub.status.idle":"2023-06-08T21:16:15.935499Z","shell.execute_reply.started":"2023-06-08T21:16:15.924692Z","shell.execute_reply":"2023-06-08T21:16:15.933838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_tdcsfog = read_data(dataset = \"tdcsfog\", datatype = \"test\")\ntest_defog = read_data(dataset = \"defog\", datatype = \"test\")\n\nlen_test_tdcsfog = len(test_tdcsfog)\nlen_test_defog = len(test_defog)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:15.939823Z","iopub.execute_input":"2023-06-08T21:16:15.940213Z","iopub.status.idle":"2023-06-08T21:16:16.656444Z","shell.execute_reply.started":"2023-06-08T21:16:15.940184Z","shell.execute_reply":"2023-06-08T21:16:16.653577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_tdcsfog[\"y_pred\"] = preds_tdcsfog\ntest_defog[\"y_pred\"] = np.zeros(len_test_defog)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:16.658489Z","iopub.execute_input":"2023-06-08T21:16:16.659298Z","iopub.status.idle":"2023-06-08T21:16:16.670018Z","shell.execute_reply.started":"2023-06-08T21:16:16.659251Z","shell.execute_reply":"2023-06-08T21:16:16.668558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_fmt = pd.read_csv(\"/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/sample_submission.csv\")\n","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:16.671621Z","iopub.execute_input":"2023-06-08T21:16:16.671977Z","iopub.status.idle":"2023-06-08T21:16:16.962069Z","shell.execute_reply.started":"2023-06-08T21:16:16.671948Z","shell.execute_reply":"2023-06-08T21:16:16.960657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_fmt.info()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:16.963705Z","iopub.execute_input":"2023-06-08T21:16:16.964043Z","iopub.status.idle":"2023-06-08T21:16:17.077748Z","shell.execute_reply.started":"2023-06-08T21:16:16.964016Z","shell.execute_reply":"2023-06-08T21:16:17.076132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.DataFrame()\nfor data in [test_tdcsfog, test_defog]:\n    temp = data.copy()\n    temp[\"Id\"] = temp.apply(lambda x : str(x.Id) + \"_\" + str(x.Time), axis = 1)\n    temp['StartHesitation'] = np.where(temp['y_pred']==1, 1, 0)\n    temp['Turn'] = np.where(temp['y_pred']==2, 1, 0)\n    temp['Walking'] = np.where(temp['y_pred']==3, 1, 0)\n    temp = temp[[\"Id\"] + TARGETS]\n    sub = pd.concat([sub, temp])","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:17.079706Z","iopub.execute_input":"2023-06-08T21:16:17.080147Z","iopub.status.idle":"2023-06-08T21:16:25.890534Z","shell.execute_reply.started":"2023-06-08T21:16:17.08011Z","shell.execute_reply":"2023-06-08T21:16:25.88936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:25.892556Z","iopub.execute_input":"2023-06-08T21:16:25.893031Z","iopub.status.idle":"2023-06-08T21:16:25.92401Z","shell.execute_reply.started":"2023-06-08T21:16:25.892991Z","shell.execute_reply":"2023-06-08T21:16:25.922103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(sub)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:25.925907Z","iopub.execute_input":"2023-06-08T21:16:25.926476Z","iopub.status.idle":"2023-06-08T21:16:25.93666Z","shell.execute_reply.started":"2023-06-08T21:16:25.926427Z","shell.execute_reply":"2023-06-08T21:16:25.934893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.info()","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:25.938815Z","iopub.execute_input":"2023-06-08T21:16:25.939384Z","iopub.status.idle":"2023-06-08T21:16:26.059616Z","shell.execute_reply.started":"2023-06-08T21:16:25.939322Z","shell.execute_reply":"2023-06-08T21:16:26.057831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_fmt.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:26.061484Z","iopub.execute_input":"2023-06-08T21:16:26.061835Z","iopub.status.idle":"2023-06-08T21:16:26.075346Z","shell.execute_reply.started":"2023-06-08T21:16:26.061797Z","shell.execute_reply":"2023-06-08T21:16:26.074133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(sub_fmt)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:26.077204Z","iopub.execute_input":"2023-06-08T21:16:26.078008Z","iopub.status.idle":"2023-06-08T21:16:26.091369Z","shell.execute_reply.started":"2023-06-08T21:16:26.077965Z","shell.execute_reply":"2023-06-08T21:16:26.089826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub.to_csv(\"/kaggle/working/submission.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2023-06-08T21:16:26.094146Z","iopub.execute_input":"2023-06-08T21:16:26.094746Z","iopub.status.idle":"2023-06-08T21:16:27.059074Z","shell.execute_reply.started":"2023-06-08T21:16:26.094709Z","shell.execute_reply":"2023-06-08T21:16:27.057488Z"},"trusted":true},"execution_count":null,"outputs":[]}]}