{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":29653,"databundleVersionId":2420395,"sourceType":"competition"}],"dockerImageVersionId":31012,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q pydicom\n\n# ✅ Imports\nimport os\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport pydicom\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import f1_score, cohen_kappa_score, roc_auc_score, roc_curve, auc\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.applications import VGG19\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import EarlyStopping\n\n# ✅ Load MGMT labels\ntrain_path = '/kaggle/input/rsna-miccai-brain-tumor-radiogenomic-classification/train/'\nlabels_path = '/kaggle/input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv'\nlabels_df = pd.read_csv(labels_path)\n\n# ✅ Load one center slice per patient\ndef load_image(patient_id, img_size=(224, 224)):\n    folder = os.path.join(train_path, str(patient_id).zfill(5), \"T1w\")\n    if not os.path.exists(folder): return None\n    files = sorted(os.listdir(folder))\n    if not files: return None\n    path = os.path.join(folder, files[len(files)//2])\n    dcm = pydicom.dcmread(path)\n    img = dcm.pixel_array\n    img = cv2.resize(img, img_size)\n    return img / 255.0\n\nX, y = [], []\nfor _, row in labels_df.iterrows():\n    img = load_image(row['BraTS21ID'])\n    if img is not None:\n        X.append(img)\n        y.append(row['MGMT_value'])\n\nX = np.expand_dims(np.array(X), -1)      # (N, 224, 224, 1)\nX = np.repeat(X, 3, axis=-1)             # (N, 224, 224, 3) for VGG19\ny = np.array(y)\n\n# ✅ Train/val/test split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)\nX_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, stratify=y_train, random_state=42)\n\n# ✅ Data augmentation\naug = ImageDataGenerator(\n    rotation_range=15,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True\n)\naug.fit(X_train)\n\n# ✅ Build VGG19 model (from scratch)\nbase_model = VGG19(weights=None, include_top=False, input_shape=(224,224,3))\n\nmodel = models.Sequential([\n    base_model,\n    layers.GlobalAveragePooling2D(),\n    layers.Dense(256, activation='relu'),\n    layers.Dropout(0.5),\n    layers.Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer=tf.keras.optimizers.Adam(1e-4),\n              loss='binary_crossentropy',\n              metrics=['accuracy'])\n\n# ✅ Train model\nearly_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)\nhistory = model.fit(\n    aug.flow(X_train, y_train, batch_size=32),\n    validation_data=(X_val, y_val),\n    epochs=10,\n    callbacks=[early_stop]\n)\n\n# ✅ Evaluate\ntest_loss, test_acc = model.evaluate(X_test, y_test, verbose=0)\ny_pred_prob = model.predict(X_test)\ny_pred = (y_pred_prob > 0.5).astype(int)\n\ntrain_acc = history.history['accuracy'][-1]\nval_acc = history.history['val_accuracy'][-1]\nf1 = f1_score(y_test, y_pred)\nkappa = cohen_kappa_score(y_test, y_pred)\nroc_auc = roc_auc_score(y_test, y_pred_prob)\n\nprint(f\"Training Accuracy: {train_acc:.4f}\")\nprint(f\"Validation Accuracy: {val_acc:.4f}\")\nprint(f\"Test Accuracy: {test_acc:.4f}\")\nprint(f\"F1 Score: {f1:.4f}\")\nprint(f\"Cohen's Kappa: {kappa:.4f}\")\nprint(f\"AUC: {roc_auc:.4f}\")\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-30T11:38:48.611216Z","iopub.execute_input":"2025-04-30T11:38:48.611611Z","iopub.status.idle":"2025-04-30T12:37:01.944610Z","shell.execute_reply.started":"2025-04-30T11:38:48.611580Z","shell.execute_reply":"2025-04-30T12:37:01.943628Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ✅ Accuracy & Loss Plots\nplt.figure(figsize=(14, 5))\n\nplt.subplot(1, 2, 1)\nplt.plot(history.history['accuracy'], label='Train Acc')\nplt.plot(history.history['val_accuracy'], label='Val Acc')\nplt.title('Accuracy')\nplt.legend()\n\nplt.subplot(1, 2, 2)\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Val Loss')\nplt.title('Loss')\nplt.legend()\nplt.tight_layout()\nplt.show()\n\n# ✅ ROC Curve\nfpr, tpr, _ = roc_curve(y_test, y_pred_prob)\nroc_val = auc(fpr, tpr)\n\nplt.figure()\nplt.plot(fpr, tpr, label=f'ROC curve (AUC = {roc_val:.2f})')\nplt.plot([0, 1], [0, 1], 'k--')\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title('ROC Curve - VGG19')\nplt.legend()\nplt.show()\n\n# ✅ Sample MRI images\nplt.figure(figsize=(12, 8))\nfor i in range(9):\n    idx = np.random.randint(0, len(X_train))\n    plt.subplot(3, 3, i + 1)\n    plt.imshow(X_train[idx].squeeze(), cmap='gray')\n    plt.title(f\"Label: {y_train[idx]}\")\n    plt.axis('off')\nplt.suptitle(\"Sample MRI Slices (VGG19 Input)\")\nplt.tight_layout()\nplt.show()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-30T12:43:08.870939Z","iopub.execute_input":"2025-04-30T12:43:08.871264Z","iopub.status.idle":"2025-04-30T12:43:10.594376Z","shell.execute_reply.started":"2025-04-30T12:43:08.871236Z","shell.execute_reply":"2025-04-30T12:43:10.593453Z"}},"outputs":[],"execution_count":null}]}