{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\n\nprint(os.listdir('/kaggle/input'))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:06:14.202782Z","iopub.execute_input":"2026-06-22T13:06:14.203381Z","iopub.status.idle":"2026-06-22T13:06:14.212175Z","shell.execute_reply.started":"2026-06-22T13:06:14.203334Z","shell.execute_reply":"2026-06-22T13:06:14.211294Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for root, dirs, files in os.walk('/kaggle/input'):\n    print(root)\n    print(\"Number of files:\", len(files))\n    print(\"-\"*50)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:06:31.808914Z","iopub.execute_input":"2026-06-22T13:06:31.809791Z","iopub.status.idle":"2026-06-22T13:10:31.821450Z","shell.execute_reply.started":"2026-06-22T13:06:31.809746Z","shell.execute_reply":"2026-06-22T13:10:31.820522Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\ntrain_csv = \"/kaggle/input/competitions/siim-isic-melanoma-classification/train.csv\"\n\ndf = pd.read_csv(train_csv)\n\nprint(df.head())\nprint(\"\\nShape:\", df.shape)\nprint(\"\\nColumns:\")\nprint(df.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:10:36.742666Z","iopub.execute_input":"2026-06-22T13:10:36.744040Z","iopub.status.idle":"2026-06-22T13:10:37.251622Z","shell.execute_reply.started":"2026-06-22T13:10:36.744000Z","shell.execute_reply":"2026-06-22T13:10:37.250562Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(df['target'].value_counts())\n\nimport matplotlib.pyplot as plt\n\ndf['target'].value_counts().plot(kind='bar')\n\nplt.title(\"Melanoma vs Benign\")\nplt.xlabel(\"Class\")\nplt.ylabel(\"Count\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:11:00.907368Z","iopub.execute_input":"2026-06-22T13:11:00.908220Z","iopub.status.idle":"2026-06-22T13:11:01.199494Z","shell.execute_reply.started":"2026-06-22T13:11:00.908150Z","shell.execute_reply":"2026-06-22T13:11:01.197946Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport os\n\nimg_folder = \"/kaggle/input/competitions/siim-isic-melanoma-classification/jpeg/train\"\n\nfor i in range(6):\n\n    img_name = df.iloc[i]['image_name'] + \".jpg\"\n\n    img_path = os.path.join(img_folder, img_name)\n\n    img = mpimg.imread(img_path)\n\n    plt.figure(figsize=(4,4))\n    plt.imshow(img)\n    plt.title(f\"Target: {df.iloc[i]['target']}\")\n    plt.axis(\"off\")\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:11:20.958916Z","iopub.execute_input":"2026-06-22T13:11:20.959411Z","iopub.status.idle":"2026-06-22T13:11:27.304169Z","shell.execute_reply.started":"2026-06-22T13:11:20.959351Z","shell.execute_reply":"2026-06-22T13:11:27.303166Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(df['target'].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:11:38.633586Z","iopub.execute_input":"2026-06-22T13:11:38.634244Z","iopub.status.idle":"2026-06-22T13:11:38.641742Z","shell.execute_reply.started":"2026-06-22T13:11:38.634204Z","shell.execute_reply":"2026-06-22T13:11:38.640463Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"melanoma_df = df[df['target'] == 1]\n\nprint(\"Number of melanoma images:\", len(melanoma_df))\n\nmelanoma_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:11:49.158803Z","iopub.execute_input":"2026-06-22T13:11:49.159504Z","iopub.status.idle":"2026-06-22T13:11:49.189314Z","shell.execute_reply.started":"2026-06-22T13:11:49.159465Z","shell.execute_reply":"2026-06-22T13:11:49.188142Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport os\n\nimg_folder = \"/kaggle/input/competitions/siim-isic-melanoma-classification/jpeg/train\"\n\nfor i in range(6):\n\n    img_name = melanoma_df.iloc[i]['image_name'] + \".jpg\"\n\n    img_path = os.path.join(img_folder, img_name)\n\n    img = mpimg.imread(img_path)\n\n    plt.figure(figsize=(4,4))\n    plt.imshow(img)\n    plt.title(\"Melanoma (Target = 1)\")\n    plt.axis(\"off\")\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:12:14.412588Z","iopub.execute_input":"2026-06-22T13:12:14.413997Z","iopub.status.idle":"2026-06-22T13:12:21.118283Z","shell.execute_reply.started":"2026-06-22T13:12:14.413861Z","shell.execute_reply":"2026-06-22T13:12:21.117071Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(df['target'].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:12:28.992203Z","iopub.execute_input":"2026-06-22T13:12:28.993210Z","iopub.status.idle":"2026-06-22T13:12:29.000205Z","shell.execute_reply.started":"2026-06-22T13:12:28.993169Z","shell.execute_reply":"2026-06-22T13:12:28.999047Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"benign_df = df[df['target'] == 0].sample(1000, random_state=42)\nmelanoma_df = df[df['target'] == 1]\n\nsmall_df = pd.concat([benign_df, melanoma_df])\n\nprint(\"Total images:\", len(small_df))\nprint(small_df['target'].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:12:41.033858Z","iopub.execute_input":"2026-06-22T13:12:41.034178Z","iopub.status.idle":"2026-06-22T13:12:41.055380Z","shell.execute_reply.started":"2026-06-22T13:12:41.034153Z","shell.execute_reply":"2026-06-22T13:12:41.054125Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import cv2\nimport numpy as np\nimport os\n\nIMG_SIZE = 128\n\nX = []\ny = []\n\nimg_folder = \"/kaggle/input/competitions/siim-isic-melanoma-classification/jpeg/train\"\n\nfor _, row in small_df.iterrows():\n\n    img_path = os.path.join(\n        img_folder,\n        row['image_name'] + \".jpg\"\n    )\n\n    img = cv2.imread(img_path)\n\n    if img is None:\n        continue\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n\n    img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n\n    X.append(img / 255.0)\n\n    y.append(row['target'])\n\nX = np.array(X, dtype=np.float32)\ny = np.array(y)\n\nprint(\"X shape:\", X.shape)\nprint(\"y shape:\", y.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:13:17.079238Z","iopub.execute_input":"2026-06-22T13:13:17.079567Z","iopub.status.idle":"2026-06-22T13:15:49.197082Z","shell.execute_reply.started":"2026-06-22T13:13:17.079538Z","shell.execute_reply":"2026-06-22T13:15:49.195753Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(\n    X,\n    y,\n    test_size=0.2,\n    random_state=42,\n    stratify=y\n)\n\nprint(\"Training samples:\", len(X_train))\nprint(\"Testing samples:\", len(X_test))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:17:28.631410Z","iopub.execute_input":"2026-06-22T13:17:28.631753Z","iopub.status.idle":"2026-06-22T13:17:29.833520Z","shell.execute_reply.started":"2026-06-22T13:17:28.631724Z","shell.execute_reply":"2026-06-22T13:17:29.832131Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D\nfrom tensorflow.keras.layers import Flatten, Dense, Dropout\n\nmodel = Sequential([\n    Conv2D(32, (3,3), activation='relu', input_shape=(128,128,3)),\n    MaxPooling2D(2,2),\n\n    Conv2D(64, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n\n    Conv2D(128, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n\n    Flatten(),\n\n    Dense(128, activation='relu'),\n\n    Dropout(0.5),\n\n    Dense(1, activation='sigmoid')\n\n])\n\nmodel.compile(\n    optimizer='adam',\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)\n\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:18:04.912185Z","iopub.execute_input":"2026-06-22T13:18:04.913286Z","iopub.status.idle":"2026-06-22T13:18:24.467686Z","shell.execute_reply.started":"2026-06-22T13:18:04.913240Z","shell.execute_reply":"2026-06-22T13:18:24.466199Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    X_train,\n    y_train,\n    validation_data=(X_test, y_test),\n    epochs=5,\n    batch_size=32\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:18:40.252011Z","iopub.execute_input":"2026-06-22T13:18:40.253827Z","iopub.status.idle":"2026-06-22T13:20:32.914070Z","shell.execute_reply.started":"2026-06-22T13:18:40.253784Z","shell.execute_reply":"2026-06-22T13:20:32.912796Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss, accuracy = model.evaluate(X_test, y_test)\n\nprint(\"Test Loss:\", loss)\nprint(\"Test Accuracy:\", accuracy)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:20:35.665273Z","iopub.execute_input":"2026-06-22T13:20:35.665612Z","iopub.status.idle":"2026-06-22T13:20:37.385303Z","shell.execute_reply.started":"2026-06-22T13:20:35.665584Z","shell.execute_reply":"2026-06-22T13:20:37.383846Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(8,5))\nplt.plot(history.history['accuracy'])\nplt.plot(history.history['val_accuracy'])\n\nplt.title(\"Model Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.legend([\"Train\",\"Validation\"])\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:20:40.505801Z","iopub.execute_input":"2026-06-22T13:20:40.506591Z","iopub.status.idle":"2026-06-22T13:20:40.983442Z","shell.execute_reply.started":"2026-06-22T13:20:40.506554Z","shell.execute_reply":"2026-06-22T13:20:40.982520Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"preds = model.predict(X_test)\n\npreds = (preds > 0.5).astype(int)\n\nprint(preds[:10])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:20:58.340615Z","iopub.execute_input":"2026-06-22T13:20:58.340998Z","iopub.status.idle":"2026-06-22T13:21:00.223269Z","shell.execute_reply.started":"2026-06-22T13:20:58.340951Z","shell.execute_reply":"2026-06-22T13:21:00.222308Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nfor i in range(6):\n\n    plt.figure(figsize=(4,4))\n\n    plt.imshow(X_test[i])\n\n    actual = \"Melanoma\" if y_test[i] == 1 else \"Benign\"\n    predicted = \"Melanoma\" if preds[i][0] == 1 else \"Benign\"\n\n    plt.title(\n        f\"Actual: {actual}\\nPredicted: {predicted}\"\n    )\n\n    plt.axis(\"off\")\n\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:21:20.860110Z","iopub.execute_input":"2026-06-22T13:21:20.860460Z","iopub.status.idle":"2026-06-22T13:21:21.654574Z","shell.execute_reply.started":"2026-06-22T13:21:20.860426Z","shell.execute_reply":"2026-06-22T13:21:21.653457Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Conclusion**\n\nA Convolutional Neural Network (CNN) was developed to classify skin lesion images into benign and melanoma categories.\n\nThe model was trained on the SIIM-ISIC Melanoma Classification dataset and successfully learned discriminative features from dermoscopic images.\n\nApplications:\n\nEarly melanoma screening\nClinical decision support\nAutomated skin lesion analysis\nFuture Work:\n\nEfficientNet/ResNet Transfer Learning\nMulti-class lesion classification\nExplainable AI using Grad-CAM, SHAP and LIME","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\ncm = confusion_matrix(y_test, preds)\n\nplt.figure(figsize=(6,5))\nsns.heatmap(\n    cm,\n    annot=True,\n    fmt='d',\n    cmap='Blues',\n    xticklabels=['Benign','Melanoma'],\n    yticklabels=['Benign','Melanoma']\n)\n\nplt.xlabel(\"Predicted\")\nplt.ylabel(\"Actual\")\nplt.title(\"Confusion Matrix\")\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-22T13:23:20.438364Z","iopub.execute_input":"2026-06-22T13:23:20.439935Z","iopub.status.idle":"2026-06-22T13:23:21.027493Z","shell.execute_reply.started":"2026-06-22T13:23:20.439880Z","shell.execute_reply":"2026-06-22T13:23:21.026364Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Results**\n\nTest Accuracy: 71.92%\n\nThe CNN model successfully classified skin lesion images into benign and melanoma categories.\n\nAlthough some misclassifications occurred, the model demonstrated the ability to learn discriminative features from dermoscopic images.\n\nFuture improvements may include:\n\nTransfer Learning (EfficientNet, ResNet50)\nData Augmentation\nClass Balancing Techniques\nExplainable AI methods","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}