{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\nimport pyarrow.parquet as pq\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nimport os\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:30:17.850257Z","iopub.execute_input":"2024-12-27T16:30:17.850544Z","iopub.status.idle":"2024-12-27T16:30:17.855029Z","shell.execute_reply.started":"2024-12-27T16:30:17.850522Z","shell.execute_reply":"2024-12-27T16:30:17.854228Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"torch.manual_seed(42)\nnp.random.seed(42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:30:18.051577Z","iopub.execute_input":"2024-12-27T16:30:18.051839Z","iopub.status.idle":"2024-12-27T16:30:18.064473Z","shell.execute_reply.started":"2024-12-27T16:30:18.051819Z","shell.execute_reply":"2024-12-27T16:30:18.063837Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_metadata = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/train.csv')\ntrain_eegs_dir = '/kaggle/input/hms-harmful-brain-activity-classification/train_eegs'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:47.183502Z","iopub.execute_input":"2024-12-27T16:15:47.183866Z","iopub.status.idle":"2024-12-27T16:15:47.419905Z","shell.execute_reply.started":"2024-12-27T16:15:47.183835Z","shell.execute_reply":"2024-12-27T16:15:47.418954Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_eeg_data(file_list, max_files=5):\n    all_data = []\n    for file in file_list[:max_files]:\n        file_path = os.path.join(train_eegs_dir, file)\n        eeg_data = pq.read_table(file_path).to_pandas()\n        all_data.append(eeg_data)\n    return pd.concat(all_data, axis=0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:47.459409Z","iopub.execute_input":"2024-12-27T16:15:47.459670Z","iopub.status.idle":"2024-12-27T16:15:47.464107Z","shell.execute_reply.started":"2024-12-27T16:15:47.459652Z","shell.execute_reply":"2024-12-27T16:15:47.463190Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"parquet_files = [f for f in os.listdir(train_eegs_dir) if f.endswith('.parquet')]\ntrain_eeg = load_eeg_data(parquet_files)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:47.716127Z","iopub.execute_input":"2024-12-27T16:15:47.716524Z","iopub.status.idle":"2024-12-27T16:15:48.310909Z","shell.execute_reply.started":"2024-12-27T16:15:47.716492Z","shell.execute_reply":"2024-12-27T16:15:48.310039Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seizure_samples = train_metadata[train_metadata['seizure_vote'] > 0].head(500)\nnormal_samples = train_metadata[train_metadata['seizure_vote'] == 0].head(500)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:48.312104Z","iopub.execute_input":"2024-12-27T16:15:48.312475Z","iopub.status.idle":"2024-12-27T16:15:48.332505Z","shell.execute_reply.started":"2024-12-27T16:15:48.312438Z","shell.execute_reply":"2024-12-27T16:15:48.331686Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def extract_segment(eeg_data, offset, duration=10):\n    start_idx = int(offset * 200)\n    end_idx = start_idx + (duration * 200)\n    return eeg_data.iloc[start_idx:end_idx].values if end_idx <= len(eeg_data) else None","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:48.334013Z","iopub.execute_input":"2024-12-27T16:15:48.334430Z","iopub.status.idle":"2024-12-27T16:15:48.338345Z","shell.execute_reply.started":"2024-12-27T16:15:48.334405Z","shell.execute_reply":"2024-12-27T16:15:48.337473Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seizure_segments = []\nnormal_segments = []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:57.504799Z","iopub.execute_input":"2024-12-27T16:15:57.505075Z","iopub.status.idle":"2024-12-27T16:15:57.508429Z","shell.execute_reply.started":"2024-12-27T16:15:57.505055Z","shell.execute_reply":"2024-12-27T16:15:57.507678Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for _, row in seizure_samples.iterrows():\n    segment = extract_segment(train_eeg, row['eeg_label_offset_seconds'])\n    if segment is not None:\n        seizure_segments.append(segment)\n\nfor _, row in normal_samples.iterrows():\n    segment = extract_segment(train_eeg, row['eeg_label_offset_seconds'])\n    if segment is not None:\n        normal_segments.append(segment)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:15:58.202357Z","iopub.execute_input":"2024-12-27T16:15:58.202647Z","iopub.status.idle":"2024-12-27T16:15:58.296596Z","shell.execute_reply.started":"2024-12-27T16:15:58.202626Z","shell.execute_reply":"2024-12-27T16:15:58.295789Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seizure_segments = np.array(seizure_segments[:400])  # Limit for memory\nnormal_segments = np.array(normal_segments[:400])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:02.699914Z","iopub.execute_input":"2024-12-27T16:16:02.700267Z","iopub.status.idle":"2024-12-27T16:16:02.755413Z","shell.execute_reply.started":"2024-12-27T16:16:02.700238Z","shell.execute_reply":"2024-12-27T16:16:02.754658Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scaler = StandardScaler()\nseizure_segments_scaled = scaler.fit_transform(seizure_segments.reshape(-1, seizure_segments.shape[-1])).reshape(seizure_segments.shape)\nnormal_segments_scaled = scaler.transform(normal_segments.reshape(-1, normal_segments.shape[-1])).reshape(normal_segments.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:07.016709Z","iopub.execute_input":"2024-12-27T16:16:07.016976Z","iopub.status.idle":"2024-12-27T16:16:07.400858Z","shell.execute_reply.started":"2024-12-27T16:16:07.016956Z","shell.execute_reply":"2024-12-27T16:16:07.400072Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seizure_tensors = torch.FloatTensor(seizure_segments_scaled)\nnormal_tensors = torch.FloatTensor(normal_segments_scaled)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:07.401879Z","iopub.execute_input":"2024-12-27T16:16:07.402118Z","iopub.status.idle":"2024-12-27T16:16:07.430683Z","shell.execute_reply.started":"2024-12-27T16:16:07.402097Z","shell.execute_reply":"2024-12-27T16:16:07.429912Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Generator(nn.Module):\n    def __init__(self, latent_dim, output_dim):\n        super().__init__()\n        self.model = nn.Sequential(\n            nn.Linear(latent_dim, 256),\n            nn.LeakyReLU(0.2),\n            nn.BatchNorm1d(256),\n            nn.Dropout(0.4),  # Increased dropout\n            nn.Linear(256, 512),\n            nn.LeakyReLU(0.2),\n            nn.BatchNorm1d(512),\n            nn.Dropout(0.4),  # Increased dropout\n            nn.Linear(512, output_dim),\n            nn.Tanh()\n        )\n    \n    def forward(self, z):\n        return self.model(z)\n\nclass Discriminator(nn.Module):\n    def __init__(self, input_dim):\n        super().__init__()\n        self.model = nn.Sequential(\n            nn.Linear(input_dim, 512),\n            nn.LeakyReLU(0.2),\n            nn.Dropout(0.4),  # Increased dropout\n            nn.Linear(512, 256),\n            nn.LeakyReLU(0.2),\n            nn.Dropout(0.4),  # Increased dropout\n            nn.Linear(256, 1),\n            nn.Sigmoid()\n        )\n    \n    def forward(self, x):\n        return self.model(x)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:11.110657Z","iopub.execute_input":"2024-12-27T16:16:11.110928Z","iopub.status.idle":"2024-12-27T16:16:11.117062Z","shell.execute_reply.started":"2024-12-27T16:16:11.110908Z","shell.execute_reply":"2024-12-27T16:16:11.116109Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"latent_dim = 100\noutput_dim = seizure_segments.shape[1] * seizure_segments.shape[2]\ngenerator = Generator(latent_dim, output_dim)\ndiscriminator = Discriminator(output_dim)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:11.861386Z","iopub.execute_input":"2024-12-27T16:16:11.861674Z","iopub.status.idle":"2024-12-27T16:16:12.275260Z","shell.execute_reply.started":"2024-12-27T16:16:11.861650Z","shell.execute_reply":"2024-12-27T16:16:12.274385Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch_size = 32\nnum_epochs = 50\ng_optimizer = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))\nd_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))\ncriterion = nn.BCELoss()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:15.738973Z","iopub.execute_input":"2024-12-27T16:16:15.739310Z","iopub.status.idle":"2024-12-27T16:16:16.899745Z","shell.execute_reply.started":"2024-12-27T16:16:15.739281Z","shell.execute_reply":"2024-12-27T16:16:16.898845Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for epoch in range(num_epochs):\n    torch.cuda.empty_cache() if torch.cuda.is_available() else None\n    \n    real_data = seizure_tensors.reshape(-1, output_dim)\n    indices = torch.randperm(len(real_data))\n    \n    d_losses = []\n    g_losses = []\n    \n    for i in range(0, len(real_data) - batch_size, batch_size):\n        # Get real batch\n        idx = indices[i:i+batch_size]\n        real_batch = real_data[idx]\n        current_batch_size = len(real_batch)\n        \n        # Generate fake data\n        z = torch.randn(current_batch_size, latent_dim)\n        fake_batch = generator(z)\n        \n        # Labels for current batch size\n        real_labels = torch.ones(current_batch_size, 1)\n        fake_labels = torch.zeros(current_batch_size, 1)\n        \n        # Train discriminator\n        d_optimizer.zero_grad()\n        d_real_loss = criterion(discriminator(real_batch), real_labels)\n        d_fake_loss = criterion(discriminator(fake_batch.detach()), fake_labels)\n        d_loss = (d_real_loss + d_fake_loss) / 2\n        d_loss.backward()\n        d_optimizer.step()\n        \n        # Train generator\n        g_optimizer.zero_grad()\n        g_loss = criterion(discriminator(fake_batch), real_labels)\n        g_loss.backward()\n        g_optimizer.step()\n        \n        d_losses.append(d_loss.item())\n        g_losses.append(g_loss.item())\n    \n    if (epoch + 1) % 10 == 0:\n        print(f'Epoch [{epoch+1}/{num_epochs}], d_loss: {np.mean(d_losses):.4f}, g_loss: {np.mean(g_losses):.4f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:16:17.712647Z","iopub.execute_input":"2024-12-27T16:16:17.713080Z","iopub.status.idle":"2024-12-27T16:22:28.961274Z","shell.execute_reply.started":"2024-12-27T16:16:17.713054Z","shell.execute_reply":"2024-12-27T16:22:28.960189Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_synthetic = 400  # Match real data size\nz = torch.randn(num_synthetic, latent_dim)\nsynthetic_seizures = generator(z).detach().numpy().reshape(num_synthetic, seizure_segments.shape[1], -1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:22:46.945637Z","iopub.execute_input":"2024-12-27T16:22:46.945948Z","iopub.status.idle":"2024-12-27T16:22:47.086839Z","shell.execute_reply.started":"2024-12-27T16:22:46.945922Z","shell.execute_reply":"2024-12-27T16:22:47.085803Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"real_sample = seizure_segments_scaled[0]  # First real seizure sample\nsynthetic_sample = synthetic_seizures[0]   # First generated sample\n\n# Create figure with subplots\nplt.figure(figsize=(15, 10))\n\n# Plot real data\nplt.subplot(2, 1, 1)\nplt.plot(real_sample)\nplt.title('Real Seizure EEG Data')\nplt.xlabel('Time Steps')\nplt.ylabel('Amplitude')\n\n# Plot generated data\nplt.subplot(2, 1, 2)\nplt.plot(synthetic_sample)\nplt.title('Generated Seizure EEG Data')\nplt.xlabel('Time Steps')\nplt.ylabel('Amplitude')\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:22:50.273033Z","iopub.execute_input":"2024-12-27T16:22:50.273381Z","iopub.status.idle":"2024-12-27T16:22:51.799531Z","shell.execute_reply.started":"2024-12-27T16:22:50.273351Z","shell.execute_reply":"2024-12-27T16:22:51.798693Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = np.concatenate([synthetic_seizures, normal_segments_scaled])\ny = np.concatenate([np.ones(len(synthetic_seizures)), np.zeros(len(normal_segments_scaled))])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:22:59.580816Z","iopub.execute_input":"2024-12-27T16:22:59.581128Z","iopub.status.idle":"2024-12-27T16:22:59.629242Z","shell.execute_reply.started":"2024-12-27T16:22:59.581099Z","shell.execute_reply":"2024-12-27T16:22:59.628309Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:23:00.484984Z","iopub.execute_input":"2024-12-27T16:23:00.485294Z","iopub.status.idle":"2024-12-27T16:23:00.535580Z","shell.execute_reply.started":"2024-12-27T16:23:00.485268Z","shell.execute_reply":"2024-12-27T16:23:00.534649Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Classifier(nn.Module):\n    def __init__(self, input_dim):\n        super().__init__()\n        self.model = nn.Sequential(\n            nn.Linear(input_dim, 256),\n            nn.ReLU(),\n            nn.Dropout(0.4),  # Increased dropout\n            nn.Linear(256, 128),\n            nn.ReLU(),\n            nn.Dropout(0.4),  # Increased dropout\n            nn.Linear(128, 1),\n            nn.Sigmoid()\n        )\n    \n    def forward(self, x):\n        return self.model(x)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:23:01.845021Z","iopub.execute_input":"2024-12-27T16:23:01.845337Z","iopub.status.idle":"2024-12-27T16:23:01.849934Z","shell.execute_reply.started":"2024-12-27T16:23:01.845311Z","shell.execute_reply":"2024-12-27T16:23:01.849166Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"classifier = Classifier(output_dim)\nclassifier_optimizer = optim.Adam(classifier.parameters(), lr=0.001, weight_decay=1e-4)  # Added weight decay\ncriterion = nn.BCELoss()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:23:04.521052Z","iopub.execute_input":"2024-12-27T16:23:04.521412Z","iopub.status.idle":"2024-12-27T16:23:04.611464Z","shell.execute_reply.started":"2024-12-27T16:23:04.521385Z","shell.execute_reply":"2024-12-27T16:23:04.610572Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Early stopping\nbest_loss = float('inf')\nstopping_patience = 5\nstopping_counter = 0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:23:07.012373Z","iopub.execute_input":"2024-12-27T16:23:07.012660Z","iopub.status.idle":"2024-12-27T16:23:07.016397Z","shell.execute_reply.started":"2024-12-27T16:23:07.012639Z","shell.execute_reply":"2024-12-27T16:23:07.015549Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for epoch in range(30):\n    torch.cuda.empty_cache() if torch.cuda.is_available() else None\n    \n    X_train_tensor = torch.FloatTensor(X_train.reshape(-1, output_dim))\n    y_train_tensor = torch.FloatTensor(y_train).reshape(-1, 1)\n    \n    classifier_optimizer.zero_grad()\n    outputs = classifier(X_train_tensor)\n    loss = criterion(outputs, y_train_tensor)\n    loss.backward()\n    classifier_optimizer.step()\n\n    # Validation loss\n    X_test_tensor = torch.FloatTensor(X_test.reshape(-1, output_dim))\n    y_test_tensor = torch.FloatTensor(y_test).reshape(-1, 1)\n    with torch.no_grad():\n        val_outputs = classifier(X_test_tensor)\n        val_loss = criterion(val_outputs, y_test_tensor).item()\n\n    print(f'Classifier Epoch [{epoch+1}/30], Loss: {loss.item():.4f}, Validation Loss: {val_loss:.4f}')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:30:03.013044Z","iopub.execute_input":"2024-12-27T16:30:03.013407Z","iopub.status.idle":"2024-12-27T16:30:11.660013Z","shell.execute_reply.started":"2024-12-27T16:30:03.013366Z","shell.execute_reply":"2024-12-27T16:30:11.659225Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"classifier.eval()\nX_test_tensor = torch.FloatTensor(X_test.reshape(-1, output_dim))\nwith torch.no_grad():\n    y_pred = classifier(X_test_tensor).numpy()\ny_pred_classes = (y_pred > 0.5).astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:30:11.661094Z","iopub.execute_input":"2024-12-27T16:30:11.661350Z","iopub.status.idle":"2024-12-27T16:30:11.694614Z","shell.execute_reply.started":"2024-12-27T16:30:11.661330Z","shell.execute_reply":"2024-12-27T16:30:11.693966Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\nClassification Report:\")\nprint(classification_report(y_test, y_pred_classes))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:30:11.695725Z","iopub.execute_input":"2024-12-27T16:30:11.696003Z","iopub.status.idle":"2024-12-27T16:30:11.708911Z","shell.execute_reply.started":"2024-12-27T16:30:11.695983Z","shell.execute_reply":"2024-12-27T16:30:11.708076Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"real_mean = np.mean(seizure_segments_scaled, axis=0)\nsynthetic_mean = np.mean(synthetic_seizures, axis=0)\nmse = np.mean((real_mean - synthetic_mean) ** 2)\nprint(f\"\\nMSE between real and synthetic data: {mse:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T16:30:11.710166Z","iopub.execute_input":"2024-12-27T16:30:11.710452Z","iopub.status.idle":"2024-12-27T16:30:11.727166Z","shell.execute_reply.started":"2024-12-27T16:30:11.710431Z","shell.execute_reply":"2024-12-27T16:30:11.726306Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}