{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.15","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30788,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Import dependancies\nimport pandas as pd\nimport numpy as np\nimport pyarrow.parquet as pq\nimport random\nfrom sklearn.decomposition import PCA\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\nimport logging","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:05:50.841000Z","iopub.execute_input":"2024-11-02T07:05:50.841467Z","iopub.status.idle":"2024-11-02T07:06:15.859357Z","shell.execute_reply.started":"2024-11-02T07:05:50.841440Z","shell.execute_reply":"2024-11-02T07:06:15.858386Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Setup logging\nlogging.basicConfig(level=logging.INFO)\n\n# Load the label data from CSV\ntraining_csv_path = '/kaggle/input/child-mind-institute-problematic-internet-use/train.csv'\nlabels_df = pd.read_csv(training_csv_path)\n\n# Initialize lists to store the data and corresponding labels\ndata_list = []\nlabel_list = []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:06:15.860951Z","iopub.execute_input":"2024-11-02T07:06:15.861317Z","iopub.status.idle":"2024-11-02T07:06:15.925680Z","shell.execute_reply.started":"2024-11-02T07:06:15.861291Z","shell.execute_reply":"2024-11-02T07:06:15.924744Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load each Parquet file\nbase_parquet_path = '/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet/'\nfor index, row in labels_df.iterrows():\n    file_id = row['id']\n    parquet_file_path = f'{base_parquet_path}id={file_id}/part-0.parquet'\n    \n    # Read the Parquet file\n    try:\n        data = pq.read_table(parquet_file_path).to_pandas()\n        data['id'] = file_id  # Retain 'id' for grouping purposes\n        data_list.append(data)\n        label_list.append(row['sii'])\n    except:\n        pass","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:06:15.926812Z","iopub.execute_input":"2024-11-02T07:06:15.927093Z","iopub.status.idle":"2024-11-02T07:07:13.861772Z","shell.execute_reply.started":"2024-11-02T07:06:15.927067Z","shell.execute_reply":"2024-11-02T07:07:13.860827Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert lists to DataFrames\ndata_df = pd.concat(data_list, ignore_index=True)\nlabels = np.array(label_list)\n\n# Define feature columns\nfeature_columns = ['X', 'Y', 'Z', 'enmo', 'anglez', 'non-wear_flag', 'light', \n                   'battery_voltage', 'time_of_day', 'quarter', 'relative_date_PCIAT']\n\n# Initialize a dictionary to hold arrays for each `id`\ndata_by_id = {}\nfor file_id, group in data_df.groupby('id'):\n    features_array = group[feature_columns].values\n    pca = PCA(n_components=10)  # Adjust components as needed\n    features_array = pca.fit_transform(features_array)\n    aggregated_features = np.mean(features_array, axis=0)\n    data_by_id[file_id] = aggregated_features","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:07:13.863816Z","iopub.execute_input":"2024-11-02T07:07:13.864140Z","iopub.status.idle":"2024-11-02T07:08:57.624707Z","shell.execute_reply.started":"2024-11-02T07:07:13.864110Z","shell.execute_reply":"2024-11-02T07:08:57.623405Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert data_by_id to a list of arrays\nfeature_arrays = np.array(list(data_by_id.values()))\nlabels = np.array(label_list)\n\n# Normalize data\nscaler = StandardScaler()\nX = scaler.fit_transform(feature_arrays)\n\n# One-hot encode the labels\nnum_classes = len(np.unique(labels))\nlabels = labels.astype(int)\ny_one_hot = np.eye(num_classes)[labels]\n\n# Split the data into training and test sets\nX_train, X_test, y_train, y_test = train_test_split(X, y_one_hot, test_size=0.3, random_state=100)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:08:57.626001Z","iopub.execute_input":"2024-11-02T07:08:57.626315Z","iopub.status.idle":"2024-11-02T07:08:57.635822Z","shell.execute_reply.started":"2024-11-02T07:08:57.626285Z","shell.execute_reply":"2024-11-02T07:08:57.635032Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert to PyTorch tensors and ensure correct shape\nX_train_tensor = torch.tensor(X_train, dtype=torch.float32).unsqueeze(1)\nX_test_tensor = torch.tensor(X_test, dtype=torch.float32).unsqueeze(1)\ny_train_tensor = torch.tensor(y_train, dtype=torch.float32)\ny_test_tensor = torch.tensor(y_test, dtype=torch.float32)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:08:57.636675Z","iopub.execute_input":"2024-11-02T07:08:57.636948Z","iopub.status.idle":"2024-11-02T07:08:57.648664Z","shell.execute_reply.started":"2024-11-02T07:08:57.636922Z","shell.execute_reply":"2024-11-02T07:08:57.647928Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the CNN model\nclass SimpleCNN(nn.Module):\n    def __init__(self, dropout_rate=0.5, num_classes=10):\n        super(SimpleCNN, self).__init__()\n        self.conv1 = nn.Conv1d(1, 32, kernel_size=3, stride=1, padding=1)\n        self.bn1 = nn.BatchNorm1d(32)\n        self.pool = nn.MaxPool1d(kernel_size=2, stride=2)\n        self.conv2 = nn.Conv1d(32, 64, kernel_size=3, stride=1, padding=1)\n        self.bn2 = nn.BatchNorm1d(64)\n        \n        # Calculate the output size after convolution and pooling layers\n        conv1_out = (X_train_tensor.shape[2] + 2 * 1 - 3) // 1 + 1\n        pool1_out = conv1_out // 2\n        conv2_out = (pool1_out + 2 * 1 - 3) // 1 + 1\n        pool2_out = conv2_out // 2\n        \n        self.fc1 = nn.Linear(64 * pool2_out, 128)\n        self.fc2 = nn.Linear(128, num_classes)\n        self.dropout = nn.Dropout(p=dropout_rate)\n    \n    def forward(self, x):\n        x = self.pool(F.relu(self.bn1(self.conv1(x))))\n        x = self.pool(F.relu(self.bn2(self.conv2(x))))\n        x = x.view(x.size(0), -1)\n        x = F.relu(self.fc1(x))\n        x = self.dropout(x)\n        x = self.fc2(x)\n        return x","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:08:57.649555Z","iopub.execute_input":"2024-11-02T07:08:57.649805Z","iopub.status.idle":"2024-11-02T07:08:57.660349Z","shell.execute_reply.started":"2024-11-02T07:08:57.649782Z","shell.execute_reply":"2024-11-02T07:08:57.659718Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Instantiate the model\nmodel = SimpleCNN(num_classes=num_classes)\n\n# Define loss function and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.0005, weight_decay=1e-5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:08:57.661101Z","iopub.execute_input":"2024-11-02T07:08:57.661319Z","iopub.status.idle":"2024-11-02T07:09:02.335702Z","shell.execute_reply.started":"2024-11-02T07:08:57.661296Z","shell.execute_reply":"2024-11-02T07:09:02.334927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Data augmentation functions\ndef add_noise(data, noise_level=0.01):\n    noise = noise_level * np.random.normal(size=data.shape)\n    return data + noise\n\ndef random_scaling(data, scale_range=(0.9, 1.1)):\n    scale = random.uniform(*scale_range)\n    return data * scale\n\ndef time_warp(data, warp_factor=0.1):\n    warp = np.linspace(1 - warp_factor, 1 + warp_factor, data.shape[1])\n    warp = np.random.choice(warp, data.shape[1], replace=True)\n    return data * warp","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:02.336723Z","iopub.execute_input":"2024-11-02T07:09:02.337099Z","iopub.status.idle":"2024-11-02T07:09:02.342644Z","shell.execute_reply.started":"2024-11-02T07:09:02.337072Z","shell.execute_reply":"2024-11-02T07:09:02.342031Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Training loop with data augmentation and early stopping\nnum_epochs = 15\nbatch_size = 32\nearly_stopping_patience = 3\nmin_val_loss = float('inf')\npatience_counter = 0\n\nfor epoch in range(num_epochs):\n    model.train()\n    epoch_loss = 0\n    for i in range(0, len(X_train_tensor), batch_size):\n        X_batch = X_train_tensor[i:i + batch_size]\n        y_batch = y_train_tensor[i:i + batch_size]\n        \n        # Apply augmentations\n        if random.random() < 0.5:\n            X_batch = add_noise(X_batch)\n        if random.random() < 0.5:\n            X_batch = random_scaling(X_batch)\n        if random.random() < 0.5:\n            X_batch = time_warp(X_batch)\n        \n        X_batch = torch.tensor(X_batch, dtype=torch.float32)\n        outputs = model(X_batch)\n        loss = criterion(outputs, y_batch.argmax(dim=1))\n        epoch_loss += loss.item()\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n    \n    # Validation step\n    model.eval()\n    with torch.no_grad():\n        val_outputs = model(X_test_tensor)\n        val_loss = criterion(val_outputs, y_test_tensor.argmax(dim=1)).item()\n    \n    avg_epoch_loss = epoch_loss / (len(X_train_tensor) / batch_size)\n    print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {avg_epoch_loss:.4f}, Val Loss: {val_loss:.4f}')\n    \n    # Early stopping\n    if val_loss < min_val_loss:\n        min_val_loss = val_loss\n        patience_counter = 0\n    else:\n        patience_counter += 1\n        if patience_counter >= early_stopping_patience:\n            print(\"Early stopping triggered.\")\n            break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:02.344591Z","iopub.execute_input":"2024-11-02T07:09:02.344831Z","iopub.status.idle":"2024-11-02T07:09:03.228455Z","shell.execute_reply.started":"2024-11-02T07:09:02.344802Z","shell.execute_reply":"2024-11-02T07:09:03.227583Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Test accuracy\nmodel.eval()\nwith torch.no_grad():\n    test_outputs = model(X_test_tensor)\n    _, predicted = torch.max(test_outputs, 1)\n    y_test_classes = y_test_tensor.argmax(dim=1)\n    accuracy = (predicted == y_test_classes).float().mean()\n    print(f'Test Accuracy: {accuracy.item() * 100:.2f}%')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:03.229636Z","iopub.execute_input":"2024-11-02T07:09:03.229934Z","iopub.status.idle":"2024-11-02T07:09:03.237733Z","shell.execute_reply.started":"2024-11-02T07:09:03.229905Z","shell.execute_reply":"2024-11-02T07:09:03.236813Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Creating Submission file","metadata":{}},{"cell_type":"code","source":"# Define the same feature columns\nfeature_columns = ['X', 'Y', 'Z', 'enmo', 'anglez', 'non-wear_flag', 'light', \n                   'battery_voltage', 'time_of_day', 'quarter', 'relative_date_PCIAT']\n\n# Initialize lists to store the test data\ntest_data_list = []\ntest_ids = []\n\n# Load each test Parquet file\nbase_test_parquet_path = '/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet/'\ntest_file_ids = ['00115b9f', '001f3379']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:03.238749Z","iopub.execute_input":"2024-11-02T07:09:03.239010Z","iopub.status.idle":"2024-11-02T07:09:03.245788Z","shell.execute_reply.started":"2024-11-02T07:09:03.238984Z","shell.execute_reply":"2024-11-02T07:09:03.245034Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for file_id in test_file_ids:\n    parquet_file_path = f'{base_test_parquet_path}id={file_id}/part-0.parquet'\n    \n    # Read the Parquet file\n    try:\n        data = pq.read_table(parquet_file_path).to_pandas()\n        data['id'] = file_id  # Retain 'id' for submission\n        test_data_list.append(data)\n    except:\n        pass\n\n# Convert lists to DataFrame\ntest_data_df = pd.concat(test_data_list, ignore_index=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:03.246818Z","iopub.execute_input":"2024-11-02T07:09:03.247069Z","iopub.status.idle":"2024-11-02T07:09:03.447312Z","shell.execute_reply.started":"2024-11-02T07:09:03.247044Z","shell.execute_reply":"2024-11-02T07:09:03.446467Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Initialize a dictionary to hold arrays for each `id`\ntest_data_by_id = {}\nfor file_id, group in test_data_df.groupby('id'):\n    features_array = group[feature_columns].values\n    pca = PCA(n_components=10)  # Adjust components as needed\n    features_array = pca.fit_transform(features_array)\n    aggregated_features = np.mean(features_array, axis=0)\n    test_data_by_id[file_id] = aggregated_features\n\n# Convert test_data_by_id to a list of arrays\ntest_feature_arrays = np.array(list(test_data_by_id.values()))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:03.448571Z","iopub.execute_input":"2024-11-02T07:09:03.448902Z","iopub.status.idle":"2024-11-02T07:09:04.650367Z","shell.execute_reply.started":"2024-11-02T07:09:03.448872Z","shell.execute_reply":"2024-11-02T07:09:04.648901Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test_scaled = scaler.transform(test_feature_arrays)\n\n# Convert to PyTorch tensors\nX_test_tensor = torch.tensor(X_test_scaled, dtype=torch.float32).unsqueeze(1)\n\n# Make predictions\nmodel.eval()\nwith torch.no_grad():\n    test_outputs = model(X_test_tensor)\n    _, predicted = torch.max(test_outputs, 1)\n\n# Create the submission DataFrame\nsubmission_df = pd.DataFrame({\n    'id': list(test_data_by_id.keys()),\n    'sii': predicted.numpy()\n})\n\n# Save the submission file\nsubmission_file_path = 'submission.csv'\nsubmission_df.to_csv(submission_file_path, index=False)\n\nprint(f'Submission file created: {submission_file_path}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-02T07:09:04.652579Z","iopub.execute_input":"2024-11-02T07:09:04.653212Z","iopub.status.idle":"2024-11-02T07:09:04.751644Z","shell.execute_reply.started":"2024-11-02T07:09:04.653143Z","shell.execute_reply":"2024-11-02T07:09:04.750772Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}