{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":10238128,"sourceType":"datasetVersion","datasetId":6303980},{"sourceId":10247229,"sourceType":"datasetVersion","datasetId":6337600}],"dockerImageVersionId":30804,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Readme\nThis is the code has been **refactored** for easily readable, so it may look a little bit different compared to previous version (**Version 6** in Kaggle). This is the implementation of the **final architecture** proposed in the report, along with other feature extraction. To check previous version, including training and plot using in the report, please check out older version.\n\nFor convenient find these keywords to check module:\n- FEATURE ENMO\n- FEATURE LIGHT\n- Statistic features\n- CNN\n- DROPOUT\n- SIGMOID\n- L2 regularization","metadata":{}},{"cell_type":"markdown","source":"# Import","metadata":{}},{"cell_type":"code","source":"# data analysis\nimport pandas as pd\nimport numpy as np\nimport torch\nfrom concurrent.futures import ThreadPoolExecutor\n\n# visualization\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# machine learning\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC, LinearSVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.linear_model import Perceptron\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.tree import DecisionTreeClassifier\n\n#other\nimport os\nfrom tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:30:58.052344Z","iopub.execute_input":"2024-12-21T21:30:58.052689Z","iopub.status.idle":"2024-12-21T21:31:00.421765Z","shell.execute_reply.started":"2024-12-21T21:30:58.052660Z","shell.execute_reply":"2024-12-21T21:31:00.420813Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Final function to use:","metadata":{}},{"cell_type":"code","source":"#no need because all parquet ids have the output sii. Checked.\ndef filter_na(tabular, dirname):\n    tabular = tabular.dropna(subset='sii')\n    ids = tabular['id']\n    par_ids = os.listdir(dirname)\n    par_ids = [item.replace('id=', '') for item in par_ids]\n    par_ids = pd.Series(par_ids, name='id')\n    temp = len(par_ids)\n    print(temp)\n    par_ids = par_ids[par_ids.isin(ids)]\n    print(len(par_ids))\n    print(par_ids.isin(ids).all())\n\ndef extract_enmo(df_source, id=None):\n    df = df_source.copy()\n    df = df[df['non-wear_flag'] == 0]\n    df.drop('non-wear_flag', axis=1, inplace=True)\n    df.loc[:, 'Type_activity'] = 'Non-assigned'\n    df.loc[(df['enmo'] < 10*1e-3), 'Type_activity'] = 'sedentary'\n    df.loc[(df['enmo'] >= 10*1e-3) & (df['enmo'] < 100*1e-3), 'Type_activity'] = 'light'\n    df.loc[(df['enmo'] >= 100*1e-3), 'Type_activity'] = 'moderate'\n    \n    total_wear = df['step'].count()\n    \n    sedentary_perall = df[df['Type_activity'] == 'sedentary']['step'].count()\n    sedentary_perall = sedentary_perall / total_wear\n    \n    light_perall = df[df['Type_activity'] == 'light']['step'].count()\n    light_perall = light_perall / total_wear\n    \n    moderate_perall = df[df['Type_activity'] == 'moderate']['step'].count()\n    moderate_perall = moderate_perall / total_wear\n\n    sedentary_perall, light_perall, moderate_perall\n    return pd.DataFrame({'id': [id], \n                         'sedentary_por': [sedentary_perall], \n                         'light_por': [light_perall],\n                         'moderate_por': [moderate_perall]}\n                       )\n\n    \ndef extract_light(df_source, id=None):\n    df = df_source.copy()\n    df = df[df['non-wear_flag'] == 0]\n    df.drop('non-wear_flag', axis=1, inplace=True)\n    df.loc[:, 'Type_light'] = 'Non-assigned'\n    df.loc[(df['light'] < 25), 'Type_light'] = 'dark'\n    df.loc[(df['light'] >= 25) & (df['light'] < 100), 'Type_light'] = 'normal'\n    df.loc[(df['light'] >= 100), 'Type_light'] = 'bright'\n    \n    total_wear = df['step'].count()\n    \n    dark_perall = df[df['Type_light'] == 'dark']['step'].count()\n    dark_perall = dark_perall / total_wear\n    \n    normal_perall = df[df['Type_light'] == 'normal']['step'].count()\n    normal_perall = normal_perall / total_wear\n    \n    bright_perall = df[df['Type_light'] == 'bright']['step'].count()\n    bright_perall = bright_perall / total_wear\n    \n    dark_perall, normal_perall, bright_perall\n    return pd.DataFrame({'id': [id], \n                         'dark_por': [dark_perall], \n                         'normal_por': [normal_perall],\n                         'bright_por': [bright_perall]}\n                       )\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:31:00.423302Z","iopub.execute_input":"2024-12-21T21:31:00.423674Z","iopub.status.idle":"2024-12-21T21:31:00.434973Z","shell.execute_reply.started":"2024-12-21T21:31:00.423646Z","shell.execute_reply":"2024-12-21T21:31:00.434185Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# TEST: FEATURE ENMO","metadata":{}},{"cell_type":"code","source":"# STATUS: Done \nlistdir = os.listdir(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\nres_df = None\nfor dir in tqdm(listdir):\n    # print(dir)\n    dft = pd.read_parquet(os.path.join(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\", dir, \"part-0.parquet\"))\n    \n    id = dir[3:]\n    # Extract each id\n    ex_df = extract_enmo(dft, id=id)\n    if res_df is None:\n        res_df = ex_df\n    else:\n        res_df = pd.concat([res_df, ex_df])\n\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\ntrain = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntime_series = res_df\nselected = train[['id', 'sii']]\ntime_series = time_series.merge(selected, on='id', how='left')\n\n\ncorrelation = time_series.drop(columns = 'id').corr()\nsns.heatmap(correlation, annot=True, cmap=\"coolwarm\", fmt=\".2f\")\nplt.title(\"Heatmap Correlation of Features\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:31:00.436064Z","iopub.execute_input":"2024-12-21T21:31:00.436424Z","iopub.status.idle":"2024-12-21T21:33:20.937814Z","shell.execute_reply.started":"2024-12-21T21:31:00.436386Z","shell.execute_reply":"2024-12-21T21:33:20.936946Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# TEST: FEATURE LIGHT","metadata":{}},{"cell_type":"code","source":"#STATUS: Done \nlistdir = os.listdir(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\nres_df = None\nfor dir in tqdm(listdir):\n    # print(dir)\n    dft = pd.read_parquet(os.path.join(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\", dir, \"part-0.parquet\"))\n    \n    id = dir[3:]\n    # Extract each id\n    ex_df = extract_light(dft, id=id)\n    if res_df is None:\n        res_df = ex_df\n    else:\n        res_df = pd.concat([res_df, ex_df])\n\n\nres_df.reset_index()\nimport seaborn as sns\nimport matplotlib.pyplot as plt\ntrain = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntime_series = res_df\nselected = train[['id', 'sii']]\ntime_series = time_series.merge(selected, on='id', how='left')\ntime_series.head()\n\ncorrelation = time_series.drop(columns = 'id').corr()\nsns.heatmap(correlation, annot=True, cmap=\"coolwarm\", fmt=\".2f\")\nplt.title(\"Heatmap Correlation of Features\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:33:20.939596Z","iopub.execute_input":"2024-12-21T21:33:20.939851Z","iopub.status.idle":"2024-12-21T21:34:54.201184Z","shell.execute_reply.started":"2024-12-21T21:33:20.939825Z","shell.execute_reply":"2024-12-21T21:34:54.200202Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Statistic features","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\ntrain_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:34:54.202181Z","iopub.execute_input":"2024-12-21T21:34:54.202428Z","iopub.status.idle":"2024-12-21T21:34:54.263995Z","shell.execute_reply.started":"2024-12-21T21:34:54.202404Z","shell.execute_reply":"2024-12-21T21:34:54.263079Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n    return df.describe().values.reshape(-1), filename.split('=')[1]\n\n\ndef load_time_series(dirname) -> pd.DataFrame:\n    ids = os.listdir(dirname)\n    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n    stats, indexes = zip(*results)\n    df = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n    return df\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:34:54.264940Z","iopub.execute_input":"2024-12-21T21:34:54.265228Z","iopub.status.idle":"2024-12-21T21:34:54.271403Z","shell.execute_reply.started":"2024-12-21T21:34:54.265164Z","shell.execute_reply":"2024-12-21T21:34:54.270537Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts  = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:34:54.272605Z","iopub.execute_input":"2024-12-21T21:34:54.273259Z","iopub.status.idle":"2024-12-21T21:36:03.324605Z","shell.execute_reply.started":"2024-12-21T21:34:54.273216Z","shell.execute_reply":"2024-12-21T21:36:03.323762Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:36:03.325623Z","iopub.execute_input":"2024-12-21T21:36:03.325891Z","iopub.status.idle":"2024-12-21T21:36:03.353087Z","shell.execute_reply.started":"2024-12-21T21:36:03.325864Z","shell.execute_reply":"2024-12-21T21:36:03.352199Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Using CNN to extract feature","metadata":{}},{"cell_type":"code","source":"# data analysis\nimport pandas as pd\nimport numpy as np\nfrom concurrent.futures import ThreadPoolExecutor\n\n# visualization\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# machine learning\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC, LinearSVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.linear_model import Perceptron\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import train_test_split\n\n\nfrom torch.utils.data import DataLoader\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\n#other\nimport os\nfrom tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:43:14.131695Z","iopub.execute_input":"2024-12-21T21:43:14.132066Z","iopub.status.idle":"2024-12-21T21:43:14.140775Z","shell.execute_reply.started":"2024-12-21T21:43:14.132036Z","shell.execute_reply":"2024-12-21T21:43:14.139794Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Architecture","metadata":{}},{"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(self):\n        super(CNN, self).__init__()\n        self.cur_epoch = 0\n        #input (N, 5)\n        self.conv1 = nn.Conv1d(5, 64, kernel_size=3, stride=2, padding='valid') # 32, N, 1\n        self.maxpool1 = nn.MaxPool1d(kernel_size=2, stride=2)\n\n        self.conv2 = nn.Conv1d(64, 128, kernel_size=3, stride=2, padding='valid') # 32, N, 1\n        self.maxpool2 = nn.MaxPool1d(kernel_size=2, stride=2)\n\n        self.conv3 = nn.Conv1d(128, 128, kernel_size=3, stride=2, padding='valid') # 32, N, 1\n        self.maxpool3 = nn.MaxPool1d(kernel_size=2, stride=2)\n\n        self.conv4 = nn.Conv1d(128, 256, kernel_size=3, stride=2, padding='valid') # 32, N, 1\n        self.maxpool4 = nn.MaxPool1d(kernel_size=2, stride=2)\n\n        self.conv5 = nn.Conv1d(256, 256, kernel_size=3, stride=2, padding='valid')\n        \n        self.fc1 = nn.Linear(256, 128) # Adjust output size based on input dims\n        self.fc2 = nn.Linear(128, 64)\n        self.fc3 = nn.Linear(64, 4)\n\n        self.dropout1 = nn.Dropout(0.3, inplace=False)\n        self.dropout2 = nn.Dropout(0.3, inplace=False)\n\n        self.leaky_relu = nn.LeakyReLU(0.1)\n        self.sigmoid = nn.Sigmoid()\n\n    def forward(self, x, debug=False):\n        x = self.leaky_relu(self.conv1(x))\n        if debug: print(x.shape)\n        x = self.maxpool1(x)\n        if debug: print(x.shape)\n\n        x = self.leaky_relu(self.conv2(x))\n        if debug: print(x.shape)\n        x = self.maxpool2(x)\n        if debug: print(x.shape)\n\n        x = self.leaky_relu(self.conv3(x))\n        if debug: print(x.shape)\n        x = self.maxpool3(x)\n        if debug: print(x.shape)\n\n        x = self.leaky_relu(self.conv4(x))\n        if debug: print(x.shape)\n        x = self.maxpool4(x)\n        if debug: print(x.shape)\n\n        x = self.leaky_relu(self.conv5(x))\n        if debug: print(x.shape)\n\n        x = F.adaptive_avg_pool1d(x, 1).squeeze() # GlOBAL POOLING\n        if debug: print(x.shape)\n\n        x = self.sigmoid(self.fc1(x))\n        if debug: print(x.shape)\n        x = self.dropout1(x) # DROPOUT\n        \n        x = self.sigmoid(self.fc2(x)) #SIGMOID , act1 is sigmoid, act is LeakyReLU.\n        x = self.dropout2(x) # DROPOUT\n        \n        x = self.fc3(x)\n        if debug: print(x.shape)\n        x = F.softmax(x, dim=0)\n\n        return x\n\n\n#TEST: DONE\n# model = CNN()\n# input = torch.rand(5, 853)\n# output = model(input, True)\n# print(output)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:43:16.484442Z","iopub.execute_input":"2024-12-21T21:43:16.485293Z","iopub.status.idle":"2024-12-21T21:43:16.496048Z","shell.execute_reply.started":"2024-12-21T21:43:16.485257Z","shell.execute_reply":"2024-12-21T21:43:16.495309Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Training set and validation set","metadata":{}},{"cell_type":"code","source":"def split_train_test(ids, test_size=0.2, random_state=24):\n    \"\"\"Splits IDs into train and test sets.\"\"\"\n    train_ids, val_ids = train_test_split(ids, test_size=test_size, random_state=random_state)\n    return train_ids, val_ids\n\nclass Dataset:\n    def __init__(self, device, path_tabu, path_ts, preload=True, type='train', random_state=24):\n        self.device = device\n        self.path_ts = path_ts\n        self.tabu_data = pd.read_csv(path_tabu) \n        self.ids = [x[3:] for x in os.listdir(path_ts)]\n        self.filter()\n        self.ids.sort()\n\n        # Split into train and val sets\n        train_ids, val_ids = split_train_test(self.ids, test_size=0.2, random_state=random_state)\n\n        # Assign IDs based on type\n        self.type = type\n        if type == 'train':\n            self.ids = train_ids\n        elif type == 'val':\n            self.ids = val_ids\n\n        self.preload = preload\n        if self.preload:\n            self.ts_data_X, self.ts_data_Y = self.load_all_data()\n    \n    def filter(self):\n        temp_ids = []\n        for id in tqdm(self.ids):\n            df = pd.read_parquet(os.path.join(self.path_ts, \"id=\" + id, \"part-0.parquet\"))\n            if df.shape[0] >= 900:\n                temp_ids.append(id)\n        self.ids = temp_ids\n\n    def collate(self, index):\n        X = [self.ts_data_X[i].to(self.device) for i in index]\n        Y = None\n        if self.ts_data_Y is not None:\n            Y = [self.ts_data_Y[i] for i in index]\n            Y = torch.tensor(Y, dtype=torch.int64)\n            Y = torch.nn.functional.one_hot(Y, num_classes=4).to(self.device).to(torch.float32)\n        return {'X': X,\n                'Y': Y}\n            \n    def dataloader(self, batch_size=1):\n        size = len(self.ts_data_X)\n        batch_size = size if batch_size == -1 else batch_size\n        loader = DataLoader(list(range(size)), batch_size=batch_size, collate_fn=self.collate, shuffle=True if self.type == 'test' else False, num_workers=0)\n        return loader\n        \n    def load_all_data(self):\n        count = 0\n        inputs = []\n        labels = None if self.type == 'test' else list()\n        for id in tqdm(self.ids):\n            df = pd.read_parquet(os.path.join(self.path_ts, \"id=\" + id, \"part-0.parquet\"))\n            df = df.loc[:, ['X', 'Y', 'Z', 'enmo', 'anglez']]\n            # normalize the signals \n            scaler = StandardScaler()\n            df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)\n\n            input = torch.tensor(df.values)\n            input = input.T\n            inputs.append(input)\n            if self.type != 'test': labels.append(self.tabu_data[self.tabu_data['id'] == id]['sii'].values[0])\n        return inputs, labels\n    \n        ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:43:19.475543Z","iopub.execute_input":"2024-12-21T21:43:19.476285Z","iopub.status.idle":"2024-12-21T21:43:19.488483Z","shell.execute_reply.started":"2024-12-21T21:43:19.476248Z","shell.execute_reply":"2024-12-21T21:43:19.487479Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Trainer","metadata":{}},{"cell_type":"code","source":"class Trainer:\n    def __init__(self, model, optimizer, loss_fn=F.binary_cross_entropy):\n        self.optim = optimizer\n        self.model = model\n        self.cur_epoch = model.cur_epoch\n        self.loss_fn = loss_fn\n\n    def train_one_epoch(self, dataloader):\n        self.model.train()\n        epoch_loss = 0.0\n        \n        with tqdm(dataloader, desc=\"Training\", unit=\"batch\") as pbar:\n            for data in pbar:\n                X = data['X']\n                Y = data['Y']\n\n                self.optim.zero_grad()\n\n                outs = []\n                for x in X:\n                    outs.append(self.model(x))\n                outs = torch.stack(outs, dim=0)\n\n                loss = self.loss_fn(outs, Y)\n                loss.backward()\n                self.optim.step()\n\n                epoch_loss += loss.item()\n                pbar.set_postfix(loss=loss.item())\n        \n        # Return the average loss for this epoch\n        return epoch_loss / len(dataloader)\n    def evaluate(self, valloader):\n        model.eval()\n        for data in valloader:\n            X = data['X']\n            Y = data['Y']\n\n            outs = []\n            with torch.no_grad():\n                for x in X:\n                    outs.append(self.model(x))\n                outs = torch.stack(outs, dim=0)\n                loss = nn.functional.binary_cross_entropy(outs, Y).item()\n                outs = torch.argmax(outs, dim=-1)\n                Y = torch.argmax(Y, dim=-1)\n                outs = outs.cpu().detach().numpy()\n                Y = Y.cpu().detach().numpy()\n            return accuracy_score(Y, outs), loss\n            \n            \n                \n    def train(self, trainloader, max_epoch, validloader=None):\n        tracking_train = []\n        tracking_val = []\n        tracking_val_BCE = []\n        self.cur_epoch = self.model.cur_epoch\n        for epoch in range(self.cur_epoch + 1, max_epoch + 1):\n            print(f\"Epoch {epoch}/{max_epoch}\")\n            \n            # Train for one epoch and log the loss\n            train_loss = self.train_one_epoch(trainloader)\n            tracking_train.append( (epoch, train_loss) )\n            print(f\"Epoch {epoch} Training Loss: {train_loss:.4f}\")\n\n            if epoch % 5 == 0:\n                print(\"Valid:\")\n                accuracy, BCE_loss = self.evaluate(validloader)\n                print(f\"Epoch {epoch} Accuracy: {accuracy:.6f} BCE_loss: {BCE_loss:.6f}\")\n                tracking_val.append( (epoch, accuracy) )\n                tracking_val_BCE.append( (epoch, BCE_loss))\n            if epoch % 5 == 0:\n                torch.save(model.state_dict(), f\"model-{epoch}.pth\")\n            self.model.cur_epoch = epoch\n            \n        self.cur_epoch = max_epoch\n        return tracking_train, tracking_val, tracking_val_BCE\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:43:22.676082Z","iopub.execute_input":"2024-12-21T21:43:22.676730Z","iopub.status.idle":"2024-12-21T21:43:22.688143Z","shell.execute_reply.started":"2024-12-21T21:43:22.676696Z","shell.execute_reply":"2024-12-21T21:43:22.687309Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#training\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\ntrain_tabu_path=\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\"\ntrain_ts_path='/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet'\n\ntrainset = Dataset(device, path_tabu=train_tabu_path, path_ts=train_ts_path, type='train')\ntrainloader = trainset.dataloader(batch_size=40)\n\nvalset = Dataset(device, path_tabu=train_tabu_path, path_ts=train_ts_path, type='val')\nvalloader = valset.dataloader(batch_size=-1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:43:25.913752Z","iopub.execute_input":"2024-12-21T21:43:25.914737Z","iopub.status.idle":"2024-12-21T21:45:27.867197Z","shell.execute_reply.started":"2024-12-21T21:43:25.914689Z","shell.execute_reply":"2024-12-21T21:45:27.866198Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = CNN()\nmodel.to(device)\noptimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5)\ntrainer = Trainer(model, optimizer)\ntracking_train, tracking_val, tracking_val_BCE = trainer.train(trainloader, 120, valloader)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:45:34.363056Z","iopub.execute_input":"2024-12-21T21:45:34.363652Z","iopub.status.idle":"2024-12-21T22:06:36.414580Z","shell.execute_reply.started":"2024-12-21T21:45:34.363618Z","shell.execute_reply":"2024-12-21T22:06:36.413485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5) # L2 regularization\ntrainer = Trainer(model, optimizer)\ntracking_train1, tracking_val1, tracking_val_BCE1 = trainer.train(trainloader, 120, valloader)\ntracking_train = tracking_train + tracking_train1\ntracking_val = tracking_val + tracking_val1\ntracking_val_BCE = tracking_val_BCE + tracking_val_BCE1","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T21:36:22.379870Z","iopub.status.idle":"2024-12-21T21:36:22.380148Z","shell.execute_reply.started":"2024-12-21T21:36:22.380017Z","shell.execute_reply":"2024-12-21T21:36:22.380030Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\ndef show_result(tracking_train, tracking_val, tracking_val_BCE):\n    # Unpack data for training and validation\n    epochs_train, train_losses = zip(*tracking_train)\n    epochs_val_BCE, val_bce_losses = zip(*tracking_val_BCE)\n    \n    # Plot training loss and validation BCE loss in the same figure\n    plt.plot(epochs_train, train_losses, marker='o', linestyle='-', color='b', label='Training Loss')\n    plt.plot(epochs_val_BCE, val_bce_losses, marker='o', linestyle='--', color='r', label='Validation BCE Loss')\n    \n    plt.xlabel('Epochs')\n    plt.ylabel('Loss')\n    plt.title('Training and Validation BCE Loss Over Epochs')\n    plt.grid(True)\n    plt.legend()\n    plt.show()\n    \n    # Plot validation accuracy separately\n    epochs_val, accuracy = zip(*tracking_val)\n    plt.plot(epochs_val, accuracy, marker='o', linestyle='-', color='g', label='Validation Accuracy')\n    plt.xlabel('Epochs')\n    plt.ylabel('Accuracy')\n    plt.title('Validation Accuracy Over Epochs')\n    plt.grid(True)\n    plt.legend()\n    plt.show()\n\nshow_result(tracking_train, tracking_val, tracking_val_BCE)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T22:06:48.250201Z","iopub.execute_input":"2024-12-21T22:06:48.251089Z","iopub.status.idle":"2024-12-21T22:06:48.721573Z","shell.execute_reply.started":"2024-12-21T22:06:48.251058Z","shell.execute_reply":"2024-12-21T22:06:48.720623Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}