{"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":10338,"databundleVersionId":862042,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport cv2\nimport pydicom\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report\nimport tensorflow as tf\nfrom sklearn.utils import class_weight\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, AveragePooling2D\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:11:53.843063Z","iopub.execute_input":"2025-05-22T01:11:53.843433Z","iopub.status.idle":"2025-05-22T01:11:53.849844Z","shell.execute_reply.started":"2025-05-22T01:11:53.843408Z","shell.execute_reply":"2025-05-22T01:11:53.848987Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 📌 2. Veri Yükleme Fonksiyonu\ndef load_data(data_dir, labels_csv, img_size=32, max_images=5000):\n    labels_df = pd.read_csv(labels_csv)\n    labels_df = labels_df.drop_duplicates(subset='patientId')\n    images = []\n    labels = []\n    \n    for index, row in labels_df.iterrows():\n        dicom_path = os.path.join(data_dir, row['patientId'] + '.dcm')\n        if not os.path.exists(dicom_path):\n            continue\n        dicom = pydicom.dcmread(dicom_path)\n        img = dicom.pixel_array\n        img = cv2.resize(img, (img_size, img_size))\n        img = img / 255.0  \n        images.append(img)\n        labels.append(1 if row['Target'] == 1 else 0)\n        if len(images) >= max_images:\n            break\n    \n    images = np.array(images).reshape(-1, img_size, img_size, 1)\n    labels = np.array(labels)\n    return images, labels","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:11:53.85543Z","iopub.execute_input":"2025-05-22T01:11:53.855772Z","iopub.status.idle":"2025-05-22T01:11:53.877977Z","shell.execute_reply.started":"2025-05-22T01:11:53.855743Z","shell.execute_reply":"2025-05-22T01:11:53.876875Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kaggle İçin Dosya Yolları\ndata_dir = \"/kaggle/input/rsna-pneumonia-detection-challenge/stage_2_train_images\"\nlabels_csv = \"/kaggle/input/rsna-pneumonia-detection-challenge/stage_2_train_labels.csv\"\nX, y = load_data(data_dir, labels_csv, img_size=32, max_images=5000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:11:53.879601Z","iopub.execute_input":"2025-05-22T01:11:53.879867Z","iopub.status.idle":"2025-05-22T01:12:34.791564Z","shell.execute_reply.started":"2025-05-22T01:11:53.879848Z","shell.execute_reply":"2025-05-22T01:12:34.790418Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Veri setinde sınıf dağılımı\nunique, counts = np.unique(y, return_counts=True)\nfor cls, count in zip(unique, counts):\n    print(f\"Sınıf {cls}: {count} örnek\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:34.793023Z","iopub.execute_input":"2025-05-22T01:12:34.793616Z","iopub.status.idle":"2025-05-22T01:12:34.800151Z","shell.execute_reply.started":"2025-05-22T01:12:34.793589Z","shell.execute_reply":"2025-05-22T01:12:34.798959Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(4, 4))\nsns.countplot(x=y)\nplt.title(\"Sınıf Dağılımı (0: Normal, 1: Pnömoni)\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:34.801101Z","iopub.execute_input":"2025-05-22T01:12:34.801386Z","iopub.status.idle":"2025-05-22T01:12:34.961169Z","shell.execute_reply.started":"2025-05-22T01:12:34.801364Z","shell.execute_reply":"2025-05-22T01:12:34.960294Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Veri Setlerini Böl\nX_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.20, stratify=y, random_state=42)\nX_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, stratify=y_temp, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:34.96319Z","iopub.execute_input":"2025-05-22T01:12:34.96349Z","iopub.status.idle":"2025-05-22T01:12:34.994941Z","shell.execute_reply.started":"2025-05-22T01:12:34.963466Z","shell.execute_reply":"2025-05-22T01:12:34.994151Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# class_weight\nclass_weights = class_weight.compute_class_weight('balanced', classes=np.unique(y_train), y=y_train)\nclass_weights = dict(enumerate(class_weights))\nprint(\"Class Weights:\", class_weights)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:34.996147Z","iopub.execute_input":"2025-05-22T01:12:34.996436Z","iopub.status.idle":"2025-05-22T01:12:35.004496Z","shell.execute_reply.started":"2025-05-22T01:12:34.996412Z","shell.execute_reply":"2025-05-22T01:12:35.002986Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# EarlyStopping\nearly_stop = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:35.005726Z","iopub.execute_input":"2025-05-22T01:12:35.005978Z","iopub.status.idle":"2025-05-22T01:12:35.022598Z","shell.execute_reply.started":"2025-05-22T01:12:35.005959Z","shell.execute_reply":"2025-05-22T01:12:35.021187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_classic_lenet5():\n    model = models.Sequential([\n        layers.Input(shape=(32, 32, 1)),\n        layers.Conv2D(6, kernel_size=(5, 5), activation='tanh'),\n        AveragePooling2D(pool_size=(2, 2)),\n        \n        layers.Conv2D(16, kernel_size=(5, 5), activation='tanh'),\n        AveragePooling2D(pool_size=(2, 2)),\n        \n        layers.Flatten(),\n        layers.Dense(120, activation='tanh'),\n        layers.Dense(84, activation='tanh'),\n        layers.Dense(1, activation='sigmoid')  \n    ])\n    return model\n\nmodel = build_classic_lenet5()\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:35.023984Z","iopub.execute_input":"2025-05-22T01:12:35.024389Z","iopub.status.idle":"2025-05-22T01:12:35.101323Z","shell.execute_reply.started":"2025-05-22T01:12:35.024355Z","shell.execute_reply":"2025-05-22T01:12:35.100213Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Model Eğitimi\nhistory = model.fit(\n    X_train, y_train,\n    validation_data=(X_val, y_val),\n    epochs=15,\n    batch_size=32,\n    class_weight=class_weights,\n    callbacks=[early_stop]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:35.102331Z","iopub.execute_input":"2025-05-22T01:12:35.102612Z","iopub.status.idle":"2025-05-22T01:12:45.404267Z","shell.execute_reply.started":"2025-05-22T01:12:35.102581Z","shell.execute_reply":"2025-05-22T01:12:45.403267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Eğitim Sonuçları\nplt.figure(figsize=(10,4))\nplt.subplot(1,2,1)\nplt.plot(history.history['accuracy'], label='Train Acc')\nplt.plot(history.history['val_accuracy'], label='Val Acc')\nplt.legend()\nplt.title(\"Accuracy\")\n\nplt.subplot(1,2,2)\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Val Loss')\nplt.legend()\nplt.title(\"Loss\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:45.405884Z","iopub.execute_input":"2025-05-22T01:12:45.406266Z","iopub.status.idle":"2025-05-22T01:12:45.748397Z","shell.execute_reply.started":"2025-05-22T01:12:45.406239Z","shell.execute_reply":"2025-05-22T01:12:45.747328Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Test Setinde Tahmin ve Metrikler\ny_pred = (model.predict(X_test) > 0.5).astype(int)\n\ncm = confusion_matrix(y_test, y_pred)\naccuracy = accuracy_score(y_test, y_pred)\nprecision = precision_score(y_test, y_pred)\nsensitivity = recall_score(y_test, y_pred)\nspecificity = cm[0,0] / (cm[0,0] + cm[0,1])\nf1 = f1_score(y_test, y_pred)\n\nmetrics_df = pd.DataFrame({\n    \"Metric\": [\"Accuracy\", \"Precision\", \"Sensitivity\", \"Specificity\", \"F1 Score\"],\n    \"Value\": [accuracy, precision, sensitivity, specificity, f1]\n})\nprint(metrics_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:45.750717Z","iopub.execute_input":"2025-05-22T01:12:45.750977Z","iopub.status.idle":"2025-05-22T01:12:46.208209Z","shell.execute_reply.started":"2025-05-22T01:12:45.750959Z","shell.execute_reply":"2025-05-22T01:12:46.207076Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Confusion Matrix\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues')\nplt.title(\"Confusion Matrix\")\nplt.xlabel(\"Predicted\")\nplt.ylabel(\"Actual\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:46.209071Z","iopub.execute_input":"2025-05-22T01:12:46.209334Z","iopub.status.idle":"2025-05-22T01:12:46.426989Z","shell.execute_reply.started":"2025-05-22T01:12:46.209315Z","shell.execute_reply":"2025-05-22T01:12:46.425999Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# SGD ile Farklı Learning Rate Denemeleri\nfrom tensorflow.keras.optimizers import SGD\n\nlearning_rates = [0.1, 0.001, 0.0001, 0.00001]\nhistories = {}\n\nfor lr in learning_rates:\n    print(f\"\\n🔧 Training with learning rate = {lr}\")\n    \n    model = build_classic_lenet5()\n    optimizer = SGD(learning_rate=lr)\n    model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])\n    \n    history = model.fit(\n        X_train, y_train,\n        validation_data=(X_val, y_val),\n        epochs=15,\n        batch_size=32,\n        class_weight=class_weights,\n        callbacks=[early_stop],\n        verbose=0  # Eğitim loglarını kapatmak için\n    )\n    \n    histories[lr] = history\n\n\nplt.figure(figsize=(14, 6))\n\nfor i, lr in enumerate(learning_rates):\n    history = histories[lr]\n    plt.subplot(2, 4, i+1)\n    plt.plot(history.history['accuracy'], label='Train Acc')\n    plt.plot(history.history['val_accuracy'], label='Val Acc')\n    plt.title(f\"LR={lr}\")\n    plt.legend()\n    \n    plt.subplot(2, 4, i+5)\n    plt.plot(history.history['loss'], label='Train Loss')\n    plt.plot(history.history['val_loss'], label='Val Loss')\n    plt.title(f\"LR={lr}\")\n    plt.legend()\n\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-22T01:12:46.428106Z","iopub.execute_input":"2025-05-22T01:12:46.428401Z","iopub.status.idle":"2025-05-22T01:13:53.857103Z","shell.execute_reply.started":"2025-05-22T01:12:46.428379Z","shell.execute_reply":"2025-05-22T01:13:53.856074Z"}},"outputs":[],"execution_count":null}]}